Skip to content

Commit

Permalink
feat: super fast database dump and restore scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
eartharoid committed Feb 13, 2025
1 parent 43fe302 commit 413bae6
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 327 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"description": "The most popular open-source ticket management bot for Discord.",
"main": "src/",
"scripts": {
"db.dump": "node --no-warnings scripts/dump.mjs",
"db.restore": "node --no-warnings scripts/restore.mjs",
"db.dump": "node scripts/dump.mjs",
"db.restore": "node scripts/restore.mjs",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
"contributors:add": "all-contributors add",
"contributors:generate": "all-contributors generate",
Expand Down
61 changes: 61 additions & 0 deletions scripts/dump.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { config } from 'dotenv';
import fse from 'fs-extra';
import { join } from 'path';
import ora from 'ora';
import { PrismaClient } from '@prisma/client';
import DTF from '@eartharoid/dtf';

config();

const dtf = new DTF('en-GB');

let spinner = ora('Connecting').start();

fse.ensureDirSync(join(process.cwd(), './user/dumps'));
const file_path = join(process.cwd(), './user/dumps', `${dtf.fill('YYYY-MM-DD-HH-mm-ss')}-db.json`);

const prisma_options = {};

if (process.env.DB_PROVIDER === 'sqlite' && !process.env.DB_CONNECTION_URL) {
prisma_options.datasources = { db: { url: 'file:' + join(process.cwd(), './user/database.db') } };
}

const prisma = new PrismaClient(prisma_options);

if (process.env.DB_PROVIDER === 'sqlite') {
const { default: sqliteMiddleware } = await import('../src/lib/middleware/prisma-sqlite.js');
prisma.$use(sqliteMiddleware);
await prisma.$queryRaw`PRAGMA journal_mode=WAL;`;
await prisma.$queryRaw`PRAGMA synchronous=normal;`;
}

spinner.succeed('Connected');

export const models = [
'user',
'guild',
'tag',
'category',
'question',
'ticket',
'feedback',
'questionAnswer',
'archivedChannel',
'archivedRole',
'archivedUser',
'archivedMessage',
];

const dump = await Promise.all(
models.map(async model => {
spinner = ora(`Exporting ${model}`).start();
const data = await prisma[model].findMany();
spinner.succeed(`Exported ${data.length} from ${model}`);
return [model, data];
}),
);

spinner = ora('Writing').start();
await fse.promises.writeFile(file_path, JSON.stringify(dump));
spinner.succeed(`Written to "${file_path}"`);
process.exit(0);
117 changes: 0 additions & 117 deletions scripts/export.mjs

This file was deleted.

208 changes: 0 additions & 208 deletions scripts/import.mjs

This file was deleted.

Loading

0 comments on commit 413bae6

Please sign in to comment.