UNPKG

sqlmongoose

Version:

Mongoose-like schemas and models for SQLite3

87 lines (86 loc) 2.56 kB
import sqlite3 from 'sqlite3'; import { EventEmitter } from 'events'; import genericPool from 'generic-pool'; export class Connection extends 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); } } } function createConnectionPool(config) { const factory = { create: () => { return new Promise((resolve, reject) => { const db = new sqlite3.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 genericPool.createPool(factory, options); }