export enum DatabaseExtension { CUBE = 'cube', EARTH_DISTANCE = 'earthdistance', VECTOR = 'vector', VECTORS = 'vectors', } export type VectorExtension = DatabaseExtension.VECTOR | DatabaseExtension.VECTORS; export enum VectorIndex { CLIP = 'clip_index', FACE = 'face_index', } export enum DatabaseLock { GeodataImport = 100, Migrations = 200, StorageTemplateMigration = 420, CLIPDimSize = 512, LibraryWatch = 1337, GetSystemConfig = 69, } export const EXTENSION_NAMES: Record = { cube: 'cube', earthdistance: 'earthdistance', vector: 'pgvector', vectors: 'pgvecto.rs', } as const; export interface ExtensionVersion { availableVersion: string | null; installedVersion: string | null; } export interface VectorUpdateResult { restartRequired: boolean; } export const IDatabaseRepository = 'IDatabaseRepository'; export interface IDatabaseRepository { reconnect(): Promise; getExtensionVersion(extension: DatabaseExtension): Promise; getExtensionVersionRange(extension: VectorExtension): string; getPostgresVersion(): Promise; getPostgresVersionRange(): string; createExtension(extension: DatabaseExtension): Promise; updateExtension(extension: DatabaseExtension, version?: string): Promise; updateVectorExtension(extension: VectorExtension, version?: string): Promise; reindex(index: VectorIndex): Promise; shouldReindex(name: VectorIndex): Promise; runMigrations(options?: { transaction?: 'all' | 'none' | 'each' }): Promise; withLock(lock: DatabaseLock, callback: () => Promise): Promise; tryLock(lock: DatabaseLock): Promise; isBusy(lock: DatabaseLock): boolean; wait(lock: DatabaseLock): Promise; }