55 lines
1.9 KiB
JavaScript
55 lines
1.9 KiB
JavaScript
/**
|
|
* Downgrades the database schema to a target version.
|
|
*
|
|
* npm run downgrade -- <targetVersion>
|
|
*
|
|
* Provider from env: DB_PROVIDER=sqlite (+ SQLITE_PATH) or mssql (MSSQL_*, default).
|
|
* Runs src/providers/<provider>/downgrade/<from>_to_<to>.js one step at a time,
|
|
* each in its own transaction. Not part of the server — the server only upgrades.
|
|
* Note: starting a server whose code knows a higher version upgrades again.
|
|
*/
|
|
import 'dotenv/config';
|
|
|
|
const [rawTarget] = process.argv.slice(2);
|
|
const target = Number(rawTarget);
|
|
if (!rawTarget || !Number.isInteger(target) || target < 1) {
|
|
console.error('Usage: npm run downgrade -- <targetVersion>');
|
|
process.exit(1);
|
|
}
|
|
|
|
const providerName = process.env.DB_PROVIDER || (process.env.SQLITE_PATH ? 'sqlite' : 'mssql');
|
|
let provider;
|
|
|
|
if (providerName === 'sqlite' || providerName === 'better-sqlite3') {
|
|
if (!process.env.SQLITE_PATH) {
|
|
console.error('SQLITE_PATH is required for DB_PROVIDER=sqlite');
|
|
process.exit(1);
|
|
}
|
|
const { BetterSqlite3Provider } = await import('../src/providers/sqlite3/index.js');
|
|
provider = new BetterSqlite3Provider({ filename: process.env.SQLITE_PATH, fileMustExist: true });
|
|
} else if (providerName === 'mssql') {
|
|
const { MssqlProvider } = await import('../src/providers/mssql/index.js');
|
|
provider = new MssqlProvider({
|
|
server: process.env.MSSQL_SERVER,
|
|
database: process.env.MSSQL_DATABASE,
|
|
user: process.env.MSSQL_USER,
|
|
password: process.env.MSSQL_PASSWORD,
|
|
options: { encrypt: false, trustServerCertificate: true },
|
|
});
|
|
} else {
|
|
console.error(`Unknown DB_PROVIDER: ${providerName}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
const before = await provider.getSchemaVersion();
|
|
const steps = await provider.downgradeSchema(target);
|
|
console.log(`Schema ${providerName}: ${before} -> ${target} (${steps} step(s))`);
|
|
} catch (err) {
|
|
console.error(`Downgrade failed: ${err.message}`);
|
|
process.exitCode = 1;
|
|
} finally {
|
|
await provider.close();
|
|
}
|
|
|