import { StorageEngine } from '@aphro/schema-api'; import { SQLQuery } from '@aphro/sql-ts'; import { SID_of } from '@strut/sid'; import { IModel } from './INode'; export type EngineToResolved = { sqlite: SQLResolvedDB; postgres: SQLResolvedDB; memory: MemoryResolvedDB; // ephermal models should never hit the resolver ephemeral: ThrowsDB; }; export interface DBResolver { engine(engine: E): SpecificTypedDBResolver; } export interface SpecificTypedDBResolver { db(db: string): T; } export type ResolvedDB = SQLResolvedDB | MemoryResolvedDB; export type SQLResolvedDB = { read(q: SQLQuery): Promise; write(q: SQLQuery): Promise; transact(cb: (conn: SQLResolvedDB) => Promise): Promise; dispose(): void; }; /* try { await db.query(sql`BEGIN`); await db.query(sql`COMMIT`); } catch (e) { await db.query(sql`ROLLBACK`); throw { cause: e, message: 'Failed to commit the migration. Rolling it back. ' + (e as any)?.message, }; } */ export type MemoryReadQuery = { type: 'read'; tablish: string; // undefined --> all // [] --> none // [id, ...] --> specific ids roots?: SID_of[]; }; export type MemoryWriteQuery = { type: 'write'; op: 'delete' | 'upsert'; tablish: string; models: IModel[]; }; export type MemoryQuery = MemoryReadQuery | MemoryWriteQuery; export type MemoryResolvedDB = { read(q: MemoryReadQuery): Promise; write(q: MemoryWriteQuery): Promise; transact(cb: (conn: MemoryResolvedDB) => Promise): Promise; dispose(): void; }; export type ThrowsDB = { read(q: any): Promise; write(q: any): Promise; transact(cb: (conn: ThrowsDB) => Promise): Promise; dispose(): void; };