|
@@ -0,0 +1,134 @@
|
|
|
+#include "groupdb.h"
|
|
|
+
|
|
|
+groupdb::groupdb(std::string strdbpath)
|
|
|
+{
|
|
|
+ //建立并打开数据库
|
|
|
+ mdatabase = QSqlDatabase::addDatabase("QSQLITE");
|
|
|
+ mdatabase.setDatabaseName(strdbpath.data());
|
|
|
+ if (!mdatabase.open())
|
|
|
+ {
|
|
|
+ qDebug("Error: Failed to connect database. error is %s ",mdatabase.lastError());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ qDebug("Succeed to connect database.");
|
|
|
+ }
|
|
|
+
|
|
|
+ QSqlQuery sql_query;
|
|
|
+
|
|
|
+ bool bHaveTable = true;
|
|
|
+
|
|
|
+ //查询数据
|
|
|
+ sql_query.exec("select count(*) from sqlite_master where type='table' and name = 'groupdata'");
|
|
|
+ if(!sql_query.exec())
|
|
|
+ {
|
|
|
+ qDebug("%s",sql_query.lastError());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ if(sql_query.next())
|
|
|
+ {
|
|
|
+ int count = sql_query.value(0).toInt();
|
|
|
+ qDebug("count %d ",count);
|
|
|
+ if(count < 1)bHaveTable = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(bHaveTable == false)
|
|
|
+ {
|
|
|
+ if(!sql_query.exec("create table groupdata(id INTEGER primary key AUTOINCREMENT, vehid TEXT,"
|
|
|
+ "recvtime BIGINT,msgtime BIGINT,groupid INTEGER,"
|
|
|
+ "intragroupid INTEGER,vehdata BLOB)"))
|
|
|
+ {
|
|
|
+ qDebug() << "Error: Fail to create table."<< sql_query.lastError();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(!sql_query.exec("CREATE INDEX index_vehid ON groupdata (vehid)"))
|
|
|
+ {
|
|
|
+ qDebug() << "Error: Fail to create index_vehid."<< sql_query.lastError();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(!sql_query.exec("CREATE INDEX index_recvtime ON groupdata (recvtime)"))
|
|
|
+ {
|
|
|
+ qDebug() << "Error: Fail to create index_recvtime."<< sql_query.lastError();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ mbSQL = true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void groupdb::run()
|
|
|
+{
|
|
|
+ if(mbSQL == false)
|
|
|
+ {
|
|
|
+ qDebug("SQL not OK. so not write data to database.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ while(!QThread::isInterruptionRequested())
|
|
|
+ {
|
|
|
+ std::vector<iv::groupdbmsg> xvectordbmsg;
|
|
|
+ mMutexmsg.lock();
|
|
|
+ if(mvectordbmsg.size() > 0)
|
|
|
+ {
|
|
|
+ xvectordbmsg = mvectordbmsg;
|
|
|
+ mvectordbmsg.clear();
|
|
|
+ }
|
|
|
+ mMutexmsg.unlock();
|
|
|
+ if(xvectordbmsg.size()>0)
|
|
|
+ {
|
|
|
+ unsigned int i;
|
|
|
+ for(i=0;i<xvectordbmsg.size();i++)
|
|
|
+ {
|
|
|
+ QSqlQuery query;
|
|
|
+
|
|
|
+ char strsen[1000];
|
|
|
+ snprintf(strsen,1000,"INSERT INTO groupdata(vehid,recvtime,msgtime,groupid,intragroupid,vehdata)"
|
|
|
+ "VALUES(\"%s\", %lld, %lld,%d,%d,:vehdata\")",
|
|
|
+ xvectordbmsg[i].mstrvehid,xvectordbmsg[i].mrecvtime,
|
|
|
+ xvectordbmsg[i].mmsgtime,xvectordbmsg[i].mgroupid,xvectordbmsg[i].mintragroupid);
|
|
|
+ query.prepare(strsen);
|
|
|
+// query.bindValue(":pcddata", bapcd);
|
|
|
+// query.bindValue(":tracedata", batrace);
|
|
|
+ query.exec();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ msleep(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int groupdb::addmsg(qint64 recvtime, std::string strvehid, qint64 msgtime, int groupid,
|
|
|
+ int intragroupid, std::shared_ptr<char> str_ptr)
|
|
|
+{
|
|
|
+ mMutexmsg.lock();
|
|
|
+ if(mvectordbmsg.size()> 10000)
|
|
|
+ {
|
|
|
+ qDebug("groupdb::addmsg msg buffer vector > 10000 , so not add.");
|
|
|
+ mMutexmsg.unlock();
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ mMutexmsg.unlock();
|
|
|
+ mMutexmsg.lock();
|
|
|
+ iv::groupdbmsg xmsg;
|
|
|
+ xmsg.mgroupid = groupid;
|
|
|
+ xmsg.mintragroupid = intragroupid;
|
|
|
+ xmsg.mmsgtime = msgtime;
|
|
|
+ xmsg.mrecvtime = recvtime;
|
|
|
+ xmsg.mstrvehid = strvehid;
|
|
|
+ xmsg.mstr_ptr = str_ptr;
|
|
|
+ mvectordbmsg.push_back(xmsg);
|
|
|
+ mMutexmsg.unlock();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+}
|