Release 2.5.2

This commit is contained in:
2026-08-03 19:18:30 +01:00
parent 37345f3949
commit 9d5029eff6
21 changed files with 195 additions and 49 deletions
+40 -14
View File
@@ -55,16 +55,7 @@ const VERSIONED_MIGRATIONS = [
}
// Recreate the screen-to-player foreign key after the column exists and legacy data is copied over.
const [screenPlayerFkRows] = await pool.query(
`SELECT COUNT(*) AS fk_count
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'd_screens'
AND CONSTRAINT_NAME = 'fk_screens_player'`
);
if (Number(screenPlayerFkRows && screenPlayerFkRows[0] && screenPlayerFkRows[0].fk_count) === 0) {
await pool.query('ALTER TABLE d_screens ADD CONSTRAINT fk_screens_player FOREIGN KEY (player_id) REFERENCES d_players(device_id) ON DELETE RESTRICT');
}
await ensureForeignKey(pool, 'd_screens', 'fk_screens_player', 'player_id', 'd_players', 'device_id', 'RESTRICT');
if (await columnExists(pool, 'c_template_regions', 'font_family')) {
await pool.query('ALTER TABLE c_template_regions DROP COLUMN font_family');
@@ -243,24 +234,59 @@ async function ensureColumn(pool, tableName, columnName, columnDefinition, after
}
const afterClause = afterColumn ? ' AFTER ' + afterColumn : '';
await pool.query('ALTER TABLE ' + tableName + ' ADD COLUMN ' + columnName + ' ' + columnDefinition + afterClause);
try {
await pool.query('ALTER TABLE ' + tableName + ' ADD COLUMN ' + columnName + ' ' + columnDefinition + afterClause);
} catch (error) {
if (!error || (error.code !== 'ER_DUP_FIELDNAME' && error.errno !== 1060)) {
throw error;
}
}
}
async function ensureForeignKey(pool, tableName, constraintName, columnName, referencedTable, referencedColumn, onDeleteAction) {
const [rows] = await pool.query(
const [existingFkRows] = await pool.query(
`SELECT COUNT(*) AS fk_count
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = ?
AND COLUMN_NAME = ?
AND REFERENCED_TABLE_NAME IS NOT NULL`,
[tableName, columnName]
);
if (Number(existingFkRows && existingFkRows[0] && existingFkRows[0].fk_count) > 0) {
return;
}
const [rows] = await pool.query(
`SELECT COUNT(*) AS fk_count
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND CONSTRAINT_NAME = ?`,
[tableName, constraintName]
[constraintName]
);
if (Number(rows && rows[0] && rows[0].fk_count) > 0) {
return;
}
await pool.query('ALTER TABLE ' + tableName + ' ADD CONSTRAINT ' + constraintName + ' FOREIGN KEY (' + columnName + ') REFERENCES ' + referencedTable + '(' + referencedColumn + ') ON DELETE ' + onDeleteAction);
const fallbackNames = [
constraintName,
tableName + '_' + columnName + '_fk',
tableName + '_' + columnName + '_fk_2',
tableName + '_' + columnName + '_fk_3'
];
for (const candidateName of fallbackNames) {
try {
await pool.query('ALTER TABLE ' + tableName + ' ADD CONSTRAINT ' + candidateName + ' FOREIGN KEY (' + columnName + ') REFERENCES ' + referencedTable + '(' + referencedColumn + ') ON DELETE ' + onDeleteAction);
return;
} catch (error) {
if (!error || (error.code !== 'ER_FK_DUP_NAME' && error.errno !== 1826)) {
throw error;
}
}
}
}
async function dropColumnIfExists(pool, tableName, columnName) {