Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var sql_exports = {};
__export(sql_exports, {
DB_NOT_FOUND: () => DB_NOT_FOUND,
DatabaseTable: () => DatabaseTable,
SQL: () => SQL,
SQLDatabaseManager: () => SQLDatabaseManager,
Statement: () => Statement,
tables: () => tables
});
module.exports = __toCommonJS(sql_exports);
var import_process_manager = require("./process-manager");
var import_fs = require("./fs");
const DB_NOT_FOUND = null;
function getModule() {
try {
return require("better-sqlite3");
} catch {
return null;
}
}
class Statement {
constructor(statement, db) {
this.db = db;
this.statement = statement;
}
run(data) {
return this.db.run(this.statement, data);
}
all(data) {
return this.db.all(this.statement, data);
}
get(data) {
return this.db.get(this.statement, data);
}
toString() {
return this.statement;
}
toJSON() {
return this.statement;
}
}
class SQLDatabaseManager extends import_process_manager.QueryProcessManager {
constructor(module2, options) {
super(module2, (query) => {
if (!this.dbReady) {
this.setupDatabase();
}
try {
switch (query.type) {
case "load-extension": {
if (!this.database)
return null;
this.loadExtensionFile(query.data);
return true;
}
case "transaction": {
const transaction = this.state.transactions.get(query.name);
if (!transaction || !this.database) {
return null;
}
const env = {
db: this.database,
statements: this.state.statements
};
return transaction(query.data, env) || null;
}
case "exec": {
if (!this.database)
return { changes: 0 };
this.database.exec(query.data);
return true;
}
case "get": {
if (!this.database) {
return null;
}
return this.extractStatement(query).get(query.data);
}
case "run": {
if (!this.database) {
return null;
}
return this.extractStatement(query).run(query.data);
}
case "all": {
if (!this.database) {
return null;
}
return this.extractStatement(query).all(query.data);
}
case "prepare":
if (!this.database) {
return null;
}
this.state.statements.set(query.data, this.database.prepare(query.data));
return query.data;
}
} catch (error) {
return this.onError(error, query);
}
});
this.database = null;
this.dbReady = false;
this.options = options;
this.state = {
transactions: /* @__PURE__ */ new Map(),
statements: /* @__PURE__ */ new Map()
};
if (!this.isParentProcess)
this.setupDatabase();
}
onError(err, query) {
if (this.options.onError) {
const result = this.options.onError(err, query, false);
if (result)
return result;
}
return {
queryError: {
stack: err.stack,
message: err.message,
query
}
};
}
cacheStatement(source) {
source = source.trim();
let statement = this.state.statements.get(source);
if (!statement) {
statement = this.database.prepare(source);
this.state.statements.set(source, statement);
}
return statement;
}
registerFunction(key, cb) {
this.database.function(key, cb);
}
extractStatement(query) {
query.statement = query.statement.trim();
const statement = query.noPrepare ? this.state.statements.get(query.statement) : this.cacheStatement(query.statement);
if (!statement)
throw new Error(`Missing cached statement "${query.statement}" where required`);
return statement;
}
setupDatabase() {
if (this.dbReady)
return;
this.dbReady = true;
const { file, extension } = this.options;
const Database = getModule();
this.database = Database ? new Database(file) : null;
if (extension)
this.loadExtensionFile(extension);
}
loadExtensionFile(extension) {
return this.handleExtensions(require("../" + extension));
}
handleExtensions(imports) {
if (!this.database)
return;
const {
functions,
transactions: storedTransactions,
statements: storedStatements,
onDatabaseStart
} = imports;
if (onDatabaseStart) {
onDatabaseStart.call(this, this.database);
}
if (functions) {
for (const k in functions) {
this.registerFunction(k, functions[k]);
}
}
if (storedTransactions) {
for (const t in storedTransactions) {
const transaction = this.database.transaction(storedTransactions[t]);
this.state.transactions.set(t, transaction);
}
}
if (storedStatements) {
for (const k in storedStatements) {
const statement = this.database.prepare(storedStatements[k]);
this.state.statements.set(statement.source, statement);
}
}
}
async query(input) {
const result = await super.query(input);
if (result?.queryError) {
const err = new Error(result.queryError.message);
err.stack = result.queryError.stack;
if (this.options.onError) {
const errResult = this.options.onError(err, result.queryError.query, true);
if (errResult)
return errResult;
}
throw err;
}
return result;
}
all(statement, data = [], noPrepare) {
if (typeof statement !== "string")
statement = statement.toString();
return this.query({ type: "all", statement, data, noPrepare });
}
get(statement, data = [], noPrepare) {
if (typeof statement !== "string")
statement = statement.toString();
return this.query({ type: "get", statement, data, noPrepare });
}
run(statement, data = [], noPrepare) {
if (typeof statement !== "string")
statement = statement.toString();
return this.query({ type: "run", statement, data, noPrepare });
}
transaction(name, data = []) {
return this.query({ type: "transaction", name, data });
}
async prepare(statement) {
const source = await this.query({ type: "prepare", data: statement });
if (!source)
return null;
return new Statement(source, this);
}
exec(data) {
return this.query({ type: "exec", data });
}
loadExtension(filepath) {
return this.query({ type: "load-extension", data: filepath });
}
async runFile(file) {
const contents = await (0, import_fs.FS)(file).read();
return this.query({ type: "exec", data: contents });
}
}
const tables = /* @__PURE__ */ new Map();
class DatabaseTable {
constructor(name, primaryKeyName, database) {
this.name = name;
this.database = database;
this.primaryKeyName = primaryKeyName;
tables.set(this.name, this);
}
async selectOne(entries, where) {
const query = where || SQL.SQL``;
query.append(" LIMIT 1");
const rows = await this.selectAll(entries, query);
return rows?.[0] || null;
}
selectAll(entries, where) {
const query = SQL.SQL`SELECT `;
if (typeof entries === "string") {
query.append(` ${entries} `);
} else {
for (let i = 0; i < entries.length; i++) {
query.append(entries[i]);
if (typeof entries[i + 1] !== "undefined")
query.append(", ");
}
query.append(" ");
}
query.append(`FROM ${this.name} `);
if (where) {
query.append(" WHERE ");
query.append(where);
}
return this.all(query);
}
get(entries, keyId) {
const query = SQL.SQL``;
query.append(this.primaryKeyName);
query.append(SQL.SQL` = ${keyId}`);
return this.selectOne(entries, query);
}
updateAll(toParams, where, limit) {
const to = Object.entries(toParams);
const query = SQL.SQL`UPDATE `;
query.append(this.name + " SET ");
for (let i = 0; i < to.length; i++) {
const [k, v] = to[i];
query.append(`${k} = `);
query.append(SQL.SQL`${v}`);
if (typeof to[i + 1] !== "undefined") {
query.append(", ");
}
}
if (where) {
query.append(` WHERE `);
query.append(where);
}
if (limit)
query.append(SQL.SQL` LIMIT ${limit}`);
return this.run(query);
}
updateOne(to, where) {
return this.updateAll(to, where, 1);
}
deleteAll(where, limit) {
const query = SQL.SQL`DELETE FROM `;
query.append(this.name);
if (where) {
query.append(" WHERE ");
query.append(where);
}
if (limit) {
query.append(SQL.SQL` LIMIT ${limit}`);
}
return this.run(query);
}
delete(keyEntry) {
const query = SQL.SQL``;
query.append(this.primaryKeyName);
query.append(SQL.SQL` = ${keyEntry}`);
return this.deleteOne(query);
}
deleteOne(where) {
return this.deleteAll(where, 1);
}
insert(colMap, rest, isReplace = false) {
const query = SQL.SQL``;
query.append(`${isReplace ? "REPLACE" : "INSERT"} INTO ${this.name} (`);
const keys = Object.keys(colMap);
for (let i = 0; i < keys.length; i++) {
query.append(keys[i]);
if (typeof keys[i + 1] !== "undefined")
query.append(", ");
}
query.append(") VALUES (");
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
query.append(SQL.SQL`${colMap[key]}`);
if (typeof keys[i + 1] !== "undefined")
query.append(", ");
}
query.append(") ");
if (rest)
query.append(rest);
return this.database.run(query.sql, query.values);
}
replace(cols, rest) {
return this.insert(cols, rest, true);
}
update(primaryKey, data) {
const query = SQL.SQL``;
query.append(this.primaryKeyName + " = ");
query.append(SQL.SQL`${primaryKey}`);
return this.updateOne(data, query);
}
// catch-alls for "we can't fit this query into any of the wrapper functions"
run(sql) {
return this.database.run(sql.sql, sql.values);
}
all(sql) {
return this.database.all(sql.sql, sql.values);
}
}
function getSQL(module2, input) {
const { processes } = input;
const PM = new SQLDatabaseManager(module2, input);
if (PM.isParentProcess) {
if (processes)
PM.spawn(processes);
}
return PM;
}
const SQL = Object.assign(getSQL, {
DatabaseTable,
SQLDatabaseManager,
tables,
SQL: (() => {
try {
return require("sql-template-strings");
} catch {
return () => {
throw new Error("Using SQL-template-strings without it installed");
};
}
})()
});
//# sourceMappingURL=sql.js.map