Files
dbx/apps/desktop/src/lib/table/tableStructureEditorSql.ts
T

118 lines
2.9 KiB
TypeScript

import type { ColumnInfo, DatabaseType, ForeignKeyInfo, IndexInfo, TriggerInfo } from "@/types/database.ts";
export interface ColumnIdentity {
generation?: "BY DEFAULT" | "ALWAYS";
seed?: number;
increment?: number;
}
export interface ColumnExtra {
autoIncrement?: boolean;
onUpdateCurrentTimestamp?: boolean;
identity?: ColumnIdentity;
manticoreIndexed?: boolean;
manticoreStored?: boolean;
manticoreAttribute?: boolean;
manticoreSecondaryIndex?: boolean;
}
export interface EditableStructureColumn {
id: string;
name: string;
dataType: string;
enumValues?: string[];
isNullable: boolean;
defaultValue: string;
comment: string;
isPrimaryKey: boolean;
extra: ColumnExtra;
characterSet?: string;
collation?: string;
original?: ColumnInfo;
originalPosition?: number;
markedForDrop: boolean;
}
export interface EditableStructureIndex {
id: string;
name: string;
columns: string[];
nameEdited?: boolean;
isUnique: boolean;
isPrimary: boolean;
filter: string;
indexType: string;
includedColumns: string[];
comment: string;
/** Build the index with PostgreSQL `CREATE INDEX CONCURRENTLY` (PostgreSQL only, default off). */
concurrently?: boolean;
original?: IndexInfo;
markedForDrop: boolean;
}
export interface EditableStructureForeignKey {
id: string;
name: string;
column: string;
refSchema: string;
refTable: string;
refColumn: string;
onUpdate: string;
onDelete: string;
original?: ForeignKeyInfo;
markedForDrop: boolean;
}
export interface EditableStructureTrigger {
id: string;
name: string;
timing: string;
event: string;
statement: string;
original?: TriggerInfo;
markedForDrop: boolean;
}
export interface BuildTableStructureChangeSqlOptions {
databaseType?: DatabaseType;
schema?: string;
tableName: string;
columns: EditableStructureColumn[];
indexes: EditableStructureIndex[];
foreignKeys?: EditableStructureForeignKey[];
triggers?: EditableStructureTrigger[];
tableComment?: string;
originalTableComment?: string;
/** The target table is a PostgreSQL partitioned parent (`relkind = 'p'`);
* the backend rejects `CREATE INDEX CONCURRENTLY` on such tables (fail
* closed) instead of downgrading to a blocking `CREATE INDEX`. */
partitioned?: boolean;
/** When true, the connection is GaussDB M-mode which uses MySQL-compatible
* SQL dialect with backtick quoting. */
isGaussdbMMode?: boolean;
}
export interface TableStructureChangeSql {
statements: string[];
warnings: string[];
}
export interface BuildTableOwnerChangeSqlOptions {
databaseType?: DatabaseType;
schema?: string;
tableName: string;
owner: string;
originalOwner: string;
}
export interface SqliteTableStructureChangePreview extends TableStructureChangeSql {
schemaRevision: string;
}
export interface BuildSingleColumnAlterSqlOptions {
databaseType?: DatabaseType;
schema?: string;
tableName: string;
column: EditableStructureColumn;
}