first commit
This commit is contained in:
94
server/src/db.ts
Normal file
94
server/src/db.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
import initSqlJs, { Database as SqlJsDatabase } from 'sql.js';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const dbPath = path.join(__dirname, '..', 'data.db');
|
||||
|
||||
let db: SqlJsDatabase;
|
||||
|
||||
export async function initDb(): Promise<SqlJsDatabase> {
|
||||
const SQL = await initSqlJs();
|
||||
|
||||
if (fs.existsSync(dbPath)) {
|
||||
const buffer = fs.readFileSync(dbPath);
|
||||
db = new SQL.Database(buffer);
|
||||
} else {
|
||||
db = new SQL.Database();
|
||||
}
|
||||
|
||||
db.run('PRAGMA foreign_keys = ON');
|
||||
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL,
|
||||
points INTEGER DEFAULT 0,
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS cats (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id),
|
||||
image_url TEXT NOT NULL,
|
||||
caption TEXT DEFAULT '',
|
||||
created_at TEXT DEFAULT (datetime('now'))
|
||||
)
|
||||
`);
|
||||
|
||||
db.run(`
|
||||
CREATE TABLE IF NOT EXISTS likes (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
cat_id INTEGER NOT NULL REFERENCES cats(id),
|
||||
user_id INTEGER NOT NULL REFERENCES users(id),
|
||||
UNIQUE(cat_id, user_id)
|
||||
)
|
||||
`);
|
||||
|
||||
saveDb();
|
||||
return db;
|
||||
}
|
||||
|
||||
export function saveDb(): void {
|
||||
const data = db.export();
|
||||
const buffer = Buffer.from(data);
|
||||
fs.writeFileSync(dbPath, buffer);
|
||||
}
|
||||
|
||||
export function getDb(): SqlJsDatabase {
|
||||
return db;
|
||||
}
|
||||
|
||||
export function queryOne(sql: string, params: any[] = []): any {
|
||||
const stmt = db.prepare(sql);
|
||||
stmt.bind(params);
|
||||
const result = stmt.step() ? stmt.getAsObject() : null;
|
||||
stmt.free();
|
||||
return result;
|
||||
}
|
||||
|
||||
export function queryAll(sql: string, params: any[] = []): any[] {
|
||||
const stmt = db.prepare(sql);
|
||||
stmt.bind(params);
|
||||
const results: any[] = [];
|
||||
while (stmt.step()) {
|
||||
results.push(stmt.getAsObject());
|
||||
}
|
||||
stmt.free();
|
||||
return results;
|
||||
}
|
||||
|
||||
export function execute(sql: string, params: any[] = []): { changes: number; lastInsertRowid: number } {
|
||||
const stmt = db.prepare(sql);
|
||||
stmt.bind(params);
|
||||
stmt.step();
|
||||
const lastId = db.exec('SELECT last_insert_rowid() AS id')[0]?.values[0][0] || 0;
|
||||
const changes = db.getRowsModified();
|
||||
stmt.free();
|
||||
saveDb();
|
||||
return { changes, lastInsertRowid: Number(lastId) };
|
||||
}
|
||||
Reference in New Issue
Block a user