Переглянути джерело

change driver_group_grpc_server. add some database code.

yuchuli 3 роки тому
батько
коміт
d6a3de15e3

+ 4 - 0
src/driver/driver_group_grpc_server/driver_group_grpc_server.pro

@@ -1,5 +1,7 @@
 QT -= gui
 
+QT += sql
+
 CONFIG += c++11 console
 CONFIG -= app_bundle
 
@@ -24,6 +26,7 @@ SOURCES += \
         ../../include/msgtype/groupmsg.pb.cc \
         ../../include/msgtype/grpcgroup.pb.cc \
         ../driver_group_grpc_client/grpcgroup.grpc.pb.cc \
+        groupdb.cpp \
         groupmsgbuf.cpp \
         main.cpp
 
@@ -53,4 +56,5 @@ HEADERS += \
     ../../include/msgtype/groupmsg.pb.h \
     ../../include/msgtype/grpcgroup.pb.h \
     ../driver_group_grpc_client/grpcgroup.grpc.pb.h \
+    groupdb.h \
     groupmsgbuf.h

+ 134 - 0
src/driver/driver_group_grpc_server/groupdb.cpp

@@ -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;
+
+}

+ 51 - 0
src/driver/driver_group_grpc_server/groupdb.h

@@ -0,0 +1,51 @@
+#ifndef GROUPDB_H
+#define GROUPDB_H
+
+
+#include <QSqlDatabase>
+#include <QSqlError>
+#include <QSqlQuery>
+#include <QDebug>
+#include <QFile>
+#include <QThread>
+#include <QMutex>
+
+#include <vector>
+
+#include "groupmsg.pb.h"
+
+namespace iv {
+struct  groupdbmsg
+{
+     std::string mstrvehid;
+     qint64 mrecvtime;
+     qint64 mmsgtime;
+     int mgroupid;
+     int mintragroupid;
+     std::shared_ptr<char> mstr_ptr;
+};
+}
+
+class groupdb : public QThread
+{
+public:
+    groupdb(std::string strdbpath);
+
+private:
+    bool mbSQL = false;
+    QSqlDatabase mdatabase;
+
+public:
+    int addmsg(qint64 recvtime,std::string strvehid,
+               qint64 msgtime,int groupid, int intragroupid,
+               std::shared_ptr<char> str_ptr);
+
+private:
+    std::vector<iv::groupdbmsg> mvectordbmsg;
+    QMutex mMutexmsg;
+
+private:
+    void run();
+};
+
+#endif // GROUPDB_H

+ 4 - 0
src/driver/driver_group_grpc_server/groupmsgbuf.cpp

@@ -4,6 +4,8 @@
 
 groupmsgbuf::groupmsgbuf()
 {
+    std::string strgroupdbpath = "/home/yuchuli/groupdb.db";
+    mpgroupdb = new groupdb(strgroupdbpath.data());
 
 }
 
@@ -17,6 +19,8 @@ int groupmsgbuf::ProcGroupMsg(const iv::group::groupRequest * preq,iv::group::gr
         return 0;
     }
 
+
+
     iv::groupmsgunit * p = NULL;
     unsigned int i;
 

+ 4 - 0
src/driver/driver_group_grpc_server/groupmsgbuf.h

@@ -8,6 +8,8 @@
 
 #include "groupmsg.pb.h"
 
+#include "groupdb.h"
+
 namespace iv {
 struct groupmsgunit
 {
@@ -31,6 +33,8 @@ private:
     std::vector<iv::groupmsgunit> mvectorgroupmsg;
     QMutex mMutexGroup;
 
+    groupdb * mpgroupdb;
+
 private:
     qint64 mnDataValidTime = 3000; //3 sceonds
 };

+ 1 - 1
src/tool/view_group_grpc/view_group_grpc.pro

@@ -1,4 +1,4 @@
-QT       += core gui
+QT       += core gui sql
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets