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