{ "version": 3, "sources": ["../../../lib/sql.ts"], "sourcesContent": ["/**\r\n * Async worker thread wrapper around SQLite, written to improve concurrent performance.\r\n * @author mia-pi-git\r\n */\r\nimport {QueryProcessManager} from './process-manager';\r\nimport type * as sqlite from 'better-sqlite3';\r\nimport {FS} from './fs';\r\n// @ts-ignore in case not installed\r\nimport type {SQLStatement} from 'sql-template-strings';\r\n\r\nexport const DB_NOT_FOUND = null;\r\n\r\nexport interface SQLOptions {\r\n\tfile: string;\r\n\t/** file to import database functions from - this should be relative to this filename. */\r\n\textension?: string;\r\n\t/** options to be passed to better-sqlite3 */\r\n\tsqliteOptions?: sqlite.Options;\r\n\t/**\r\n\t * You can choose to return custom error information, or just crashlog and return void.\r\n\t * doing that will make it reject in main as normal.\r\n\t * (it only returns a diff result if you do, otherwise it's a default error).\r\n\t * You can also choose to only handle errors in the parent - see the third param, isParentProcess.\r\n\t */\r\n\tonError?: ErrorHandler;\r\n}\r\n\r\ntype DataType = unknown[] | Record;\r\nexport type SQLInput = string | number | null;\r\nexport interface ResultRow {[k: string]: SQLInput}\r\n\r\nexport interface TransactionEnvironment {\r\n\tdb: sqlite.Database;\r\n\tstatements: Map;\r\n}\r\n\r\ntype DatabaseQuery = {\r\n\t/** Prepare a statement - data is the statement. */\r\n\ttype: 'prepare', data: string,\r\n} | {\r\n\t/** Get all lines from a statement. Data is the params. */\r\n\ttype: 'all', data: DataType, statement: string, noPrepare?: boolean,\r\n} | {\r\n\t/** Execute raw SQL in the database. */\r\n\ttype: \"exec\", data: string,\r\n} | {\r\n\t/** Get one line from a prepared statement. */\r\n\ttype: 'get', data: DataType, statement: string, noPrepare?: boolean,\r\n} | {\r\n\t/** Run a prepared statement. */\r\n\ttype: 'run', data: DataType, statement: string, noPrepare?: boolean,\r\n} | {\r\n\ttype: 'transaction', name: string, data: DataType,\r\n} | {\r\n\ttype: 'start', options: SQLOptions,\r\n} | {\r\n\ttype: 'load-extension', data: string,\r\n};\r\n\r\ntype ErrorHandler = (error: Error, data: DatabaseQuery, isParentProcess: boolean) => any;\r\n\r\nfunction getModule() {\r\n\ttry {\r\n\t\treturn require('better-sqlite3') as typeof sqlite.default;\r\n\t} catch {\r\n\t\treturn null;\r\n\t}\r\n}\r\n\r\nexport class Statement {\r\n\tprivate db: SQLDatabaseManager;\r\n\tprivate statement: string;\r\n\tconstructor(statement: string, db: SQLDatabaseManager) {\r\n\t\tthis.db = db;\r\n\t\tthis.statement = statement;\r\n\t}\r\n\trun(data: R) {\r\n\t\treturn this.db.run(this.statement, data);\r\n\t}\r\n\tall(data: R) {\r\n\t\treturn this.db.all(this.statement, data);\r\n\t}\r\n\tget(data: R) {\r\n\t\treturn this.db.get(this.statement, data);\r\n\t}\r\n\ttoString() {\r\n\t\treturn this.statement;\r\n\t}\r\n\ttoJSON() {\r\n\t\treturn this.statement;\r\n\t}\r\n}\r\n\r\nexport class SQLDatabaseManager extends QueryProcessManager {\r\n\toptions: SQLOptions;\r\n\tdatabase: null | sqlite.Database = null;\r\n\tstate: {\r\n\t\ttransactions: Map,\r\n\t\tstatements: Map,\r\n\t};\r\n\tprivate dbReady = false;\r\n\tconstructor(module: NodeJS.Module, options: SQLOptions) {\r\n\t\tsuper(module, query => {\r\n\t\t\tif (!this.dbReady) {\r\n\t\t\t\tthis.setupDatabase();\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tswitch (query.type) {\r\n\t\t\t\tcase 'load-extension': {\r\n\t\t\t\t\tif (!this.database) return null;\r\n\t\t\t\t\tthis.loadExtensionFile(query.data);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'transaction': {\r\n\t\t\t\t\tconst transaction = this.state.transactions.get(query.name);\r\n\t\t\t\t\t// !transaction covers db not existing, typically, but this is just to appease ts\r\n\t\t\t\t\tif (!transaction || !this.database) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst env: TransactionEnvironment = {\r\n\t\t\t\t\t\tdb: this.database,\r\n\t\t\t\t\t\tstatements: this.state.statements,\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn transaction(query.data, env) || null;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'exec': {\r\n\t\t\t\t\tif (!this.database) return {changes: 0};\r\n\t\t\t\t\tthis.database.exec(query.data);\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'get': {\r\n\t\t\t\t\tif (!this.database) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.extractStatement(query).get(query.data);\r\n\t\t\t\t}\r\n\t\t\t\tcase 'run': {\r\n\t\t\t\t\tif (!this.database) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.extractStatement(query).run(query.data);\r\n\t\t\t\t}\r\n\t\t\t\tcase 'all': {\r\n\t\t\t\t\tif (!this.database) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this.extractStatement(query).all(query.data);\r\n\t\t\t\t}\r\n\t\t\t\tcase 'prepare':\r\n\t\t\t\t\tif (!this.database) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.state.statements.set(query.data, this.database.prepare(query.data));\r\n\t\t\t\t\treturn query.data;\r\n\t\t\t\t}\r\n\t\t\t} catch (error: any) {\r\n\t\t\t\treturn this.onError(error, query);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.options = options;\r\n\t\tthis.state = {\r\n\t\t\ttransactions: new Map(),\r\n\t\t\tstatements: new Map(),\r\n\t\t};\r\n\t\tif (!this.isParentProcess) this.setupDatabase();\r\n\t}\r\n\tprivate onError(err: Error, query: DatabaseQuery) {\r\n\t\tif (this.options.onError) {\r\n\t\t\tconst result = this.options.onError(err, query, false);\r\n\t\t\tif (result) return result;\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tqueryError: {\r\n\t\t\t\tstack: err.stack,\r\n\t\t\t\tmessage: err.message,\r\n\t\t\t\tquery,\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\tprivate cacheStatement(source: string) {\r\n\t\tsource = source.trim();\r\n\t\tlet statement = this.state.statements.get(source);\r\n\t\tif (!statement) {\r\n\t\t\tstatement = this.database!.prepare(source);\r\n\t\t\tthis.state.statements.set(source, statement);\r\n\t\t}\r\n\t\treturn statement;\r\n\t}\r\n\tprivate extractStatement(\r\n\t\tquery: DatabaseQuery & {statement: string, noPrepare?: boolean}\r\n\t) {\r\n\t\tquery.statement = query.statement.trim();\r\n\t\tconst statement = query.noPrepare ?\r\n\t\t\tthis.state.statements.get(query.statement) :\r\n\t\t\tthis.cacheStatement(query.statement);\r\n\t\tif (!statement) throw new Error(`Missing cached statement \"${query.statement}\" where required`);\r\n\t\treturn statement;\r\n\t}\r\n\tsetupDatabase() {\r\n\t\tif (this.dbReady) return;\r\n\t\tthis.dbReady = true;\r\n\t\tconst {file, extension} = this.options;\r\n\t\tconst Database = getModule();\r\n\t\tthis.database = Database ? new Database(file) : null;\r\n\t\tif (extension) this.loadExtensionFile(extension);\r\n\t}\r\n\r\n\tloadExtensionFile(extension: string) {\r\n\t\tif (!this.database) return;\r\n\t\tconst {\r\n\t\t\tfunctions,\r\n\t\t\ttransactions: storedTransactions,\r\n\t\t\tstatements: storedStatements,\r\n\t\t\tonDatabaseStart,\r\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-var-requires\r\n\t\t} = require(`../${extension}`);\r\n\t\tif (functions) {\r\n\t\t\tfor (const k in functions) {\r\n\t\t\t\tthis.database.function(k, functions[k]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (storedTransactions) {\r\n\t\t\tfor (const t in storedTransactions) {\r\n\t\t\t\tconst transaction = this.database.transaction(storedTransactions[t]);\r\n\t\t\t\tthis.state.transactions.set(t, transaction);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (storedStatements) {\r\n\t\t\tfor (const k in storedStatements) {\r\n\t\t\t\tconst statement = this.database.prepare(storedStatements[k]);\r\n\t\t\t\tthis.state.statements.set(statement.source, statement);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (onDatabaseStart) {\r\n\t\t\tonDatabaseStart(this.database);\r\n\t\t}\r\n\t}\r\n\tasync query(input: DatabaseQuery) {\r\n\t\tconst result = await super.query(input);\r\n\t\tif (result?.queryError) {\r\n\t\t\tconst err = new Error(result.queryError.message);\r\n\t\t\terr.stack = result.queryError.stack;\r\n\t\t\tif (this.options.onError) {\r\n\t\t\t\tconst errResult = this.options.onError(err, result.queryError.query, true);\r\n\t\t\t\tif (errResult) return errResult;\r\n\t\t\t}\r\n\t\t\tthrow err;\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\tall(\r\n\t\tstatement: string | Statement, data: DataType = [], noPrepare?: boolean\r\n\t): Promise {\r\n\t\tif (typeof statement !== 'string') statement = statement.toString();\r\n\t\treturn this.query({type: 'all', statement, data, noPrepare});\r\n\t}\r\n\tget(\r\n\t\tstatement: string | Statement, data: DataType = [], noPrepare?: boolean\r\n\t): Promise {\r\n\t\tif (typeof statement !== 'string') statement = statement.toString();\r\n\t\treturn this.query({type: 'get', statement, data, noPrepare});\r\n\t}\r\n\trun(\r\n\t\tstatement: string | Statement, data: DataType = [], noPrepare?: boolean\r\n\t): Promise {\r\n\t\tif (typeof statement !== 'string') statement = statement.toString();\r\n\t\treturn this.query({type: 'run', statement, data, noPrepare});\r\n\t}\r\n\ttransaction(name: string, data: DataType = []): Promise {\r\n\t\treturn this.query({type: 'transaction', name, data});\r\n\t}\r\n\tasync prepare(statement: string): Promise {\r\n\t\tconst source = await this.query({type: 'prepare', data: statement});\r\n\t\tif (!source) return null;\r\n\t\treturn new Statement(source, this);\r\n\t}\r\n\texec(data: string): Promise<{changes: number}> {\r\n\t\treturn this.query({type: 'exec', data});\r\n\t}\r\n\tloadExtension(filepath: string) {\r\n\t\treturn this.query({type: 'load-extension', data: filepath});\r\n\t}\r\n\r\n\tasync runFile(file: string) {\r\n\t\tconst contents = await FS(file).read();\r\n\t\treturn this.query({type: 'exec', data: contents});\r\n\t}\r\n}\r\n\r\nexport const tables = new Map>();\r\n\r\nexport class DatabaseTable {\r\n\tdatabase: SQLDatabaseManager;\r\n\tname: string;\r\n\tprimaryKeyName: string;\r\n\tconstructor(\r\n\t\tname: string,\r\n\t\tprimaryKeyName: string,\r\n\t\tdatabase: SQLDatabaseManager\r\n\t) {\r\n\t\tthis.name = name;\r\n\t\tthis.database = database;\r\n\t\tthis.primaryKeyName = primaryKeyName;\r\n\t\ttables.set(this.name, this);\r\n\t}\r\n\tasync selectOne(\r\n\t\tentries: string | string[],\r\n\t\twhere?: SQLStatement\r\n\t): Promise {\r\n\t\tconst query = where || SQL.SQL``;\r\n\t\tquery.append(' LIMIT 1');\r\n\t\tconst rows = await this.selectAll(entries, query);\r\n\t\treturn rows?.[0] || null;\r\n\t}\r\n\tselectAll(\r\n\t\tentries: string | string[],\r\n\t\twhere?: SQLStatement\r\n\t): Promise {\r\n\t\tconst query = SQL.SQL`SELECT `;\r\n\t\tif (typeof entries === 'string') {\r\n\t\t\tquery.append(` ${entries} `);\r\n\t\t} else {\r\n\t\t\tfor (let i = 0; i < entries.length; i++) {\r\n\t\t\t\tquery.append(entries[i]);\r\n\t\t\t\tif (typeof entries[i + 1] !== 'undefined') query.append(', ');\r\n\t\t\t}\r\n\t\t\tquery.append(' ');\r\n\t\t}\r\n\t\tquery.append(`FROM ${this.name} `);\r\n\t\tif (where) {\r\n\t\t\tquery.append(' WHERE ');\r\n\t\t\tquery.append(where);\r\n\t\t}\r\n\t\treturn this.all(query);\r\n\t}\r\n\tget(entries: string | string[], keyId: SQLInput) {\r\n\t\tconst query = SQL.SQL``;\r\n\t\tquery.append(this.primaryKeyName);\r\n\t\tquery.append(SQL.SQL` = ${keyId}`);\r\n\t\treturn this.selectOne(entries, query);\r\n\t}\r\n\tupdateAll(toParams: Partial, where?: SQLStatement, limit?: number) {\r\n\t\tconst to = Object.entries(toParams);\r\n\t\tconst query = SQL.SQL`UPDATE `;\r\n\t\tquery.append(this.name + ' SET ');\r\n\t\tfor (let i = 0; i < to.length; i++) {\r\n\t\t\tconst [k, v] = to[i];\r\n\t\t\tquery.append(`${k} = `);\r\n\t\t\tquery.append(SQL.SQL`${v}`);\r\n\t\t\tif (typeof to[i + 1] !== 'undefined') {\r\n\t\t\t\tquery.append(', ');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (where) {\r\n\t\t\tquery.append(` WHERE `);\r\n\t\t\tquery.append(where);\r\n\t\t}\r\n\t\tif (limit) query.append(SQL.SQL` LIMIT ${limit}`);\r\n\t\treturn this.run(query);\r\n\t}\r\n\tupdateOne(to: Partial, where?: SQLStatement) {\r\n\t\treturn this.updateAll(to, where, 1);\r\n\t}\r\n\tdeleteAll(where?: SQLStatement, limit?: number) {\r\n\t\tconst query = SQL.SQL`DELETE FROM `;\r\n\t\tquery.append(this.name);\r\n\t\tif (where) {\r\n\t\t\tquery.append(' WHERE ');\r\n\t\t\tquery.append(where);\r\n\t\t}\r\n\t\tif (limit) {\r\n\t\t\tquery.append(SQL.SQL` LIMIT ${limit}`);\r\n\t\t}\r\n\t\treturn this.run(query);\r\n\t}\r\n\tdelete(keyEntry: SQLInput) {\r\n\t\tconst query = SQL.SQL``;\r\n\t\tquery.append(this.primaryKeyName);\r\n\t\tquery.append(SQL.SQL` = ${keyEntry}`);\r\n\t\treturn this.deleteOne(query);\r\n\t}\r\n\tdeleteOne(where: SQLStatement) {\r\n\t\treturn this.deleteAll(where, 1);\r\n\t}\r\n\tinsert(colMap: Partial, rest?: SQLStatement, isReplace = false) {\r\n\t\tconst query = SQL.SQL``;\r\n\t\tquery.append(`${isReplace ? 'REPLACE' : 'INSERT'} INTO ${this.name} (`);\r\n\t\tconst keys = Object.keys(colMap);\r\n\t\tfor (let i = 0; i < keys.length; i++) {\r\n\t\t\tquery.append(keys[i]);\r\n\t\t\tif (typeof keys[i + 1] !== 'undefined') query.append(', ');\r\n\t\t}\r\n\t\tquery.append(') VALUES (');\r\n\t\tfor (let i = 0; i < keys.length; i++) {\r\n\t\t\tconst key = keys[i];\r\n\t\t\tquery.append(SQL.SQL`${colMap[key as keyof T]}`);\r\n\t\t\tif (typeof keys[i + 1] !== 'undefined') query.append(', ');\r\n\t\t}\r\n\t\tquery.append(') ');\r\n\t\tif (rest) query.append(rest);\r\n\t\treturn this.database.run(query.sql, query.values);\r\n\t}\r\n\treplace(cols: Partial, rest?: SQLStatement) {\r\n\t\treturn this.insert(cols, rest, true);\r\n\t}\r\n\tupdate(primaryKey: SQLInput, data: Partial) {\r\n\t\tconst query = SQL.SQL``;\r\n\t\tquery.append(this.primaryKeyName + ' = ');\r\n\t\tquery.append(SQL.SQL`${primaryKey}`);\r\n\t\treturn this.updateOne(data, query);\r\n\t}\r\n\r\n\t// catch-alls for \"we can't fit this query into any of the wrapper functions\"\r\n\trun(sql: SQLStatement) {\r\n\t\treturn this.database.run(sql.sql, sql.values) as Promise<{changes: number}>;\r\n\t}\r\n\tall(sql: SQLStatement) {\r\n\t\treturn this.database.all(sql.sql, sql.values);\r\n\t}\r\n}\r\n\r\nfunction getSQL(\r\n\tmodule: NodeJS.Module, input: SQLOptions & {processes?: number}\r\n) {\r\n\tconst {processes} = input;\r\n\tconst PM = new SQLDatabaseManager(module, input);\r\n\tif (PM.isParentProcess) {\r\n\t\tif (processes) PM.spawn(processes);\r\n\t}\r\n\treturn PM;\r\n}\r\n\r\nexport const SQL = Object.assign(getSQL, {\r\n\tDatabaseTable,\r\n\tSQLDatabaseManager,\r\n\ttables,\r\n\tSQL: (() => {\r\n\t\ttry {\r\n\t\t\treturn require('sql-template-strings');\r\n\t\t} catch {\r\n\t\t\treturn () => {\r\n\t\t\t\tthrow new Error(\"Using SQL-template-strings without it installed\");\r\n\t\t\t};\r\n\t\t}\r\n\t})() as typeof import('sql-template-strings').SQL,\r\n});\r\n\r\nexport namespace SQL {\r\n\texport type DatabaseManager = import('./sql').SQLDatabaseManager;\r\n\texport type Statement = import('./sql').Statement;\r\n\texport type Options = import('./sql').SQLOptions;\r\n\texport type DatabaseTable = import('./sql').DatabaseTable;\r\n}\r\n"], "mappings": "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", "names": ["module"] }