quicklite
Version:
A lightweight ORM toolkit for SQLite in Node.js applications
111 lines • 4.25 kB
JavaScript
;
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