53 lines
1.9 KiB
JavaScript
53 lines
1.9 KiB
JavaScript
import MariaDBQuoteGen from "./mariadb-quote-gen";
|
|
import runSchemaQuery, { querySchemaRows } from "./run-schema-query";
|
|
import schemaCondition from "./schema-condition";
|
|
function columnsEqual(a, b) {
|
|
return a.length === b.length && a.every((col, i) => col === b[i]);
|
|
}
|
|
export function grabDesiredPrimaryKeyColumns(table) {
|
|
return (table.fields || [])
|
|
.filter((field) => field.primaryKey && field.fieldName)
|
|
.map((field) => field.fieldName);
|
|
}
|
|
async function grabLivePrimaryKeyColumns({ tableName, config, }) {
|
|
const schemaCond = schemaCondition(config);
|
|
const rows = await querySchemaRows({
|
|
query: `
|
|
SELECT COLUMN_NAME, ORDINAL_POSITION
|
|
FROM information_schema.KEY_COLUMN_USAGE
|
|
WHERE ${schemaCond.where}
|
|
AND TABLE_NAME = ?
|
|
AND CONSTRAINT_NAME = 'PRIMARY'
|
|
ORDER BY ORDINAL_POSITION
|
|
`,
|
|
values: [...schemaCond.values, tableName],
|
|
config,
|
|
});
|
|
return rows.map((row) => row.COLUMN_NAME);
|
|
}
|
|
export default async function syncPrimaryKey({ table, config, }) {
|
|
const desired = grabDesiredPrimaryKeyColumns(table);
|
|
const live = await grabLivePrimaryKeyColumns({
|
|
tableName: table.tableName,
|
|
config,
|
|
});
|
|
if (columnsEqual(desired, live)) {
|
|
return;
|
|
}
|
|
if (live.length > 0) {
|
|
console.log(`Dropping primary key on ${table.tableName}`);
|
|
await runSchemaQuery({
|
|
query: `ALTER TABLE ${MariaDBQuoteGen(table.tableName)} DROP PRIMARY KEY`,
|
|
config,
|
|
});
|
|
}
|
|
if (desired.length > 0) {
|
|
const cols = desired.map((col) => MariaDBQuoteGen(col)).join(", ");
|
|
console.log(`Creating primary key (${desired.join(", ")}) on ${table.tableName}`);
|
|
await runSchemaQuery({
|
|
query: `ALTER TABLE ${MariaDBQuoteGen(table.tableName)} ADD PRIMARY KEY (${cols})`,
|
|
config,
|
|
});
|
|
}
|
|
}
|