/** * Tina4 MongoDB Adapter — uses the `mongodb` package (optional peer dependency). * * Install: npm install mongodb * URL format: mongodb://host:port/dbname or mongodb+srv://user:pass@host/dbname */ import type { DatabaseAdapter, DatabaseResult, ColumnInfo, FieldDefinition } from "../types.js"; export interface MongoConfig { host?: string; port?: number; user?: string; password?: string; database?: string; connectionString?: string; } export declare class MongodbAdapter implements DatabaseAdapter { private config; private client; private db; private session; private _lastInsertId; private _inTransaction; private _connectionString; private _dbName; constructor(config: MongoConfig | string); /** Connect to MongoDB. Must be called before using the adapter. */ /** ADR-0044 required adapter capability. */ getDatabaseType(): string; /** ADR-0044: readable/writable native boolean. */ autocommit: boolean; /** * ADR-0044 / DBA-P02: every built-in adapter can guarantee an atomic * multi-row batch by default. A test-only deployment representing one * that cannot sets this false so executeMany rejects BEFORE the first * write rather than risking partial durability. */ supportsAtomicBatch: boolean; connect(): Promise; private ensureConnected; /** Execute a SQL-like statement translated to a MongoDB operation. */ execute(sql: string, params?: unknown[]): unknown; executeAsync(sql: string, params?: unknown[]): Promise; executeMany(sql: string, paramsList: unknown[][]): { totalAffected: number; lastId?: number | bigint; }; executeManyAsync(sql: string, paramsList: unknown[][]): Promise<{ totalAffected: number; lastId?: number | bigint; }>; query>(sql: string, params?: unknown[]): T[]; queryAsync>(sql: string, params?: unknown[]): Promise; fetch>(sql: string, params?: unknown[], limit?: number, skip?: number): T[]; fetchAsync>(sql: string, params?: unknown[], limit?: number, skip?: number): Promise; fetchOne>(sql: string, params?: unknown[]): T | null; fetchOneAsync>(sql: string, params?: unknown[]): Promise; /** * Atomic, monotonic, concurrency-safe next id — feature 16. A * findOneAndUpdate($inc) on the tina4_sequences collection, keyed by _id (its * built-in unique index makes concurrent first-use upserts race-safe: two * callers can never create two counters for one table). Seeds from * MAX(pkColumn) the FIRST time only ($setOnInsert). Throws on an impossible * empty result rather than returning a fixed id that could collide with a row. */ getNextId(table: string, pkColumn?: string): Promise; insert(table: string, data: Record | Record[]): DatabaseResult; insertAsync(table: string, data: Record | Record[]): Promise; update(table: string, data: Record, filter: Record): DatabaseResult; updateAsync(table: string, data: Record, filter: Record): Promise; delete(table: string, filter: Record | string | Record[]): DatabaseResult; deleteAsync(table: string, filter: Record | string | Record[]): Promise; startTransaction(): void; startTransactionAsync(): Promise; commit(): void; commitAsync(): Promise; rollback(): void; rollbackAsync(): Promise; getTables(): string[]; tablesAsync(): Promise; getColumns(table: string): ColumnInfo[]; /** * Infer column schema by sampling a document from the collection. * MongoDB is schema-less; this returns field names and inferred JS types. */ columnsAsync(table: string): Promise; lastInsertId(): number | bigint | null; close(): void; tableExists(name: string): boolean; tableExistsAsync(name: string): Promise; createTable(name: string, columns: Record): void; /** * Create a MongoDB collection with optional JSON schema validation derived * from the Tina4 field definitions. */ createTableAsync(name: string, columns: Record): Promise; /** Get column info as a plain array (legacy migration support). */ getTableColumnsAsync(table: string): Promise>; }