UNPKG

quicklite

Version:

A lightweight ORM toolkit for SQLite in Node.js applications

111 lines 4.25 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BackupUtil = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const better_sqlite3_1 = __importDefault(require("better-sqlite3")); /** * 数据库备份和恢复工具 */ class BackupUtil { /** * 创建数据库备份 * @param db 数据库实例 * @param backupPath 备份文件路径 * @param callback 可选的进度回调函数 * @returns 成功返回true,失败返回false */ static backup(db, backupPath, callback) { try { // 确保目标目录存在 const backupDir = path_1.default.dirname(backupPath); if (!fs_1.default.existsSync(backupDir)) { fs_1.default.mkdirSync(backupDir, { recursive: true }); } // 创建目标文件副本 const backupDb = new better_sqlite3_1.default(backupPath); // 执行数据库备份 const backupToFile = () => { // 创建备份数据流 const source = fs_1.default.createReadStream(db.name); const dest = fs_1.default.createWriteStream(backupPath); let totalBytes = 0; let processedBytes = 0; source.on('data', (chunk) => { processedBytes += chunk.length; if (callback) { callback({ totalPages: totalBytes > 0 ? Math.ceil(totalBytes / 4096) : 0, remainingPages: totalBytes > 0 ? Math.ceil((totalBytes - processedBytes) / 4096) : 0 }); } }); return new Promise((resolve, reject) => { source.on('error', (err) => reject(err)); dest.on('error', (err) => reject(err)); dest.on('finish', () => resolve()); source.pipe(dest); }); }; // 执行备份 fs_1.default.copyFileSync(db.name, backupPath); backupDb.close(); return true; } catch (error) { console.error('数据库备份失败:', error); return false; } } /** * 从备份文件恢复数据库 * @param backupPath 备份文件路径 * @param targetDbPath 目标数据库路径 * @param callback 可选的进度回调函数 * @returns 成功返回true,失败返回false */ static restore(backupPath, targetDbPath, callback) { try { // 确保目标目录存在 const targetDir = path_1.default.dirname(targetDbPath); if (!fs_1.default.existsSync(targetDir)) { fs_1.default.mkdirSync(targetDir, { recursive: true }); } // 检查源文件是否存在 if (!fs_1.default.existsSync(backupPath)) { throw new Error(`备份文件不存在: ${backupPath}`); } // 如果目标文件已存在则先删除 if (fs_1.default.existsSync(targetDbPath)) { fs_1.default.unlinkSync(targetDbPath); } // 直接复制文件 fs_1.default.copyFileSync(backupPath, targetDbPath); // 验证恢复的数据库 try { const testDb = new better_sqlite3_1.default(targetDbPath); testDb.close(); } catch (err) { throw new Error(`恢复的数据库文件损坏或无效: ${err}`); } // 模拟进度回调 if (callback) { callback({ totalPages: 1, remainingPages: 0 }); } return true; } catch (error) { console.error('数据库恢复失败:', error); return false; } } } exports.BackupUtil = BackupUtil; //# sourceMappingURL=BackupUtil.js.map