Files
peworkshop/lib/db.js
T
bobbert 0afa6817a8 cannot fix issue with elapsed timer on admin dashboard. fixing issues with QR code editing.
Grey = cant click
Red = current
Green = complete
blue = skipped?
2025-03-15 20:01:51 +00:00

130 lines
3.1 KiB
JavaScript

import sqlite3 from "sqlite3";
let db = null;
export function getDb() {
if (!db) {
db = new sqlite3.Database("./clue_hunt.db", (err) => {
if (err) {
console.error("Error connecting to database:", err);
} else {
console.log("Connected to the SQLite database.");
}
});
}
return db;
}
export function queryOne(sql, params = []) {
return new Promise((resolve, reject) => {
const db = getDb();
if (!db) {
reject(new Error("Database connection not available"));
return;
}
db.get(sql, params, function (err, row) {
if (err) {
console.error("SQL Error in queryOne():", err.message);
console.error("SQL Statement:", sql);
console.error("Parameters:", JSON.stringify(params));
reject(err);
return;
}
resolve(row);
});
});
}
export function query(sql, params = []) {
return new Promise((resolve, reject) => {
const db = getDb();
if (!db) {
reject(new Error("Database connection not available"));
return;
}
db.all(sql, params, function (err, rows) {
if (err) {
console.error("SQL Error in query():", err.message);
console.error("SQL Statement:", sql);
console.error("Parameters:", JSON.stringify(params));
reject(err);
return;
}
resolve(rows || []);
});
});
}
export function run(sql, params = []) {
return new Promise((resolve, reject) => {
const db = getDb();
if (!db) {
const error = new Error("Database connection not available");
console.error(error);
reject(error);
return;
}
// Add better logging
if (
sql.toLowerCase().includes("begin") ||
sql.toLowerCase().includes("commit") ||
sql.toLowerCase().includes("rollback")
) {
console.log(`Transaction operation: ${sql}`);
}
db.run(sql, params, function (err) {
if (err) {
console.error("SQL Error in run():", err.message);
console.error("SQL Statement:", sql);
console.error("Parameters:", JSON.stringify(params));
reject(err);
return;
}
resolve({
lastID: this.lastID,
changes: this.changes,
});
});
});
}
// New function to explicitly enable foreign keys
export function enableForeignKeys() {
return run("PRAGMA foreign_keys = ON;")
.then(() => console.log("Foreign key constraints enabled"))
.catch((err) => console.error("Error enabling foreign keys:", err));
}
// New function to run multiple statements as a transaction
export async function runTransaction(statements) {
try {
// Begin transaction
await run("BEGIN TRANSACTION");
// Execute all statements in order
for (const [sql, params] of statements) {
await run(sql, params);
}
// Commit on success
await run("COMMIT");
return { success: true };
} catch (error) {
// Rollback on any error
try {
await run("ROLLBACK");
console.log("Transaction rolled back due to error");
} catch (rollbackError) {
console.error("Error during rollback:", rollbackError);
}
throw error;
}
}