import { Version } from 'src/utils/version'; 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, } export const extName: Record = { cube: 'cube', earthdistance: 'earthdistance', vector: 'pgvector', vectors: 'pgvecto.rs', } as const; export interface VectorUpdateResult { restartRequired: boolean; } export const IDatabaseRepository = 'IDatabaseRepository'; export interface IDatabaseRepository { getExtensionVersion(extensionName: string): Promise; getAvailableExtensionVersion(extension: DatabaseExtension): Promise; getPreferredVectorExtension(): VectorExtension; getPostgresVersion(): Promise; createExtension(extension: DatabaseExtension): Promise; updateExtension(extension: DatabaseExtension, version?: Version): Promise; updateVectorExtension(extension: VectorExtension, version?: Version): 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; }