123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /**
- * 数据库状态检查工具
- */
- const sqlite3 = require('sqlite3');
- const path = require('path');
- const fs = require('fs');
- const DB_PATH = path.join(__dirname, '../data/app.db');
- /**
- * 检查数据库是否已完全初始化
- */
- async function isDatabaseReady() {
- return new Promise((resolve) => {
- // 检查数据库文件是否存在
- if (!fs.existsSync(DB_PATH)) {
- resolve(false);
- return;
- }
- // 检查文件大小
- try {
- const stats = fs.statSync(DB_PATH);
- if (stats.size < 1024) {
- resolve(false);
- return;
- }
- } catch (error) {
- resolve(false);
- return;
- }
- // 检查数据库结构和数据
- const db = new sqlite3.Database(DB_PATH, (err) => {
- if (err) {
- resolve(false);
- return;
- }
- // 检查必要的表是否存在
- const requiredTables = ['users', 'configs', 'documents'];
- let checkedTables = 0;
- let allTablesReady = true;
- let tablesWithData = 0;
- requiredTables.forEach(tableName => {
- db.get(
- `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,
- [tableName],
- (err, row) => {
- if (err || !row) {
- allTablesReady = false;
- checkedTables++;
- checkComplete();
- return;
- }
- // 检查表是否有数据(至少用户表和配置表应该有数据)
- if (tableName === 'users' || tableName === 'configs') {
- db.get(`SELECT COUNT(*) as count FROM ${tableName}`, (err, countRow) => {
- if (err || !countRow || countRow.count === 0) {
- allTablesReady = false;
- } else {
- tablesWithData++;
- }
- checkedTables++;
- checkComplete();
- });
- } else {
- checkedTables++;
- checkComplete();
- }
- }
- );
- });
- function checkComplete() {
- if (checkedTables === requiredTables.length) {
- db.close((err) => {
- // 需要至少用户表和配置表有数据
- resolve(allTablesReady && tablesWithData >= 2);
- });
- }
- }
- });
- });
- }
- /**
- * 获取数据库统计信息
- */
- async function getDatabaseStats() {
- return new Promise((resolve) => {
- if (!fs.existsSync(DB_PATH)) {
- resolve(null);
- return;
- }
- const db = new sqlite3.Database(DB_PATH, (err) => {
- if (err) {
- resolve(null);
- return;
- }
- const stats = {};
- let completedQueries = 0;
- const tables = ['users', 'configs', 'documents'];
- tables.forEach(table => {
- db.get(`SELECT COUNT(*) as count FROM ${table}`, (err, row) => {
- completedQueries++;
- if (!err && row) {
- stats[table] = row.count;
- } else {
- stats[table] = 0;
- }
- if (completedQueries === tables.length) {
- db.close();
- resolve(stats);
- }
- });
- });
- });
- });
- }
- module.exports = {
- isDatabaseReady,
- getDatabaseStats
- };
|