修复sql

This commit is contained in:
2025-10-22 10:08:24 +08:00
parent 81a6233cbc
commit 3677d3ca8c
5 changed files with 30 additions and 31 deletions
+24 -28
View File
@@ -33,7 +33,7 @@ class SQLiteDB {
public:
QSqlDatabase db;
// 新增:全局互斥锁,保护所有数据库操作
mutable std::mutex db_mutex;
mutable QMutex db_mutex;
SQLiteDB(const QString& dbPath)
: dbPath(dbPath) {
@@ -43,7 +43,7 @@ public:
// 所有公有方法加锁保护
bool execute(const QString& queryStr, const QVariantList& args = {}) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QSqlQuery query(db);
query.prepare(queryStr);
@@ -60,7 +60,7 @@ public:
}
QList<QMap<QString, QVariant>> query(const QString& queryStr, const QVariantList& args = {}) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QList<QMap<QString, QVariant>> results;
QSqlQuery query(db);
query.prepare(queryStr);
@@ -87,7 +87,7 @@ public:
}
bool createTable(const QString& tableName, const QList<std::pair<QString, QString>>& columns) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (columns.empty()) {
qDebug() << "Create table failed: columns are empty.";
return false;
@@ -107,7 +107,7 @@ public:
}
std::vector<QString> getTables() {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
std::vector<QString> tables;
QString sql = "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';";
QSqlQuery query(db);
@@ -122,13 +122,13 @@ public:
}
bool dropTable(const QString& tableName) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QString sql = QString("DROP TABLE IF EXISTS %1").arg(tableName);
return execute(sql);
}
bool addColumn(const QString& tableName, const QString& columnName, const QString& columnType) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (columnName.isEmpty() || columnType.isEmpty()) {
qDebug() << "Add column failed: column name or type is empty.";
return false;
@@ -149,7 +149,7 @@ public:
}
bool tableExists(const QString& tableName) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QString sql = QString("SELECT name FROM sqlite_master WHERE type='table' AND name='%1';").arg(tableName);
QList<QMap<QString, QVariant>> result = query(sql);
@@ -158,7 +158,7 @@ public:
bool _insert(const QString& tableName,
const std::map<QString, QVariant>& data) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (data.empty()) {
qDebug() << "Insert failed: data is empty.";
return false;
@@ -200,7 +200,7 @@ public:
bool _update(const QString& tableName,
const std::map<QString, QVariant>& data,
const std::map<QString, QVariant>& conditions) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (data.empty() || conditions.empty()) {
qDebug() << "Update failed: data or conditions are empty.";
return false;
@@ -242,7 +242,7 @@ public:
bool _delete(const QString& tableName,
const std::map<QString, QVariant>& conditions) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (conditions.empty()) {
qDebug() << "Delete failed: conditions are empty.";
return false;
@@ -275,7 +275,7 @@ public:
std::vector<std::map<QString, QVariant>> _search(const QString& tableName,
const QStringList& columns,
const std::map<QString, QVariant>& conditions = {}) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QStringList selectColumns = columns.isEmpty() ? QStringList("*") : columns;
QString sql = QString("SELECT %1 FROM \"%2\"").arg(selectColumns.join(", "), tableName);
@@ -316,13 +316,13 @@ public:
}
QList<QMap<QString, QVariant>> queryTabelData(const QString& tableName) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
QString sql = QString("SELECT * FROM \"%1\"").arg(tableName);
return query(sql);
}
bool exportTableToCSV(const QString& tableName, const QString& filePath, std::mutex& _mutex) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
using namespace std::chrono;
auto start = high_resolution_clock::now();
@@ -372,7 +372,7 @@ public:
}
bool setWALMode(bool enableWAL = true, int busyTimeoutMs = 3000) {
std::lock_guard<std::mutex> lock(db_mutex);
QMutexLocker lock(&db_mutex);
if (!db.isOpen()) {
qWarning() << "Database is not open, cannot set WAL mode.";
return false;
@@ -498,12 +498,12 @@ public:
}
bool isNewData(const QString& snCode) {
std::lock_guard<std::mutex> locker(db->db_mutex);
QMutexLocker locker(&db->db_mutex);
auto res = db->_search(getCurrentProcessCsvName(), {}, { {"条码",snCode} });
return res.empty();
}
bool isNgData(const QString& snCode) {
std::lock_guard<std::mutex> locker(db->db_mutex);
QMutexLocker locker(&db->db_mutex);
auto res = db->_search(getCurrentProcessCsvName(), {}, { {"条码",snCode} });
if (res.empty() == true)
return false;
@@ -516,15 +516,17 @@ public:
void run() override{
while (queue.size() > 0) {
queueLock.lock();
auto val = queue.dequeue();
queueLock.unlock();
std::pair<QString, std::map<QString, QVariant>> val;
{
QMutexLocker locker(&queueLock);
val = queue.dequeue();
}
try {
auto snCode = val.first;
auto data = val.second;
QString currentProcessCsvName = getCurrentProcessCsvName();
if (currentProcessCsvName != currentProcessCsvNameCache) {
std::lock_guard<std::mutex> locker(db->db_mutex);
QMutexLocker locker(&db->db_mutex);
if (!db->createTable(currentProcessCsvName, db_InitColumns)) {
qWarning() << "addtData: Failed to create table:" << currentProcessCsvName;
return;
@@ -533,7 +535,7 @@ public:
}
QList<QString> tableColumns;
{
std::lock_guard<std::mutex> locker(db->db_mutex);
QMutexLocker locker(&db->db_mutex);
QSqlQuery colQuery(db->db);
QString colSql = QString("PRAGMA table_info(\"%1\")").arg(currentProcessCsvName);
if (colQuery.exec(colSql)) {
@@ -543,7 +545,6 @@ public:
}
}
for (const auto& kv : data) {
std::lock_guard<std::mutex> locker(db->db_mutex);
if (!tableColumns.contains(kv.first)) {
if (!db->addColumn(currentProcessCsvName, kv.first, "TEXT")) {
qWarning() << "addtData: Failed to add column:" << kv.first << "to table:" << currentProcessCsvName;
@@ -552,7 +553,6 @@ public:
}
std::vector<std::map<QString, QVariant>> res;
{
std::lock_guard<std::mutex> locker(db->db_mutex);
res = db->_search(currentProcessCsvName, {}, { {"条码",snCode} });
}
QString nowTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
@@ -560,7 +560,6 @@ public:
if (res.empty()) {
std::vector<std::map<QString, QVariant>> lastRes;
{
std::lock_guard<std::mutex> locker(db->db_mutex);
lastRes = db->_search(getLastProcessCsvName(), {}, { {"条码",snCode} });
}
if (lastRes.empty()) {
@@ -568,7 +567,6 @@ public:
insertData["条码"] = snCode;
insertData["创建时间"] = nowTime;
insertData["修改时间"] = nowTime;
std::lock_guard<std::mutex> locker(db->db_mutex);
opResult = db->_insert(currentProcessCsvName, insertData);
if (!opResult) {
qWarning() << "addtData: Insert failed for table:" << currentProcessCsvName << "snCode:" << snCode;
@@ -577,7 +575,6 @@ public:
else {
std::map<QString, QVariant> updateData = data;
updateData["修改时间"] = nowTime;
std::lock_guard<std::mutex> locker(db->db_mutex);
opResult = db->_update(getLastProcessCsvName(), updateData, { {"条码",snCode} });
if (!opResult) {
qWarning() << "addtData: Update failed for table:" << getLastProcessCsvName() << "snCode:" << snCode;
@@ -587,7 +584,6 @@ public:
else {
std::map<QString, QVariant> updateData = data;
updateData["修改时间"] = nowTime;
std::lock_guard<std::mutex> locker(db->db_mutex);
opResult = db->_update(getCurrentProcessCsvName(), updateData, { {"条码",snCode} });
if (!opResult) {
qWarning() << "addtData: Update failed for table:" << getCurrentProcessCsvName() << "snCode:" << snCode;