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

change driver_group_grpc_server. add sqlite database code.

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

+ 7 - 0
src/driver/driver_group_grpc_server/driver_group_grpc_server.xml

@@ -0,0 +1,7 @@
+<xml>	
+	<node name="driver_group_grpc_server">
+		<param name="server" value="0.0.0.0:31001" />
+		<param name="savetodb" value="true" />
+		<param name="dbpath" value="/home/yuchuli/groupdb.db" />
+	</node>
+</xml>

+ 40 - 12
src/driver/driver_group_grpc_server/groupdb.cpp

@@ -12,6 +12,8 @@ groupdb::groupdb(std::string strdbpath)
 void groupdb::OpenDataBase()
 {
     mbSQL = false;
+
+    msleep(100);
     mdatabase = QSqlDatabase::addDatabase("QSQLITE");
     mdatabase.setDatabaseName(mstrdbpath.data());
     if (!mdatabase.open())
@@ -127,7 +129,6 @@ void groupdb::OpenDataBase()
 void groupdb::run()
 {
 
-    msleep(100);
     OpenDataBase();
     //建立并打开数据库
 
@@ -141,10 +142,17 @@ void groupdb::run()
     std::vector<iv::groupdbmsg> xvectordbmsg;
     qint64 nLastWrite = QDateTime::currentMSecsSinceEpoch();
     qint64 nWriteInterval = 1000;
+    qint64 nLastCheckRecVector = QDateTime::currentMSecsSinceEpoch();
+    qint64 nCheckRecInterval = 3000;
 
     while(!QThread::isInterruptionRequested())
     {
        qint64 nNow = QDateTime::currentMSecsSinceEpoch();
+       if((nNow-nLastCheckRecVector) >= nCheckRecInterval)
+       {
+           nLastCheckRecVector = nNow;
+           CheckRecID();
+       }
         mMutexmsg.lock();
         if(mvectordbmsg.size() > 0)
         {
@@ -165,6 +173,7 @@ void groupdb::run()
             unsigned int i;
             for(i=0;i<xvectordbmsg.size();i++)
             {
+
                 xvectordbmsg.at(i).mrecid = GetRecID(xvectordbmsg[i].mstrvehid,
                                                      xvectordbmsg[i].mgroupid);
             }
@@ -188,7 +197,7 @@ void groupdb::run()
             }
             mdatabase.commit();
             xvectordbmsg.clear();
-            qDebug("transaction time :%d",xTime.elapsed());
+//            qDebug("transaction time :%d",xTime.elapsed());
         }
         else
         {
@@ -231,6 +240,7 @@ qint64 groupdb::GetRecID(std::string strvehid,int groupid)
 {
     qint64 nrecid = 0;
     bool bFind = false;
+    iv::recid xrec;
     mMutexrec.lock();
     unsigned int i;
     for(i=0;i<mvectorrecid.size();i++)
@@ -245,30 +255,48 @@ qint64 groupdb::GetRecID(std::string strvehid,int groupid)
     }
     if(bFind == false)
     {
-        iv::recid xrec;
+
         xrec.mgroupid = groupid;
         xrec.mnLastUpdateTime = QDateTime::currentMSecsSinceEpoch();
         xrec.mrecid = QDateTime::currentMSecsSinceEpoch();
         xrec.mstrvehid = strvehid;
         nrecid = xrec.mrecid;
+        mvectorrecid.push_back(xrec);
     }
     mMutexrec.unlock();
 
     if(bFind == false)
     {
+
         QSqlQuery query;
 
         char strsen[1000];
-        snprintf(strsen,1000,"INSERT INTO groupdata(vehid,recordid,recvtime,msgtime,groupid,intragroupid,vehdata)"
-                 "VALUES(\"%s\",%lld, %lld, %lld,%d,%d,:vehdata)",
-                                     xvectordbmsg[i].mstrvehid.data(),xvectordbmsg[i].mrecid,xvectordbmsg[i].mrecvtime,
-                 xvectordbmsg[i].mmsgtime,xvectordbmsg[i].mgroupid,xvectordbmsg[i].mintragroupid);
-        query.prepare(strsen);
-//              qDebug(strsen);
-        query.bindValue(":vehdata", xvectordbmsg[i].mba);
-//                query.bindValue(":tracedata", batrace);
-        query.exec();
+        snprintf(strsen,1000,"INSERT INTO recorddata(recordid,groupid,vehid)"
+                 " VALUES(%lld, %d,\"%s\")",
+                                     xrec.mrecid,xrec.mgroupid,xrec.mstrvehid.data());
+        query.exec(strsen);
+        qDebug(strsen);
+ //       query.exec();
+
     }
 
     return nrecid;
 }
+
+void groupdb::CheckRecID()
+{
+    qint64 nEraseTime = 60000; //More than 1 minutes no data. erase.
+    if(mvectorrecid.size() == 0)return;
+    mMutexrec.lock();
+    unsigned int i;
+    qint64 nNow = QDateTime::currentMSecsSinceEpoch();
+    for(i=0;i<mvectorrecid.size();i++)
+    {
+        if((nNow - mvectorrecid[i].mnLastUpdateTime)>nEraseTime)
+        {
+            mvectorrecid.erase(mvectorrecid.begin()+i);
+ //           qDebug("erase");
+        }
+    }
+    mMutexrec.unlock();
+}

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

@@ -62,6 +62,7 @@ private:
 private:
     void OpenDataBase();
     inline qint64 GetRecID(std::string strvehid,int groupid);
+    void CheckRecID();
 };
 
 #endif // GROUPDB_H

+ 16 - 6
src/driver/driver_group_grpc_server/groupmsgbuf.cpp

@@ -2,11 +2,18 @@
 
 #include <QDateTime>
 
+
+extern bool gbSaveToDB;
+extern std::string gstrdbpath;
+
 groupmsgbuf::groupmsgbuf()
 {
-    std::string strgroupdbpath = "/home/yuchuli/groupdb.db";
-    mpgroupdb = new groupdb(strgroupdbpath.data());
-    mpgroupdb->start();
+    std::string strgroupdbpath = gstrdbpath;
+    if(gbSaveToDB)
+    {
+        mpgroupdb = new groupdb(strgroupdbpath.data());
+        mpgroupdb->start();
+    }
 
 }
 
@@ -20,10 +27,13 @@ int groupmsgbuf::ProcGroupMsg(const iv::group::groupRequest * preq,iv::group::gr
         return 0;
     }
 
-    QByteArray ba;
-    ba.append(preq->xdata().data(),preq->xdata().size());
-    mpgroupdb->addmsg(QDateTime::currentMSecsSinceEpoch(),preq->strvehid(),preq->msgtime(),preq->ngroup(),
+    if(gbSaveToDB)
+    {
+        QByteArray ba;
+        ba.append(preq->xdata().data(),preq->xdata().size());
+        mpgroupdb->addmsg(QDateTime::currentMSecsSinceEpoch(),preq->strvehid(),preq->msgtime(),preq->ngroup(),
                       preq->intragroupid(),ba);
+    }
 
 
     iv::groupmsgunit * p = NULL;

+ 31 - 4
src/driver/driver_group_grpc_server/main.cpp

@@ -15,6 +15,10 @@
 #include "grpcgroup.pb.h"
 #include "groupmsgbuf.h"
 
+#include "ivbacktrace.h"
+
+#include "xmlparam.h"
+
 using grpc::Server;
 using grpc::ServerBuilder;
 using grpc::ServerContext;
@@ -22,14 +26,18 @@ using grpc::Status;
 
 #include "./../driver_group_grpc_client/grpcgroup.grpc.pb.h"
 
-static groupmsgbuf gmsgbuf;
+static groupmsgbuf * gpmsgbuf;
+
+std::string gstrserver;
+bool gbSaveToDB;
+std::string gstrdbpath;
 
 // Logic and data behind the server's behavior.
 class GroupServiceImpl final : public iv::group::groupservice::Service{
   Status grpcgroup(ServerContext* context, const iv::group::groupRequest* request,
                   iv::group::groupReply* reply) override {
 
-    gmsgbuf.ProcGroupMsg(request,reply);
+    gpmsgbuf->ProcGroupMsg(request,reply);
 
     return Status::OK;
   }
@@ -37,7 +45,7 @@ class GroupServiceImpl final : public iv::group::groupservice::Service{
   Status queryallgroup(ServerContext* context, const iv::group::groupRequest* request,
                   iv::group::groupReply* reply) override {
 
-    gmsgbuf.ProcQueryMsg(request,reply);
+    gpmsgbuf->ProcQueryMsg(request,reply);
 
       return Status::OK;
 
@@ -49,7 +57,7 @@ class GroupServiceImpl final : public iv::group::groupservice::Service{
 };
 
 void RunServer() {
-  std::string server_address("0.0.0.0:31001");
+  std::string server_address = gstrserver ;//("0.0.0.0:31001");
   GroupServiceImpl service;
 
   grpc::EnableDefaultHealthCheckService(true);
@@ -76,12 +84,31 @@ void RunServer() {
 }
 
 
+static std::string getdefdbpath()
+{
+    std::string strhome = getenv("HOME");
+    std::string strpath = strhome + "/groupdb.db";
+    return strpath;
+}
 
 
 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
 
+    RegisterIVBackTrace();
+
+    iv::xmlparam::Xmlparam xp("./driver_group_grpc_server.xml");
+
+    gstrserver = xp.GetParam("server","0.0.0.0:31001");
+    gbSaveToDB = xp.GetParam("savetodb",true);
+    gstrdbpath = xp.GetParam("dbpath",getdefdbpath());
+
+    std::cout<<"server: "<<gstrserver<<" savetodb:"<<gbSaveToDB<<" db path:"<<gstrdbpath<<std::endl;
+
+
+    gpmsgbuf = new groupmsgbuf();
+
     RunServer();
     return a.exec();
 }