113 lines
5.7 KiB
TypeScript
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;
|
|
}
|