UNPKG

@naturalcycles/db-lib

Version:

Lowest Common Denominator API to supported Databases

111 lines (110 loc) 3.69 kB
import type { ObjectWithId, UnixTimestamp } from '@naturalcycles/js-lib/types'; import type { CommonDB } from './commondb/common.db.js'; /** * Similar to SQL INSERT, UPDATE. * Insert will fail if row already exists. * Update will fail if row is missing. * Upsert will auto-detect and use Insert or Update to not fail. * * Default is Upsert. */ export type CommonDBSaveMethod = 'upsert' | 'insert' | 'update'; /** * Transaction is committed when the function returns resolved Promise (aka "returns normally"). * * Transaction is rolled back when the function returns rejected Promise (aka "throws"). */ export type DBTransactionFn = (tx: DBTransaction) => Promise<void>; /** * Transaction context. * Has similar API than CommonDB, but all operations are performed in the context of the transaction. */ export interface DBTransaction { getByIds: CommonDB['getByIds']; saveBatch: CommonDB['saveBatch']; deleteByIds: CommonDB['deleteByIds']; /** * Commit the transaction. * May throw. */ commit: () => Promise<void>; /** * Perform a graceful rollback. * It'll rollback the transaction and won't throw/re-throw any errors. */ rollback: () => Promise<void>; } export interface CommonDBTransactionOptions { /** * Default is false. * If set to true - Transaction is created as read-only. */ readOnly?: boolean; } export interface CommonDBOptions { /** * If passed - the operation will be performed in the context of that DBTransaction. * Note that not every type of operation supports Transaction * (e.g in Datastore queries cannot be executed inside a Transaction). * Also, not every CommonDB implementation supports Transactions. */ tx?: DBTransaction; } export interface CommonDBReadOptions extends CommonDBOptions { /** * If provided (and supported by the DB) - will read the data at that point in time (aka "Time machine" feature). * This feature is named PITR (point-in-time-recovery) query in Datastore. */ readAt?: UnixTimestamp; } /** * All properties default to undefined. */ export interface CommonDBSaveOptions<ROW extends ObjectWithId> extends CommonDBOptions { excludeFromIndexes?: (keyof ROW)[]; /** * Default is `upsert` */ saveMethod?: CommonDBSaveMethod; /** * Only applicable to tables where id is "auto-generated by DB", e.g `auto_increment` in MySQL. * By default it's false, so, auto-generated id will NOT be assigned/returned. * Setting it to true will assign and return auto-generated id (on all rows, one by one). * It's not true by default, because getting auto-generated id incurs an overhead of doing extra call (e.g LAST_INSERT_ID() in MySQL). */ assignGeneratedIds?: boolean; } export type CommonDBStreamOptions = CommonDBReadOptions; export interface CommonDBCreateOptions extends CommonDBOptions { /** * Caution! If set to true - will actually DROP the table! * * @default false */ dropIfExists?: boolean; } export interface RunQueryResult<T> { rows: T[]; endCursor?: string; } export type DBOperation = DBSaveBatchOperation<any> | DBDeleteByIdsOperation; export interface DBSaveBatchOperation<ROW extends ObjectWithId> { type: 'saveBatch'; table: string; rows: ROW[]; opt?: CommonDBSaveOptions<ROW>; } export interface DBDeleteByIdsOperation { type: 'deleteByIds'; table: string; ids: string[]; opt?: CommonDBOptions; } export declare enum DBRelation { ONE_TO_ONE = "ONE_TO_ONE", ONE_TO_MANY = "ONE_TO_MANY" } export declare enum DBModelType { DBM = "DBM", BM = "BM" }