database-checker.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * 数据库状态检查工具
  3. */
  4. const sqlite3 = require('sqlite3');
  5. const path = require('path');
  6. const fs = require('fs');
  7. const DB_PATH = path.join(__dirname, '../data/app.db');
  8. /**
  9. * 检查数据库是否已完全初始化
  10. */
  11. async function isDatabaseReady() {
  12. return new Promise((resolve) => {
  13. // 检查数据库文件是否存在
  14. if (!fs.existsSync(DB_PATH)) {
  15. resolve(false);
  16. return;
  17. }
  18. // 检查文件大小
  19. try {
  20. const stats = fs.statSync(DB_PATH);
  21. if (stats.size < 1024) {
  22. resolve(false);
  23. return;
  24. }
  25. } catch (error) {
  26. resolve(false);
  27. return;
  28. }
  29. // 检查数据库结构和数据
  30. const db = new sqlite3.Database(DB_PATH, (err) => {
  31. if (err) {
  32. resolve(false);
  33. return;
  34. }
  35. // 检查必要的表是否存在
  36. const requiredTables = ['users', 'configs', 'documents'];
  37. let checkedTables = 0;
  38. let allTablesReady = true;
  39. let tablesWithData = 0;
  40. requiredTables.forEach(tableName => {
  41. db.get(
  42. `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,
  43. [tableName],
  44. (err, row) => {
  45. if (err || !row) {
  46. allTablesReady = false;
  47. checkedTables++;
  48. checkComplete();
  49. return;
  50. }
  51. // 检查表是否有数据(至少用户表和配置表应该有数据)
  52. if (tableName === 'users' || tableName === 'configs') {
  53. db.get(`SELECT COUNT(*) as count FROM ${tableName}`, (err, countRow) => {
  54. if (err || !countRow || countRow.count === 0) {
  55. allTablesReady = false;
  56. } else {
  57. tablesWithData++;
  58. }
  59. checkedTables++;
  60. checkComplete();
  61. });
  62. } else {
  63. checkedTables++;
  64. checkComplete();
  65. }
  66. }
  67. );
  68. });
  69. function checkComplete() {
  70. if (checkedTables === requiredTables.length) {
  71. db.close((err) => {
  72. // 需要至少用户表和配置表有数据
  73. resolve(allTablesReady && tablesWithData >= 2);
  74. });
  75. }
  76. }
  77. });
  78. });
  79. }
  80. /**
  81. * 获取数据库统计信息
  82. */
  83. async function getDatabaseStats() {
  84. return new Promise((resolve) => {
  85. if (!fs.existsSync(DB_PATH)) {
  86. resolve(null);
  87. return;
  88. }
  89. const db = new sqlite3.Database(DB_PATH, (err) => {
  90. if (err) {
  91. resolve(null);
  92. return;
  93. }
  94. const stats = {};
  95. let completedQueries = 0;
  96. const tables = ['users', 'configs', 'documents'];
  97. tables.forEach(table => {
  98. db.get(`SELECT COUNT(*) as count FROM ${table}`, (err, row) => {
  99. completedQueries++;
  100. if (!err && row) {
  101. stats[table] = row.count;
  102. } else {
  103. stats[table] = 0;
  104. }
  105. if (completedQueries === tables.length) {
  106. db.close();
  107. resolve(stats);
  108. }
  109. });
  110. });
  111. });
  112. });
  113. }
  114. module.exports = {
  115. isDatabaseReady,
  116. getDatabaseStats
  117. };