///
/**
* Async worker thread wrapper around SQLite, written to improve concurrent performance.
* @author mia-pi-git
*/
import { QueryProcessManager } from './process-manager';
import type * as sqlite from 'better-sqlite3';
import type { SQLStatement } from 'sql-template-strings';
export declare const DB_NOT_FOUND: null;
export interface SQLOptions {
file: string;
/** file to import database functions from - this should be relative to this filename. */
extension?: string;
/** options to be passed to better-sqlite3 */
sqliteOptions?: sqlite.Options;
/**
* You can choose to return custom error information, or just crashlog and return void.
* doing that will make it reject in main as normal.
* (it only returns a diff result if you do, otherwise it's a default error).
* You can also choose to only handle errors in the parent - see the third param, isParentProcess.
*/
onError?: ErrorHandler;
}
type DataType = unknown[] | Record;
export type SQLInput = string | number | null;
export interface ResultRow {
[k: string]: SQLInput;
}
export interface TransactionEnvironment {
db: sqlite.Database;
statements: Map;
}
type DatabaseQuery = {
/** Prepare a statement - data is the statement. */
type: 'prepare';
data: string;
} | {
/** Get all lines from a statement. Data is the params. */
type: 'all';
data: DataType;
statement: string;
noPrepare?: boolean;
} | {
/** Execute raw SQL in the database. */
type: "exec";
data: string;
} | {
/** Get one line from a prepared statement. */
type: 'get';
data: DataType;
statement: string;
noPrepare?: boolean;
} | {
/** Run a prepared statement. */
type: 'run';
data: DataType;
statement: string;
noPrepare?: boolean;
} | {
type: 'transaction';
name: string;
data: DataType;
} | {
type: 'start';
options: SQLOptions;
} | {
type: 'load-extension';
data: string;
};
type ErrorHandler = (error: Error, data: DatabaseQuery, isParentProcess: boolean) => any;
export declare class Statement {
private db;
private statement;
constructor(statement: string, db: SQLDatabaseManager);
run(data: R): Promise;
all(data: R): Promise;
get(data: R): Promise;
toString(): string;
toJSON(): string;
}
export declare class SQLDatabaseManager extends QueryProcessManager {
options: SQLOptions;
database: null | sqlite.Database;
state: {
transactions: Map;
statements: Map;
};
private dbReady;
constructor(module: NodeJS.Module, options: SQLOptions);
private onError;
private cacheStatement;
private extractStatement;
setupDatabase(): void;
loadExtensionFile(extension: string): void;
query(input: DatabaseQuery): Promise;
all(statement: string | Statement, data?: DataType, noPrepare?: boolean): Promise;
get(statement: string | Statement, data?: DataType, noPrepare?: boolean): Promise;
run(statement: string | Statement, data?: DataType, noPrepare?: boolean): Promise;
transaction(name: string, data?: DataType): Promise;
prepare(statement: string): Promise;
exec(data: string): Promise<{
changes: number;
}>;
loadExtension(filepath: string): Promise;
runFile(file: string): Promise;
}
export declare const tables: Map>;
export declare class DatabaseTable {
database: SQLDatabaseManager;
name: string;
primaryKeyName: string;
constructor(name: string, primaryKeyName: string, database: SQLDatabaseManager);
selectOne(entries: string | string[], where?: SQLStatement): Promise;
selectAll(entries: string | string[], where?: SQLStatement): Promise;
get(entries: string | string[], keyId: SQLInput): Promise;
updateAll(toParams: Partial, where?: SQLStatement, limit?: number): Promise<{
changes: number;
}>;
updateOne(to: Partial, where?: SQLStatement): Promise<{
changes: number;
}>;
deleteAll(where?: SQLStatement, limit?: number): Promise<{
changes: number;
}>;
delete(keyEntry: SQLInput): Promise<{
changes: number;
}>;
deleteOne(where: SQLStatement): Promise<{
changes: number;
}>;
insert(colMap: Partial, rest?: SQLStatement, isReplace?: boolean): Promise;
replace(cols: Partial, rest?: SQLStatement): Promise;
update(primaryKey: SQLInput, data: Partial): Promise<{
changes: number;
}>;
run(sql: SQLStatement): Promise<{
changes: number;
}>;
all(sql: SQLStatement): Promise;
}
declare function getSQL(module: NodeJS.Module, input: SQLOptions & {
processes?: number;
}): SQLDatabaseManager;
export declare const SQL: typeof getSQL & {
DatabaseTable: typeof DatabaseTable;
SQLDatabaseManager: typeof SQLDatabaseManager;
tables: Map>;
SQL: typeof import("sql-template-strings").SQL;
};
export declare namespace SQL {
type DatabaseManager = import('./sql').SQLDatabaseManager;
type Statement = import('./sql').Statement;
type Options = import('./sql').SQLOptions;
type DatabaseTable = import('./sql').DatabaseTable;
}
export {};