UNPKG

sqlmongoose

Version:

Mongoose-like schemas and models for SQLite3

94 lines (93 loc) 2.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Connection = void 0; const sqlite3_1 = __importDefault(require("sqlite3")); const events_1 = require("events"); const generic_pool_1 = __importDefault(require("generic-pool")); class Connection extends events_1.EventEmitter { constructor(config) { super(); this.isConnected = false; this.pool = createConnectionPool(config); } async query(sql, params = []) { const client = await this.pool.acquire(); try { return await new Promise((resolve, reject) => { client.all(sql, params, (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } finally { await this.pool.release(client); } } async transaction(fn) { const client = await this.pool.acquire(); try { await new Promise((resolve, reject) => { client.run('BEGIN TRANSACTION', (err) => { if (err) reject(err); else resolve(true); }); }); const result = await fn(client); await new Promise((resolve, reject) => { client.run('COMMIT', (err) => { if (err) reject(err); else resolve(true); }); }); return result; } catch (error) { await new Promise((resolve) => { client.run('ROLLBACK', () => resolve(true)); }); throw error; } finally { await this.pool.release(client); } } } exports.Connection = Connection; function createConnectionPool(config) { const factory = { create: () => { return new Promise((resolve, reject) => { const db = new sqlite3_1.default.Database(config.path, (err) => { if (err) reject(err); else resolve(db); }); }); }, destroy: (client) => { return new Promise((resolve) => { client.close(() => resolve()); }); } }; return createPool(factory, { max: config.poolSize || 5, min: 0, acquireTimeoutMillis: config.timeout || 30000, autostart: true }); } function createPool(factory, options) { return generic_pool_1.default.createPool(factory, options); }