|
|
|
|
@ -1,9 +1,8 @@
|
|
|
|
|
import { Database } from 'bun:sqlite';
|
|
|
|
|
import { mkdirSync } from 'fs';
|
|
|
|
|
import { dirname } from 'path';
|
|
|
|
|
import { resolveDbAbsolutePath } from './env';
|
|
|
|
|
|
|
|
|
|
function applyDefaultPragmas(instance: Database): void {
|
|
|
|
|
function applyDefaultPragmas(instance: any): void {
|
|
|
|
|
try {
|
|
|
|
|
instance.exec(`PRAGMA busy_timeout = 5000;`);
|
|
|
|
|
// Intentar activar WAL (si no es soportado, SQLite devolverá 'memory' u otro modo)
|
|
|
|
|
@ -19,8 +18,9 @@ function applyDefaultPragmas(instance: Database): void {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Abre la BD compartida sin ejecutar migraciones (las realiza el proceso del bot).
|
|
|
|
|
* Nota: uso de import dinámico de 'bun:sqlite' para que el build con Node no falle.
|
|
|
|
|
*/
|
|
|
|
|
export function openDb(filename: string = 'tasks.db'): Database {
|
|
|
|
|
async function openDb(filename: string = 'tasks.db'): Promise<any> {
|
|
|
|
|
const absolutePath = resolveDbAbsolutePath(filename);
|
|
|
|
|
|
|
|
|
|
// Crear directorio padre si no existe
|
|
|
|
|
@ -30,10 +30,19 @@ export function openDb(filename: string = 'tasks.db'): Database {
|
|
|
|
|
if (err?.code !== 'EEXIST') throw err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { Database } = await import('bun:sqlite');
|
|
|
|
|
const instance = new Database(absolutePath);
|
|
|
|
|
applyDefaultPragmas(instance);
|
|
|
|
|
return instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Instancia por defecto
|
|
|
|
|
export const db = openDb();
|
|
|
|
|
let _db: any | null = null;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Devuelve una única instancia compartida (lazy) de la BD.
|
|
|
|
|
*/
|
|
|
|
|
export async function getDb(filename: string = 'tasks.db'): Promise<any> {
|
|
|
|
|
if (_db) return _db;
|
|
|
|
|
_db = await openDb(filename);
|
|
|
|
|
return _db;
|
|
|
|
|
}
|
|
|
|
|
|