Browse Source

change driver_group_grpc_server. add File name size query rpc. but down service not complete.

yuchuli 3 years ago
parent
commit
c0e982d06a

+ 90 - 4
src/driver/driver_group_grpc_server/groupdb.cpp

@@ -2,6 +2,8 @@
 
 #include <QDateTime>
 
+#include <QDir>
+
 groupdb::groupdb(std::string strdbpath)
 {
     mstrdbpath = strdbpath;
@@ -364,11 +366,56 @@ void groupdb::ExecQueryList()
     qDebug("Exec query time is : %d ",xTime.elapsed());
 }
 
+int groupdb::GetFilePathDir(QString &strdir)
+{
+    int nrtn = 0;
+    strdir = getenv("HOME");
+
+    strdir = strdir + "/groupdbtmp";
+    QDir xDir;
+
+    if(xDir.exists(strdir) == false)
+    {
+        qDebug("%s is not exist.Create ",strdir.toLatin1().data());
+        if(false == xDir.mkdir(strdir))
+        {
+            nrtn = -1;
+        }
+    }
+    return nrtn;
+}
+
 void groupdb::ExecQueryData()
 {
+    QString strdir;
+    if(GetFilePathDir(strdir ) == -1)
+    {
+        qDebug("Directory Fail.");
+        mqd_bUpdateRes = false;
+        mqd_nError = -11;
+        return;
+    }
+    QString filename = QString(mqd_strvehid.data()) + "-"
+            +QString::number(mqd_nrecordid)+"-"
+            +QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz");
+
+    QFile xFile;
+    xFile.setFileName(strdir + "/" + filename);
+    if(!xFile.open(QIODevice::ReadWrite))
+    {
+        qDebug("Open File Fail.");
+        mqd_bUpdateRes = false;
+        mqd_nError = -12;
+        return;
+    }
+
+
     QTime xTime;
+    mqd_filename = filename.toStdString();
+    mqd_filesize = 0;
     xTime.start();
     mqd_Mutexdata.lock();
+    mqd_filesize = 0;
     QSqlQuery query(mdatabase);
     char strsen[1000];
     snprintf(strsen,1000,"select * from groupdata where((groupdata.recordid = %lld)  &(groupdata.vehid = \"%s\"))",
@@ -377,12 +424,16 @@ void groupdb::ExecQueryData()
     if(!query.exec(strsen))
     {
         qDebug()<<query.lastError();
+        mqd_nError = -13;
         mqd_bUpdateRes = false;
     }
     else
     {
         while(query.next())
         {
+            QByteArray badata =query.value(7).toByteArray();
+            mqd_filesize = mqd_filesize + badata.size();
+            xFile.write(badata);
 //            int id = query.value(0).toInt();
 //            qint64 recordid = query.value(1).toLongLong();
 //            mql_xvectorrecordtime.push_back(recordid);
@@ -390,13 +441,12 @@ void groupdb::ExecQueryData()
 
         }
 
-        mqd_filename = "temp";
-        mqd_filesize = 0;
 
         mqd_bUpdateRes = true;
     }
     mqd_bUpdate = false;
 
+    xFile.close();
     mqd_Mutexdata.unlock();
     qDebug("Exec querydata time is : %d ",xTime.elapsed());
 }
@@ -466,13 +516,20 @@ int groupdb::getfilepath(qint64 nrecordid, std::string strvehid,std::string & st
     QTime xTime;
     xTime.start();
     mqd_waitmutex.lock();
-    mqd_wc.wait(&mqd_waitmutex,1000);
+    mqd_wc.wait(&mqd_waitmutex,10000);
     mqd_waitmutex.unlock();
     qDebug("query time is %d ",xTime.elapsed());
 
     if(mqd_bUpdateRes == false)
     {
-        nres = -2;
+        if((mqd_nError == -11)||(mqd_nError == -12))
+        {
+            nres =  -3;
+        }
+        else
+        {
+            nres = -2;
+        }
     }
     else
     {
@@ -487,3 +544,32 @@ int groupdb::getfilepath(qint64 nrecordid, std::string strvehid,std::string & st
 
     return nres;
 }
+
+int groupdb::GetFileData(std::string strfilename, qint64 nPos, qint64 nFilesize, QByteArray &ba)
+{
+    QString strpath;
+    if(GetFilePathDir(strpath)!= 0)
+    {
+        qDebug("Directory not exist.");
+        return -1; //File Directory can't found.
+    }
+    strpath = strpath + "/"+ strfilename.data();
+
+    QFile xFile;
+    xFile.setFileName(strpath);
+    if(!xFile.open(QIODevice::ReadOnly))
+    {
+        qDebug("Open File Fail.");
+        return -2; //File Not Exist
+    }
+    if(xFile.seek(nPos) == false)
+    {
+        qDebug("Seek File Fail. pos is %lld",nPos);
+        xFile.close();
+        return -3;
+    }
+    ba.clear();
+    ba = xFile.read(nFilesize);
+    return ba.size();
+
+}

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

@@ -55,6 +55,8 @@ public:
 
     int getfilepath(qint64 nrecordid,std::string strvehid,std::string & strfilename,int & nfilesize);
 
+    int GetFileData(std::string strfilename,qint64 nPos,qint64 nFilesize,QByteArray & ba);
+
 private:
     std::vector<iv::groupdbmsg> mvectordbmsg;
     QMutex mMutexmsg;
@@ -82,6 +84,7 @@ private:
     QMutex mqd_Mutexdata;
     bool mqd_bUpdate = false;
     bool mqd_bUpdateRes = false;
+    int mqd_nError = 0;
     QMutex mqd_waitmutex;
     QWaitCondition mqd_wc;
 
@@ -100,6 +103,9 @@ private:
     void OpenDataBase();
     inline qint64 GetRecID(std::string strvehid,int groupid);
     void CheckRecID();
+    int GetFilePathDir(QString & strdir);
+
+
 };
 
 #endif // GROUPDB_H

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

@@ -175,3 +175,16 @@ int groupmsgbuf::ProcDBFileReqMsg(const iv::db::dataRequest *preq, iv::db::dataR
     }
     return 0;
 }
+
+int groupmsgbuf::ProcDBFileDownMsg(const iv::db::Filedbreq *preq, iv::db::FiledbReply *preply)
+{
+    QByteArray ba;
+    int nSize = mpgroupdb->GetFileData(preq->strfilename(),preq->npos(),preq->nsize(),ba);
+    preply->set_nsize(nSize);
+    if(nSize >= 0)
+    {
+        preply->set_xdata(ba.data(),ba.size());
+    }
+    return 0;
+}
+

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

@@ -33,6 +33,8 @@ public:
     int ProcDBListMsg(const iv::db::listRequest * preq,iv::db::listReply * preply);
     int ProcDBFileReqMsg(const iv::db::dataRequest * preq,iv::db::dataReply * preply);
 
+    int ProcDBFileDownMsg(const iv::db::Filedbreq * preq,iv::db::FiledbReply * preply);
+
 private:
     std::vector<iv::groupmsgunit> mvectorgroupmsg;
     QMutex mMutexGroup;

+ 7 - 0
src/driver/driver_group_grpc_server/main.cpp

@@ -81,6 +81,13 @@ class DBServiceImpl final : public iv::db::dbservice::Service{
 
       return Status::OK;
     }
+
+    Status downdbfile(grpc::ServerContext *context, const iv::db::Filedbreq *request,
+                      iv::db::FiledbReply *reply) override{
+
+        gpmsgbuf->ProcDBFileDownMsg(request,reply);
+        return Status::OK;
+    }
 };
 
 void RunServer() {

+ 55 - 0
src/tool/tool_grpcdb_query/grpcdbclient.cpp

@@ -65,6 +65,44 @@ void grpcdbclient::run()
 
         }
 
