sqlmongoose
Version:
Mongoose-like schemas and models for SQLite3
87 lines (86 loc) • 2.56 kB
JavaScript
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);
}