KF-MMO-Server/Database/dbcontroller.ts

79 lines
2.3 KiB
TypeScript

import sqlite3 from 'sqlite3'
import { open, Database } from 'sqlite'
export class DatabaseController {
private db: Database;
private constructor(db: Database) {
this.db = db;
}
static async create(filename = ':memory:'): Promise<DatabaseController> {
const db = await open({
filename,
driver: sqlite3.Database
});
let dbController = new DatabaseController(db);
dbController.basicSetup()
return dbController;
}
async basicSetup(){
await this.db.run(`CREATE TABLE IF NOT EXISTS characters (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL UNIQUE,
level INTEGER DEFAULT 0,
inventory TEXT,
questBook TEXT
);`)
await this.db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
login TEXT NOT NULL UNIQUE,
password TEXT NOT NULL
);`)
}
async select<T = any>(sql: string, params?: any[]): Promise<T[]> {
const rows: unknown = await this.db.all(sql, params);
return Array.isArray(rows) ? (rows as T[]) : [];
}
async get<T = any>(sql: string, params?: any[]): Promise<T | undefined> {
return this.db.get<T>(sql, params);
}
async run(sql: string, params?: any[]): Promise<void> {
await this.db.run(sql, params);
}
async close(): Promise<void> {
await this.db.close();
}
}
// Usage example (you can put this in another file):
// import { DatabaseController } from './db/DatabaseController';
// (async () => {
// const db = await DatabaseController.create('mydb.sqlite3');
// await db.run(`CREATE TABLE IF NOT EXISTS players (
// id INTEGER PRIMARY KEY,
// level INTEGER NOT NULL,
// inventory TEXT,
// questBook TEXT
// );`)
// await db.run(`CREATE TABLE IF NOT EXISTS users (
// id INTEGER PRIMARY KEY,
// login TEXT NOT NULL,
// password TEXT NOT NULL
// );`)
// await db.run('CREATE TABLE IF NOT EXISTS friends (id INTEGER PRIMARY KEY, name TEXT)');
// await db.run('INSERT INTO friends (name) VALUES (?)', ['Silver Fox']);
// const friends = await db.select('SELECT * FROM friends');
// console.log(friends); // [{ id: 1, name: 'Silver Fox' }]
// await db.close();
// })();