Initial migration towards separate database logic

We're simply breaking apart logic here - the majority of models are not implemented. The upgrade to Flask-SQLAlchemy has not yet been tested on `server`.
This commit is contained in:
Spotlight 2024-07-22 13:20:40 -05:00
parent f478bd3fc5
commit ac44dc663b
No known key found for this signature in database
GPG Key ID: 874AA355B3209BDC
5 changed files with 43 additions and 13 deletions

View File

@ -39,13 +39,6 @@ def getPath(path):
return os.path.join(root, path)
def startDBTime(time, network):
with sqlite3.connect('sqlite/fcLibrary.db') as con:
cursor = con.cursor()
cursor.execute('DELETE FROM config WHERE network=' + str(network)) # doing this isn't the most intelegent of ideas but oh well (i hope you don't need to ever add another config :D)
cursor.execute('INSERT INTO config (BACKEND_UPTIME, NETWORK) VALUES (%s, %s)' % (time, network,))
con.commit()
try:
terminalSize = os.get_terminal_size(0).columns - 2
except OSError:

View File

@ -6,6 +6,9 @@ from nintendo.nex import backend, friends, settings, streams
from nintendo.nex import common
from enum import Enum
import anyio, time, sqlite3, sys, traceback, argparse
from database import start_db_time
sys.path.append('../')
from api.private import SERIAL_NUMBER, MAC_ADDRESS, DEVICE_CERT, DEVICE_NAME, REGION, LANGUAGE, NINTENDO_PID, PRETENDO_PID, PID_HMAC, NINTENDO_NEX_PASSWORD, PRETENDO_NEX_PASSWORD
from api import *
@ -200,9 +203,9 @@ if __name__ == '__main__':
args = parser.parse_args()
network = NetworkType[args.network.upper()]
startDBTime(begun, network)
start_db_time(begun, network)
anyio.run(main)
except (KeyboardInterrupt, Exception) as e:
if network is not None:
startDBTime(0, network)
start_db_time(0, network)
print(e)

31
server/database.py Normal file
View File

@ -0,0 +1,31 @@
import os
from sqlalchemy import create_engine, delete
from sqlalchemy.orm import DeclarativeBase, mapped_column, Mapped, Session
from sqlalchemy.types import Integer
import sys
sys.path.append('../')
from api.networks import NetworkType
class Base(DeclarativeBase):
pass
class Config(Base):
__tablename__ = "config"
network: Mapped[NetworkType] = mapped_column("network", Integer(), primary_key=True)
backend_uptime: Mapped[float] = mapped_column("BACKEND_UPTIME")
def start_db_time(time: float, network_type: NetworkType):
"""Updates the database to track the starting time for the specific backend."""
engine = create_engine('sqlite:///' + os.path.abspath('sqlite/fcLibrary.db'))
with Session(engine) as session:
# TODO: This should be an upsert, not a deletion and insertion.
session.execute(delete(Config).where(Config.network == network_type))
new_time = Config(network=network_type, backend_uptime=time)
session.add(new_time)
session.commit()

View File

@ -3,8 +3,8 @@ flask
nintendoclients>=2.1.0
flask-limiter<=2.9.2 # Until 3.0 fixes "multiple values for argument 'key_func'"
gevent
SQLAlchemy<1.4.46
Flask-SQLAlchemy # Using deprecated features, apparently
SQLAlchemy>=2.0
Flask-SQLAlchemy>=3.1
xmltodict
Pillow
pycryptodomex

View File

@ -5,6 +5,9 @@ from flask import Flask, make_response, request, redirect, render_template, send
from flask_limiter import Limiter
from flask_sqlalchemy import SQLAlchemy
import sqlite3, requests, sys, os, time, json, multiprocessing, datetime, xmltodict, pickle, secrets
from server.database import start_db_time
sys.path.append('../')
from api import *
from api.love2 import *
@ -26,8 +29,8 @@ version = 0.31
agent = '3DS-RPC/'
startTime = time.time() # Frontend
startDBTime(0, 0)
startDBTime(0, 1)
start_db_time(0, NetworkType.NINTENDO)
start_db_time(0, NetworkType.PRETENDO)
startTime2Nintendo = 0 # Nintendo Backend
startTime2Pretendo = 0 # Pretendo Backend