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