databasemanager.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "databasemanager.h"
  2. #include <QDebug>
  3. #include <QDir>
  4. #include <QMessageBox>
  5. #include <QSqlError>
  6. #include <QSqlQuery>
  7. #include <QStandardPaths>
  8. #include "global.h"
  9. #include "logger.h"
  10. DatabaseManager& DatabaseManager::getInstance() {
  11. static DatabaseManager instance;
  12. return instance;
  13. }
  14. // 创建一个新的数据库连接
  15. DatabaseManager::DatabaseManager() : db(QSqlDatabase::addDatabase("QSQLITE")) {
  16. // 设置SQLite数据库文件路径
  17. QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
  18. QDir appDataDir(appDataPath);
  19. if (!appDataDir.exists()) {
  20. appDataDir.mkpath(".");
  21. }
  22. QString dbPath = appDataPath + "/smartmine.db";
  23. qDebug() << "Database path:" << dbPath;
  24. db.setDatabaseName(dbPath);
  25. try {
  26. if (!db.open()) {
  27. Logger::getInstance().error(
  28. QString("SQLite Connected error. path: %1, error: %2").arg(dbPath, db.lastError().text()));
  29. QMessageBox::critical(nullptr, "错误",
  30. QString("无法连接数据库, 请联系开发人员。\n 错误: %1").arg(db.lastError().text()));
  31. throw std::runtime_error("Database connection failed: " + db.lastError().text().toStdString());
  32. }
  33. Logger::getInstance().info(QString("SQLite Connected. path: %1").arg(dbPath));
  34. // 初始化数据库表结构
  35. initializeTables();
  36. } catch (const std::exception& e) {
  37. Logger::getInstance().error(QString("Database initialization failed: %1").arg(e.what()));
  38. QMessageBox::critical(nullptr, "错误", QString("数据库初始化失败: %1").arg(e.what()));
  39. }
  40. }
  41. DatabaseManager::~DatabaseManager() {
  42. if (db.isOpen()) {
  43. db.close();
  44. }
  45. }
  46. QSqlDatabase& DatabaseManager::getDatabase() { return db; }
  47. void DatabaseManager::initializeTables() {
  48. QSqlQuery query(db);
  49. // 创建 h_project 表 (SQLite语法,基于提供的MySQL结构)
  50. QString createHProjectTable = R"(
  51. CREATE TABLE IF NOT EXISTS h_project (
  52. id INTEGER PRIMARY KEY AUTOINCREMENT,
  53. uuid TEXT,
  54. name TEXT,
  55. company_code TEXT,
  56. htid TEXT,
  57. xmbh TEXT,
  58. operator_identity TEXT,
  59. safety_inspector_identity TEXT,
  60. blaster_identity TEXT,
  61. blast_count TEXT,
  62. address_path TEXT,
  63. level4_address TEXT,
  64. address_uuid TEXT,
  65. det_sum TEXT,
  66. file_name TEXT,
  67. file_url TEXT,
  68. blast_status TEXT,
  69. created_at TEXT,
  70. updated_at TEXT,
  71. deleted_at TEXT,
  72. create_by INTEGER,
  73. update_by INTEGER
  74. )
  75. )";
  76. if (!query.exec(createHProjectTable)) {
  77. Logger::getInstance().error(QString("Failed to create h_project table: %1").arg(query.lastError().text()));
  78. throw std::runtime_error("Failed to create h_project table");
  79. }
  80. // 创建索引(可选,提高查询性能)
  81. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_uuid ON h_project(uuid)");
  82. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_blast_status ON h_project(blast_status)");
  83. query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_deletion_date ON h_project(deletion_date)");
  84. Logger::getInstance().info("Database tables initialized successfully");
  85. }