Replace Revit CSV backend with Linear XLSX
This commit is contained in:
parent
52d3b1a270
commit
1cfeb06ec7
65 changed files with 4764 additions and 3717 deletions
|
|
@ -4,13 +4,65 @@ const Database = require('better-sqlite3');
|
|||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const dataDir = path.resolve('data');
|
||||
const dataDir = path.resolve(
|
||||
process.env.LEISTUNGSBILANZ_DATA_DIR || 'data'
|
||||
);
|
||||
if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });
|
||||
|
||||
const sqlite = new Database(path.join(dataDir, 'leistungsbilanz.db'));
|
||||
const db = drizzle(sqlite);
|
||||
const databasePath = path.join(dataDir, 'leistungsbilanz.db');
|
||||
|
||||
migrate(db, { migrationsFolder: path.resolve('src/db/migrations') });
|
||||
sqlite.close();
|
||||
async function run() {
|
||||
const sqlite = new Database(databasePath);
|
||||
try {
|
||||
if (requiresLinearXlsxBackup(sqlite)) {
|
||||
const backupDir = path.join(dataDir, 'backups');
|
||||
fs.mkdirSync(backupDir, { recursive: true });
|
||||
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
||||
const backupPath = path.join(
|
||||
backupDir,
|
||||
`leistungsbilanz-before-linear-xlsx-${timestamp}.db`
|
||||
);
|
||||
await sqlite.backup(backupPath);
|
||||
verifyBackup(backupPath);
|
||||
console.log(`Verified pre-migration backup created: ${backupPath}`);
|
||||
}
|
||||
|
||||
console.log('Migrations applied');
|
||||
migrate(drizzle(sqlite), {
|
||||
migrationsFolder: path.resolve('src/db/migrations'),
|
||||
});
|
||||
} finally {
|
||||
sqlite.close();
|
||||
}
|
||||
console.log('Migrations applied');
|
||||
}
|
||||
|
||||
function requiresLinearXlsxBackup(sqlite) {
|
||||
const tables = new Set(
|
||||
sqlite.prepare("SELECT name FROM sqlite_master WHERE type = 'table'")
|
||||
.all()
|
||||
.map((row) => row.name)
|
||||
);
|
||||
return tables.has('external_csv_configurations') &&
|
||||
!tables.has('external_model_configurations');
|
||||
}
|
||||
|
||||
function verifyBackup(backupPath) {
|
||||
const backup = new Database(backupPath, { readonly: true, fileMustExist: true });
|
||||
try {
|
||||
const integrity = backup.pragma('integrity_check', { simple: true });
|
||||
const foreignKeyViolations = backup.pragma('foreign_key_check');
|
||||
if (integrity !== 'ok' || foreignKeyViolations.length > 0) {
|
||||
throw new Error(
|
||||
`Pre-migration backup verification failed: integrity=${integrity}, ` +
|
||||
`foreign-key violations=${foreignKeyViolations.length}`
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
backup.close();
|
||||
}
|
||||
}
|
||||
|
||||
run().catch((error) => {
|
||||
console.error('Migration failed:', error instanceof Error ? error.message : error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue