#include "databasemanager.h" #include #include #include #include #include #include #include "../utils/logger.h" #include "global.h" DatabaseManager& DatabaseManager::getInstance() { static DatabaseManager instance; return instance; } // 创建一个新的数据库连接 DatabaseManager::DatabaseManager() : db(QSqlDatabase::addDatabase("QSQLITE")) { // 设置SQLite数据库文件路径 QString appDataPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir appDataDir(appDataPath); if (!appDataDir.exists()) { appDataDir.mkpath("."); } QString dbPath = appDataPath + "/smartmine.db"; qDebug() << "Database path:" << dbPath; db.setDatabaseName(dbPath); try { if (!db.open()) { Logger::getInstance().error( QString("SQLite Connected error. path: %1, error: %2").arg(dbPath, db.lastError().text())); QMessageBox::critical(nullptr, "错误", QString("无法连接数据库, 请联系开发人员。\n 错误: %1").arg(db.lastError().text())); throw std::runtime_error("Database connection failed: " + db.lastError().text().toStdString()); } Logger::getInstance().info(QString("SQLite Connected. path: %1").arg(dbPath)); // 初始化数据库表结构 initializeTables(); } catch (const std::exception& e) { Logger::getInstance().error(QString("Database initialization failed: %1").arg(e.what())); QMessageBox::critical(nullptr, "错误", QString("数据库初始化失败: %1").arg(e.what())); } } DatabaseManager::~DatabaseManager() { if (db.isOpen()) { db.close(); } } QSqlDatabase& DatabaseManager::getDatabase() { return db; } void DatabaseManager::initializeTables() { QSqlQuery query(db); // 创建 h_project 表 (SQLite语法,基于提供的MySQL结构) QString createHProjectTable = R"( CREATE TABLE IF NOT EXISTS h_project ( id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT, name TEXT, company_code TEXT, htid TEXT, xmbh TEXT, operator_identity TEXT, safety_inspector_identity TEXT, blaster_identity TEXT, blast_count TEXT, address_path TEXT, level4_address TEXT, address_uuid TEXT, det_sum TEXT, file_name TEXT, file_url TEXT, blast_status TEXT, created_at TEXT, updated_at TEXT, deleted_at TEXT, create_by INTEGER, update_by INTEGER ) )"; if (!query.exec(createHProjectTable)) { Logger::getInstance().error(QString("Failed to create h_project table: %1").arg(query.lastError().text())); throw std::runtime_error("Failed to create h_project table"); } // 创建索引(可选,提高查询性能) query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_uuid ON h_project(uuid)"); query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_blast_status ON h_project(blast_status)"); query.exec("CREATE INDEX IF NOT EXISTS idx_h_project_deletion_date ON h_project(deletion_date)"); Logger::getInstance().info("Database tables initialized successfully"); }