+        if(mbdatarequpdate)
+        {
+            iv::db::dataRequest xdatareq;
+            iv::db::dataReply xdatareply;
+            mMutexDataReq.lock();
+            xdatareq.CopyFrom(mdatareq);
+            mbdatarequpdate = false;
+            mMutexDataReq.unlock();
+
+            ClientContext context ;
+            context.set_deadline(timespec);
+
+            Status status = stub_->querydata(&context, xdatareq, &xdatareply);
+            if (status.ok()) {
+             std::cout<<"get data ok"<<std::endl;
+             mdatareply.CopyFrom(xdatareply);
+  //           emit reqres(0);
+             emit datareqres(0);
+            } else {
+              std::cout << status.error_code() << ": " << status.error_message()
+                        << std::endl;
+              std::cout<<"RPC failed"<<std::endl;
+              emit datareqres(-1);
+              if(status.error_code() == 4)
+              {
+                  std::cout<<" RPC Exceed Time, Create New stub_"<<std::endl;
+                  channel = grpc::CreateCustomChannel(
+                           target_str, grpc::InsecureChannelCredentials(),cargs);
+
+                  stub_ = iv::db::dbservice::NewStub(channel);
+              }
+              std::this_thread::sleep_for(std::chrono::milliseconds(900));
+
+            }
+
+        }
+
+
     }
 
 }
