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) 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: try:
terminalSize = os.get_terminal_size(0).columns - 2 terminalSize = os.get_terminal_size(0).columns - 2
except OSError: except OSError:

View File

@ -6,6 +6,9 @@ from nintendo.nex import backend, friends, settings, streams
from nintendo.nex import common from nintendo.nex import common
from enum import Enum from enum import Enum
import anyio, time, sqlite3, sys, traceback, argparse import anyio, time, sqlite3, sys, traceback, argparse
from database import start_db_time
sys.path.append('../') 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.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 * from api import *
@ -200,9 +203,9 @@ if __name__ == '__main__':
args = parser.parse_args() args = parser.parse_args()
network = NetworkType[args.network.upper()] network = NetworkType[args.network.upper()]
startDBTime(begun, network) start_db_time(begun, network)
anyio.run(main) anyio.run(main)
except (KeyboardInterrupt, Exception) as e: except (KeyboardInterrupt, Exception) as e:
if network is not None: if network is not None:
startDBTime(0, network) start_db_time(0, network)
print(e) 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 nintendoclients>=2.1.0
flask-limiter<=2.9.2 # Until 3.0 fixes "multiple values for argument 'key_func'" flask-limiter<=2.9.2 # Until 3.0 fixes "multiple values for argument 'key_func'"
gevent gevent
SQLAlchemy<1.4.46 SQLAlchemy>=2.0
Flask-SQLAlchemy # Using deprecated features, apparently Flask-SQLAlchemy>=3.1
xmltodict xmltodict
Pillow Pillow
pycryptodomex 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_limiter import Limiter
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
import sqlite3, requests, sys, os, time, json, multiprocessing, datetime, xmltodict, pickle, secrets import sqlite3, requests, sys, os, time, json, multiprocessing, datetime, xmltodict, pickle, secrets
from server.database import start_db_time
sys.path.append('../') sys.path.append('../')
from api import * from api import *
from api.love2 import * from api.love2 import *
@ -26,8 +29,8 @@ version = 0.31
agent = '3DS-RPC/' agent = '3DS-RPC/'
startTime = time.time() # Frontend startTime = time.time() # Frontend
startDBTime(0, 0) start_db_time(0, NetworkType.NINTENDO)
startDBTime(0, 1) start_db_time(0, NetworkType.PRETENDO)
startTime2Nintendo = 0 # Nintendo Backend startTime2Nintendo = 0 # Nintendo Backend
startTime2Pretendo = 0 # Pretendo Backend startTime2Pretendo = 0 # Pretendo Backend