123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include "databasemanager.h"
- #include <QDebug>
- #include <QDir>
- #include <QMessageBox>
- #include <QSqlError>
- #include <QSqlQuery>
- #include <QStandardPaths>
- #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");
- }
|