@@ -77,6 +115,7 @@ void grpcdbclient::requestlist(qint64 timefrom, qint64 timeto, std::string strve
     mlistreq.set_strvehid(strvehid);
     mblistrequpdate = true;
     mMutexReq.unlock();
+    mwc.wakeAll();
 }
 
 int grpcdbclient::getlistreply(iv::db::listReply & xlistreply)
@@ -84,3 +123,19 @@ int grpcdbclient::getlistreply(iv::db::listReply & xlistreply)
     xlistreply.CopyFrom(mlistreply);
     return 0;
 }
+
+void grpcdbclient::requestfilename(qint64 recordid, std::string strvehid)
+{
+    mMutexReq.lock();
+    mdatareq.set_recodetime(recordid);
+    mdatareq.set_strvehid(strvehid);
+    mbdatarequpdate = true;
+    mMutexReq.unlock();
+    mwc.wakeAll();
+}
+
+int grpcdbclient::getdatareply(iv::db::dataReply &xdatareply)
+{
+    xdatareply.CopyFrom(mdatareply);
+    return 0;
+}

+ 9 - 0
src/tool/tool_grpcdb_query/grpcdbclient.h

@@ -19,6 +19,7 @@ public:
 
 signals:
     void reqres(int);
+    void datareqres(int);
 
 private:
     std::string mstrserverip = "127.0.0.1";
@@ -29,6 +30,11 @@ private:
     bool mblistrequpdate = false;
     QMutex mMutexReq;
 
+    iv::db::dataRequest mdatareq;
+    iv::db::dataReply mdatareply;
+    bool mbdatarequpdate = false;
+    QMutex mMutexDataReq;
+
     QMutex mWaitMutex;
     QWaitCondition mwc;
 
@@ -38,6 +44,9 @@ private:
 public:
     void requestlist(qint64 timefrom, qint64 timeto,std::string strvehid);
     int getlistreply(iv::db::listReply & xlistreply);
+
+    void requestfilename(qint64 recordid,std::string strvehid);
+    int getdatareply(iv::db::dataReply & xdatareply);
 };
 
 #endif // GRPCDBCLIENT_H

+ 25 - 2
src/tool/tool_grpcdb_query/mainwindow.cpp

@@ -14,6 +14,7 @@ MainWindow::MainWindow(QWidget *parent)
     mpdbclient = new grpcdbclient();
     mpdbclient->start();
     connect(mpdbclient,SIGNAL(reqres(int)),this,SLOT(onreqres(int)));
+    connect(mpdbclient,SIGNAL(datareqres(int)),this,SLOT(ondatareqres(int)));
 
     mpitemmodel = new QStandardItemModel(this);
 
@@ -150,12 +151,34 @@ void MainWindow::onreqres(int nres)
 
 void MainWindow::on_pushButton_DownLoad_clicked()
 {
-    QString strrecord = ui->listView->currentIndex().data().toString();
-    qDebug(strrecord.toLatin1().data());
+    QString  strrecord = ui->listView->currentIndex().data().toString();
+
 
     if(strrecord == "")
     {
         QMessageBox::warning(this,"Warning","No Select.",QMessageBox::YesAll);
         return;
     }
+
+    qint64 nrecordid = QDateTime::fromString(strrecord,"yyyy/MM/dd hh:mm:ss:zzz").toMSecsSinceEpoch();
+
+    std::string  strvehid = ui->lineEdit_vehid->text().toStdString();
+
+    mpdbclient->requestfilename(nrecordid,strvehid);
+
+}
+
+void MainWindow::ondatareqres(int nres)
+{
+    if(nres == -1)
+    {
+        QMessageBox::warning(this,"Warning","Connect to Server Fail.",QMessageBox::YesAll);
+        return;
+    }
+
+    iv::db::dataReply xdatareply;
+
+    mpdbclient->getdatareply(xdatareply);
+
+    qDebug("file name is %s, size is %d",xdatareply.strfilename().data(),xdatareply.nfilesize());
 }

+ 2 - 0
src/tool/tool_grpcdb_query/mainwindow.h

@@ -30,6 +30,8 @@ private slots:
 
     void on_pushButton_DownLoad_clicked();
 
+    void ondatareqres(int nres);
+
 private:
     Ui::MainWindow *ui;
 

+ 1 - 1
src/tool/view_group_grpc/groupqueryclient.h

@@ -56,7 +56,7 @@ private:
     void run();
 
 private:
-    std::string mstrserver = "111.33.136.149:31001";
+    std::string mstrserver = "101.201.57.67:31001";// "111.33.136.149:31001";
 
     std::vector<iv::vehinfo> mvectorvehinfo;
     QMutex mMutexInfo;