Files
dbx/apps/desktop/src/lib/fieldMappingPresets.ts
T

113 lines
5.7 KiB
TypeScript

import type { FieldMappingEntry } from "@/types/schemaDiff";
export interface FieldMappingPreset {
id: string;
label: string;
sourceDialect: string;
targetDialect: string;
mappings: FieldMappingEntry[];
}
export const FIELD_MAPPING_PRESETS: FieldMappingPreset[] = [
{
id: "mysql-to-dameng",
label: "MySQL → 达梦 (DM)",
sourceDialect: "mysql",
targetDialect: "dameng",
mappings: [
{ sourceType: "VARCHAR", targetType: "VARCHAR", paramStrategy: "preserve" },
{ sourceType: "CHAR", targetType: "CHAR", paramStrategy: "preserve" },
{ sourceType: "TEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "TINYTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "MEDIUMTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "LONGTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "INT", targetType: "INT", paramStrategy: "preserve" },
{ sourceType: "BIGINT", targetType: "BIGINT", paramStrategy: "preserve" },
{ sourceType: "DECIMAL", targetType: "NUMERIC", paramStrategy: "preserve" },
{ sourceType: "FLOAT", targetType: "FLOAT", paramStrategy: "preserve" },
{ sourceType: "DOUBLE", targetType: "DOUBLE", paramStrategy: "preserve" },
{ sourceType: "DATE", targetType: "DATE", paramStrategy: "preserve" },
{ sourceType: "DATETIME", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "TIMESTAMP", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "BLOB", targetType: "BLOB", paramStrategy: "strip" },
{ sourceType: "JSON", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "TINYINT", targetType: "TINYINT", paramStrategy: "preserve" },
{ sourceType: "SMALLINT", targetType: "SMALLINT", paramStrategy: "preserve" },
{ sourceType: "BOOLEAN", targetType: "BOOLEAN", paramStrategy: "preserve" },
],
},
{
id: "mysql-to-postgresql",
label: "MySQL → PostgreSQL",
sourceDialect: "mysql",
targetDialect: "postgresql",
mappings: [
{ sourceType: "VARCHAR", targetType: "VARCHAR", paramStrategy: "preserve" },
{ sourceType: "CHAR", targetType: "CHAR", paramStrategy: "preserve" },
{ sourceType: "TEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "TINYTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "MEDIUMTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "LONGTEXT", targetType: "TEXT", paramStrategy: "strip" },
{ sourceType: "INT", targetType: "INTEGER", paramStrategy: "preserve" },
{ sourceType: "BIGINT", targetType: "BIGINT", paramStrategy: "preserve" },
{ sourceType: "DECIMAL", targetType: "NUMERIC", paramStrategy: "preserve" },
{ sourceType: "FLOAT", targetType: "REAL", paramStrategy: "preserve" },
{ sourceType: "DOUBLE", targetType: "DOUBLE PRECISION", paramStrategy: "preserve" },
{ sourceType: "DATETIME", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "TIMESTAMP", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "BLOB", targetType: "BYTEA", paramStrategy: "strip" },
{ sourceType: "JSON", targetType: "JSONB", paramStrategy: "preserve" },
{ sourceType: "TINYINT", targetType: "SMALLINT", paramStrategy: "preserve" },
{ sourceType: "BOOLEAN", targetType: "BOOLEAN", paramStrategy: "preserve" },
],
},
{
id: "mysql-to-oracle",
label: "MySQL → Oracle",
sourceDialect: "mysql",
targetDialect: "oracle",
mappings: [
{ sourceType: "VARCHAR", targetType: "VARCHAR2", paramStrategy: "preserve" },
{ sourceType: "CHAR", targetType: "CHAR", paramStrategy: "preserve" },
{ sourceType: "TEXT", targetType: "CLOB", paramStrategy: "strip" },
{ sourceType: "TINYTEXT", targetType: "CLOB", paramStrategy: "strip" },
{ sourceType: "MEDIUMTEXT", targetType: "CLOB", paramStrategy: "strip" },
{ sourceType: "LONGTEXT", targetType: "CLOB", paramStrategy: "strip" },
{ sourceType: "INT", targetType: "NUMBER", paramStrategy: "preserve" },
{ sourceType: "BIGINT", targetType: "NUMBER", paramStrategy: "preserve" },
{ sourceType: "DECIMAL", targetType: "NUMBER", paramStrategy: "preserve" },
{ sourceType: "FLOAT", targetType: "BINARY_FLOAT", paramStrategy: "preserve" },
{ sourceType: "DOUBLE", targetType: "BINARY_DOUBLE", paramStrategy: "preserve" },
{ sourceType: "DATETIME", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "TIMESTAMP", targetType: "TIMESTAMP", paramStrategy: "preserve" },
{ sourceType: "BLOB", targetType: "BLOB", paramStrategy: "strip" },
{ sourceType: "JSON", targetType: "CLOB", paramStrategy: "strip" },
{ sourceType: "BOOLEAN", targetType: "NUMBER(1)", paramStrategy: "custom", customParams: "(1)" },
],
},
];
export function findPreset(sourceDialect: string, targetDialect: string): FieldMappingPreset | undefined {
// Look for exact forward match
const forward = FIELD_MAPPING_PRESETS.find((p) => p.sourceDialect === sourceDialect && p.targetDialect === targetDialect);
if (forward) return forward;
// Look for reverse match and auto-generate bidirectional preset
const reverse = FIELD_MAPPING_PRESETS.find((p) => p.sourceDialect === targetDialect && p.targetDialect === sourceDialect);
if (reverse) {
return {
id: `${reverse.id}-reverse`,
label: `${reverse.label.split(" → ").reverse().join(" → ")}`,
sourceDialect,
targetDialect,
mappings: reverse.mappings.map((m) => ({
sourceType: m.targetType,
targetType: m.sourceType,
paramStrategy: m.paramStrategy === "custom" ? "strip" : m.paramStrategy,
})),
};
}
return undefined;
}