86 lines
3.6 KiB
TypeScript
86 lines
3.6 KiB
TypeScript
import type { ColumnInfo, DatabaseType } from "@/types/database";
|
|
import { getDatabaseCapability } from "./databaseCapabilities";
|
|
|
|
export const DBX_ROWID_COLUMN = "__DBX_ROWID";
|
|
export const DBX_NEO4J_ELEMENT_ID_COLUMN = "__DBX_ELEMENT_ID";
|
|
export const DBX_TDENGINE_TBNAME_COLUMN = "tbname";
|
|
|
|
export function editablePrimaryKeys(databaseType: DatabaseType | undefined, columns: ColumnInfo[]): string[] {
|
|
const primaryKeys = columns.filter((column) => column.is_primary_key).map((column) => column.name);
|
|
if (databaseType === "tdengine" && primaryKeys.length > 0) return [DBX_TDENGINE_TBNAME_COLUMN, ...primaryKeys];
|
|
const syntheticKey = getDatabaseCapability(databaseType).syntheticKey;
|
|
if (syntheticKey === "oracle-rowid" && primaryKeys.length === 0) return [DBX_ROWID_COLUMN];
|
|
if (syntheticKey === "neo4j-element-id" && primaryKeys.length === 0) return [DBX_NEO4J_ELEMENT_ID_COLUMN];
|
|
return primaryKeys;
|
|
}
|
|
|
|
export function isTableDataEditable(databaseType: DatabaseType | undefined, primaryKeys: string[]): boolean {
|
|
const cap = getDatabaseCapability(databaseType).tableData;
|
|
if (cap.readonly) return false;
|
|
if (cap.insert) return true;
|
|
return primaryKeys.length > 0;
|
|
}
|
|
|
|
export function supportsDataGridTransaction(databaseType: DatabaseType | undefined): boolean {
|
|
return getDatabaseCapability(databaseType).tableData.transaction;
|
|
}
|
|
|
|
export function usesKeylessRowPredicate(databaseType: DatabaseType | undefined): boolean {
|
|
return !!getDatabaseCapability(databaseType).tableData.keylessRowPredicate;
|
|
}
|
|
|
|
export function canEditExistingTableRows(
|
|
databaseType: DatabaseType | undefined,
|
|
hiveTableTransactional?: boolean,
|
|
primaryKeys?: string[],
|
|
): boolean {
|
|
const tableData = getDatabaseCapability(databaseType).tableData;
|
|
if (tableData.readonly) return false;
|
|
if (tableData.existingRowsReadonly) return false;
|
|
if (tableData.requiresTransactionalTableForExistingRows && hiveTableTransactional !== true) return false;
|
|
if (databaseType === "tdengine" && !primaryKeys?.some((key) => key.toLowerCase() === DBX_TDENGINE_TBNAME_COLUMN))
|
|
return false;
|
|
if (tableData.updateRequiresPrimaryKey && primaryKeys && primaryKeys.length === 0) return false;
|
|
return true;
|
|
}
|
|
|
|
export function hiveTablePropertiesIndicateTransactional(result: { rows: readonly (readonly unknown[])[] }): boolean {
|
|
return result.rows.some((row) => {
|
|
const name = String(row[0] ?? "")
|
|
.trim()
|
|
.toLowerCase();
|
|
const value = String(row[1] ?? "")
|
|
.trim()
|
|
.toLowerCase();
|
|
return name === "transactional" && value === "true";
|
|
});
|
|
}
|
|
|
|
export function usesSyntheticRowIdKey(databaseType: DatabaseType | undefined, primaryKeys: string[]): boolean {
|
|
return (
|
|
primaryKeys.length === 1 &&
|
|
((databaseType === "oracle" && primaryKeys[0].toUpperCase() === DBX_ROWID_COLUMN) ||
|
|
(databaseType === "neo4j" && primaryKeys[0] === DBX_NEO4J_ELEMENT_ID_COLUMN))
|
|
);
|
|
}
|
|
|
|
export function isHiddenGridColumn(
|
|
databaseType: DatabaseType | undefined,
|
|
column: string,
|
|
primaryKeys: string[],
|
|
): boolean {
|
|
if (databaseType === "neo4j" && column === DBX_NEO4J_ELEMENT_ID_COLUMN) return true;
|
|
return usesSyntheticRowIdKey(databaseType, primaryKeys) && column.toUpperCase() === DBX_ROWID_COLUMN;
|
|
}
|
|
|
|
export function isTdengineExistingRowReadonlyColumn(
|
|
databaseType: DatabaseType | undefined,
|
|
column: string,
|
|
columns: ColumnInfo[],
|
|
): boolean {
|
|
if (databaseType !== "tdengine") return false;
|
|
if (column.toLowerCase() === DBX_TDENGINE_TBNAME_COLUMN) return true;
|
|
const columnInfo = columns.find((info) => info.name.toLowerCase() === column.toLowerCase());
|
|
return !!columnInfo?.is_primary_key || /\btag\b/i.test(columnInfo?.extra ?? "");
|
|
}
|