51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
import { connect } from '@tursodatabase/database';
|
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
import { basename, dirname, resolve } from 'node:path';
|
|
import process from 'node:process';
|
|
|
|
const databasePath = resolve(process.env.TDR_DATABASE_PATH || './data/shd-build-development.db');
|
|
const requestedOutput = process.argv[2];
|
|
const timestamp = new Date().toISOString().replaceAll(':', '-').replace(/\.\d{3}Z$/, 'Z');
|
|
const databaseName = basename(databasePath).replace(/\.[^.]+$/, '');
|
|
const outputPath = resolve(
|
|
requestedOutput || `./data/backups/${databaseName}-${timestamp}.json`
|
|
);
|
|
const quoteIdentifier = (identifier) => `"${String(identifier).replaceAll('"', '""')}"`;
|
|
|
|
await mkdir(dirname(outputPath), { recursive: true });
|
|
const database = await connect(databasePath);
|
|
const tableRows = await (
|
|
await database.prepare(`
|
|
SELECT name
|
|
FROM sqlite_master
|
|
WHERE type = 'table'
|
|
AND name NOT LIKE 'sqlite_%'
|
|
ORDER BY rowid
|
|
`)
|
|
).all();
|
|
|
|
const tables = [];
|
|
let totalRows = 0;
|
|
for (const tableRow of tableRows) {
|
|
const name = String(tableRow.name);
|
|
const rows = await (await database.prepare(`SELECT * FROM ${quoteIdentifier(name)}`)).all();
|
|
tables.push({ name, rowCount: rows.length, rows });
|
|
totalRows += rows.length;
|
|
}
|
|
|
|
const backup = {
|
|
format: 'shd-build-database-backup',
|
|
version: 1,
|
|
createdAt: new Date().toISOString(),
|
|
sourceDatabase: basename(databasePath),
|
|
totalRows,
|
|
tables
|
|
};
|
|
await writeFile(outputPath, `${JSON.stringify(backup, null, 2)}\n`, {
|
|
encoding: 'utf8',
|
|
flag: 'wx'
|
|
});
|
|
|
|
console.log(`Backed up ${totalRows} rows from ${tables.length} tables.`);
|
|
console.log(`Backup: ${outputPath}`);
|