修复sql
This commit is contained in:
+24
-28
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user