yuchuli пре 3 година
родитељ
комит
90a13924b2

+ 73 - 0
src/driver/driver_db_grpc_server/.gitignore

@@ -0,0 +1,73 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+

+ 44 - 0
src/driver/driver_db_grpc_server/driver_db_grpc_server.pro

@@ -0,0 +1,44 @@
+QT -= gui
+
+CONFIG += c++11 console
+CONFIG -= app_bundle
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+system(protoc -I=./../../include/proto3 --cpp_out=./../../include/msgtype   ./../../include/proto3/grpcdb.proto)
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+        ../../include/msgtype/grpcdb.pb.cc \
+        grpcdb.grpc.pb.cc \
+        main.cpp
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+!include(../../../include/common.pri ) {
+    error( "Couldn't find the common.pri file!" )
+}
+
+!include(../../../include/ivprotobuf.pri ) {
+    error( "Couldn't find the ivprotobuf.pri file!" )
+}
+
+
+!include(../../../include/ivgrpc.pri ) {
+    error( "Couldn't find the ivgrpc.pri file!" )
+}
+
+HEADERS += \
+    ../../include/msgtype/grpcdb.pb.h \
+    grpcdb.grpc.pb.h

+ 130 - 0
src/driver/driver_db_grpc_server/grpcdb.grpc.pb.cc

@@ -0,0 +1,130 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: grpcdb.proto
+
+#include "grpcdb.pb.h"
+#include "grpcdb.grpc.pb.h"
+
+#include <functional>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/channel_interface.h>
+#include <grpcpp/impl/codegen/client_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/rpc_service_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+namespace iv {
+namespace db {
+
+static const char* dbservice_method_names[] = {
+  "/iv.db.dbservice/querylist",
+  "/iv.db.dbservice/querydata",
+};
+
+std::unique_ptr< dbservice::Stub> dbservice::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+  (void)options;
+  std::unique_ptr< dbservice::Stub> stub(new dbservice::Stub(channel));
+  return stub;
+}
+
+dbservice::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
+  : channel_(channel), rpcmethod_querylist_(dbservice_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_querydata_(dbservice_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  {}
+
+::grpc::Status dbservice::Stub::querylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::iv::db::listReply* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::iv::db::listRequest, ::iv::db::listReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_querylist_, context, request, response);
+}
+
+void dbservice::Stub::experimental_async::querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::iv::db::listRequest, ::iv::db::listReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_querylist_, context, request, response, std::move(f));
+}
+
+void dbservice::Stub::experimental_async::querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_querylist_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::iv::db::listReply>* dbservice::Stub::PrepareAsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::iv::db::listReply, ::iv::db::listRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_querylist_, context, request);
+}
+
+::grpc::ClientAsyncResponseReader< ::iv::db::listReply>* dbservice::Stub::AsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncquerylistRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+::grpc::Status dbservice::Stub::querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::iv::db::dataReply* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::iv::db::dataRequest, ::iv::db::dataReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_querydata_, context, request, response);
+}
+
+void dbservice::Stub::experimental_async::querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::iv::db::dataRequest, ::iv::db::dataReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_querydata_, context, request, response, std::move(f));
+}
+
+void dbservice::Stub::experimental_async::querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_querydata_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>* dbservice::Stub::PrepareAsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::iv::db::dataReply, ::iv::db::dataRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_querydata_, context, request);
+}
+
+::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>* dbservice::Stub::AsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncquerydataRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+dbservice::Service::Service() {
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      dbservice_method_names[0],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< dbservice::Service, ::iv::db::listRequest, ::iv::db::listReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+          [](dbservice::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::iv::db::listRequest* req,
+             ::iv::db::listReply* resp) {
+               return service->querylist(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      dbservice_method_names[1],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< dbservice::Service, ::iv::db::dataRequest, ::iv::db::dataReply, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+          [](dbservice::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::iv::db::dataRequest* req,
+             ::iv::db::dataReply* resp) {
+               return service->querydata(ctx, req, resp);
+             }, this)));
+}
+
+dbservice::Service::~Service() {
+}
+
+::grpc::Status dbservice::Service::querylist(::grpc::ServerContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status dbservice::Service::querydata(::grpc::ServerContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+}  // namespace iv
+}  // namespace db
+

+ 510 - 0
src/driver/driver_db_grpc_server/grpcdb.grpc.pb.h

@@ -0,0 +1,510 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: grpcdb.proto
+// Original file comments:
+// Copyright 2015 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef GRPC_grpcdb_2eproto__INCLUDED
+#define GRPC_grpcdb_2eproto__INCLUDED
+
+#include "grpcdb.pb.h"
+
+#include <functional>
+#include <grpc/impl/codegen/port_platform.h>
+#include <grpcpp/impl/codegen/async_generic_service.h>
+#include <grpcpp/impl/codegen/async_stream.h>
+#include <grpcpp/impl/codegen/async_unary_call.h>
+#include <grpcpp/impl/codegen/client_callback.h>
+#include <grpcpp/impl/codegen/client_context.h>
+#include <grpcpp/impl/codegen/completion_queue.h>
+#include <grpcpp/impl/codegen/message_allocator.h>
+#include <grpcpp/impl/codegen/method_handler.h>
+#include <grpcpp/impl/codegen/proto_utils.h>
+#include <grpcpp/impl/codegen/rpc_method.h>
+#include <grpcpp/impl/codegen/server_callback.h>
+#include <grpcpp/impl/codegen/server_callback_handlers.h>
+#include <grpcpp/impl/codegen/server_context.h>
+#include <grpcpp/impl/codegen/service_type.h>
+#include <grpcpp/impl/codegen/status.h>
+#include <grpcpp/impl/codegen/stub_options.h>
+#include <grpcpp/impl/codegen/sync_stream.h>
+
+namespace iv {
+namespace db {
+
+class dbservice final {
+ public:
+  static constexpr char const* service_full_name() {
+    return "iv.db.dbservice";
+  }
+  class StubInterface {
+   public:
+    virtual ~StubInterface() {}
+    virtual ::grpc::Status querylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::iv::db::listReply* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>> Asyncquerylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>>(AsyncquerylistRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>> PrepareAsyncquerylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>>(PrepareAsyncquerylistRaw(context, request, cq));
+    }
+    virtual ::grpc::Status querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::iv::db::dataReply* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>> Asyncquerydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>>(AsyncquerydataRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>> PrepareAsyncquerydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>>(PrepareAsyncquerydataRaw(context, request, cq));
+    }
+    class experimental_async_interface {
+     public:
+      virtual ~experimental_async_interface() {}
+      virtual void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      virtual void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+    };
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    typedef class experimental_async_interface async_interface;
+    #endif
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    async_interface* async() { return experimental_async(); }
+    #endif
+    virtual class experimental_async_interface* experimental_async() { return nullptr; }
+  private:
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>* AsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::listReply>* PrepareAsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>* AsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::iv::db::dataReply>* PrepareAsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) = 0;
+  };
+  class Stub final : public StubInterface {
+   public:
+    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);
+    ::grpc::Status querylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::iv::db::listReply* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>> Asyncquerylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>>(AsyncquerylistRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>> PrepareAsyncquerylist(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>>(PrepareAsyncquerylistRaw(context, request, cq));
+    }
+    ::grpc::Status querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::iv::db::dataReply* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>> Asyncquerydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>>(AsyncquerydataRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>> PrepareAsyncquerydata(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>>(PrepareAsyncquerydataRaw(context, request, cq));
+    }
+    class experimental_async final :
+      public StubInterface::experimental_async_interface {
+     public:
+      void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void querylist(::grpc::ClientContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void querydata(::grpc::ClientContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+     private:
+      friend class Stub;
+      explicit experimental_async(Stub* stub): stub_(stub) { }
+      Stub* stub() { return stub_; }
+      Stub* stub_;
+    };
+    class experimental_async_interface* experimental_async() override { return &async_stub_; }
+
+   private:
+    std::shared_ptr< ::grpc::ChannelInterface> channel_;
+    class experimental_async async_stub_{this};
+    ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>* AsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::iv::db::listReply>* PrepareAsyncquerylistRaw(::grpc::ClientContext* context, const ::iv::db::listRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>* AsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::iv::db::dataReply>* PrepareAsyncquerydataRaw(::grpc::ClientContext* context, const ::iv::db::dataRequest& request, ::grpc::CompletionQueue* cq) override;
+    const ::grpc::internal::RpcMethod rpcmethod_querylist_;
+    const ::grpc::internal::RpcMethod rpcmethod_querydata_;
+  };
+  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
+
+  class Service : public ::grpc::Service {
+   public:
+    Service();
+    virtual ~Service();
+    virtual ::grpc::Status querylist(::grpc::ServerContext* context, const ::iv::db::listRequest* request, ::iv::db::listReply* response);
+    virtual ::grpc::Status querydata(::grpc::ServerContext* context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response);
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_querylist() {
+      ::grpc::Service::MarkMethodAsync(0);
+    }
+    ~WithAsyncMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void Requestquerylist(::grpc::ServerContext* context, ::iv::db::listRequest* request, ::grpc::ServerAsyncResponseWriter< ::iv::db::listReply>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_querydata() {
+      ::grpc::Service::MarkMethodAsync(1);
+    }
+    ~WithAsyncMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void Requestquerydata(::grpc::ServerContext* context, ::iv::db::dataRequest* request, ::grpc::ServerAsyncResponseWriter< ::iv::db::dataReply>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_querylist<WithAsyncMethod_querydata<Service > > AsyncService;
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_querylist() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::iv::db::listRequest, ::iv::db::listReply>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::iv::db::listRequest* request, ::iv::db::listReply* response) { return this->querylist(context, request, response); }));}
+    void SetMessageAllocatorFor_querylist(
+        ::grpc::experimental::MessageAllocator< ::iv::db::listRequest, ::iv::db::listReply>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(0);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::iv::db::listRequest, ::iv::db::listReply>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* querylist(
+      ::grpc::CallbackServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* querylist(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_querydata() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::iv::db::dataRequest, ::iv::db::dataReply>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::iv::db::dataRequest* request, ::iv::db::dataReply* response) { return this->querydata(context, request, response); }));}
+    void SetMessageAllocatorFor_querydata(
+        ::grpc::experimental::MessageAllocator< ::iv::db::dataRequest, ::iv::db::dataReply>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(1);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(1);
+    #endif
+      static_cast<::grpc::internal::CallbackUnaryHandler< ::iv::db::dataRequest, ::iv::db::dataReply>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* querydata(
+      ::grpc::CallbackServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* querydata(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+  typedef ExperimentalWithCallbackMethod_querylist<ExperimentalWithCallbackMethod_querydata<Service > > CallbackService;
+  #endif
+
+  typedef ExperimentalWithCallbackMethod_querylist<ExperimentalWithCallbackMethod_querydata<Service > > ExperimentalCallbackService;
+  template <class BaseClass>
+  class WithGenericMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_querylist() {
+      ::grpc::Service::MarkMethodGeneric(0);
+    }
+    ~WithGenericMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_querydata() {
+      ::grpc::Service::MarkMethodGeneric(1);
+    }
+    ~WithGenericMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_querylist() {
+      ::grpc::Service::MarkMethodRaw(0);
+    }
+    ~WithRawMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void Requestquerylist(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_querydata() {
+      ::grpc::Service::MarkMethodRaw(1);
+    }
+    ~WithRawMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void Requestquerydata(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_querylist() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(0,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->querylist(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* querylist(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* querylist(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_querydata() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(1,
+          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->querydata(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* querydata(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* querydata(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_querylist : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_querylist() {
+      ::grpc::Service::MarkMethodStreamed(0,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::iv::db::listRequest, ::iv::db::listReply>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::iv::db::listRequest, ::iv::db::listReply>* streamer) {
+                       return this->Streamedquerylist(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_querylist() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status querylist(::grpc::ServerContext* /*context*/, const ::iv::db::listRequest* /*request*/, ::iv::db::listReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status Streamedquerylist(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::iv::db::listRequest,::iv::db::listReply>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_querydata : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_querydata() {
+      ::grpc::Service::MarkMethodStreamed(1,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::iv::db::dataRequest, ::iv::db::dataReply>(
+            [this](::grpc::ServerContext* context,
+                   ::grpc::ServerUnaryStreamer<
+                     ::iv::db::dataRequest, ::iv::db::dataReply>* streamer) {
+                       return this->Streamedquerydata(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_querydata() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status querydata(::grpc::ServerContext* /*context*/, const ::iv::db::dataRequest* /*request*/, ::iv::db::dataReply* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status Streamedquerydata(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::iv::db::dataRequest,::iv::db::dataReply>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_querylist<WithStreamedUnaryMethod_querydata<Service > > StreamedUnaryService;
+  typedef Service SplitStreamedService;
+  typedef WithStreamedUnaryMethod_querylist<WithStreamedUnaryMethod_querydata<Service > > StreamedService;
+};
+
+}  // namespace db
+}  // namespace iv
+
+
+#endif  // GRPC_grpcdb_2eproto__INCLUDED

+ 8 - 0
src/driver/driver_db_grpc_server/main.cpp

@@ -0,0 +1,8 @@
+#include <QCoreApplication>
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    return a.exec();
+}

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

@@ -24,7 +24,9 @@ SOURCES += \
         ../../include/msgtype/decition.pb.cc \
         ../../include/msgtype/gpsimu.pb.cc \
         ../../include/msgtype/groupmsg.pb.cc \
+        ../../include/msgtype/grpcdb.pb.cc \
         ../../include/msgtype/grpcgroup.pb.cc \
+        ../driver_db_grpc_server/grpcdb.grpc.pb.cc \
         ../driver_group_grpc_client/grpcgroup.grpc.pb.cc \
         groupdb.cpp \
         groupmsgbuf.cpp \
@@ -54,7 +56,9 @@ HEADERS += \
     ../../include/msgtype/decition.pb.h \
     ../../include/msgtype/gpsimu.pb.h \
     ../../include/msgtype/groupmsg.pb.h \
+    ../../include/msgtype/grpcdb.pb.h \
     ../../include/msgtype/grpcgroup.pb.h \
+    ../driver_db_grpc_server/grpcdb.grpc.pb.h \
     ../driver_group_grpc_client/grpcgroup.grpc.pb.h \
     groupdb.h \
     groupmsgbuf.h

+ 67 - 2
src/driver/driver_group_grpc_server/groupdb.cpp

@@ -14,7 +14,22 @@ void groupdb::OpenDataBase()
     mbSQL = false;
 
     msleep(100);
-    mdatabase = QSqlDatabase::addDatabase("QSQLITE");
+
+
+    if(QSqlDatabase::contains("sqliteadc"))
+        mdatabase = QSqlDatabase::database("sqliteadc");
+    else
+        mdatabase = QSqlDatabase::addDatabase("QSQLITE","sqliteadc");
+//    mdatabase = QSqlDatabase::addDatabase("QSQLITE");
+
+
+//    if(QSqlDatabase::contains("sqlite"))
+//        mdatabase = QSqlDatabase::database("sqlite");
+//    else
+//        mdatabase = QSqlDatabase::addDatabase("QSQLITE","sqlite");
+
+
+
     mdatabase.setDatabaseName(mstrdbpath.data());
     if (!mdatabase.open())
     {
@@ -29,7 +44,7 @@ void groupdb::OpenDataBase()
 
 
 
-    QSqlQuery sql_query;
+    QSqlQuery sql_query(mdatabase);
 
     bool bHaveTable = true;
 
@@ -300,3 +315,53 @@ void groupdb::CheckRecID()
     }
     mMutexrec.unlock();
 }
+
+int groupdb::getlist(qint64 xfrom,qint64 xto,std::string &strvehid, std::vector<qint64> &xvectorrecordtime)
+{
+
+    QSqlDatabase xdatabase ;
+
+//    if(QSqlDatabase::contains("sqliteadc"))
+//        xdatabase = QSqlDatabase::database("sqliteadc");
+//    else
+        xdatabase = QSqlDatabase::addDatabase("QSQLITE","sqliteadc");
+
+    xdatabase.setDatabaseName(mstrdbpath.data());
+    if (!xdatabase.open())
+    {
+        qDebug("Error: Failed to connect database. error is %s ",xdatabase.lastError());
+        return -1;
+    }
+    else
+    {
+
+ //       qDebug("Succeed to connect database.");
+    }
+
+    QSqlQuery query(xdatabase);
+
+    char strsen[1000];
+    snprintf(strsen,1000,"select * from recorddata");
+    query.exec(strsen);
+    if(!query.exec(strsen))
+    {
+        qDebug()<<query.lastError();
+    }
+    else
+    {
+        while(query.next())
+        {
+            int id = query.value(0).toInt();
+            qint64 recordid = query.value(1).toLongLong();
+            std::string strvehid = query.value(3).toString().toStdString();
+
+        }
+    }
+
+    xdatabase.close();
+
+    qDebug("query suc.");
+
+
+
+}

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

@@ -50,6 +50,8 @@ public:
                qint64 msgtime,int groupid, int intragroupid,
                QByteArray & ba);
 
+    int getlist(qint64 xfrom,qint64 xto,std::string & strvehid, std::vector<qint64> & xvectorrecordtime);
+
 private:
     std::vector<iv::groupdbmsg> mvectordbmsg;
     QMutex mMutexmsg;

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

@@ -133,3 +133,13 @@ int groupmsgbuf::ProcQueryMsg(const iv::group::groupRequest * preq,iv::group::gr
     }
     return 1;
 }
+
+int groupmsgbuf::ProcDBListMsg(const iv::db::listRequest *preq, iv::db::listReply *preply)
+{
+    std::vector<qint64> xvectorrecord;
+    qint64 xfrom,xto;
+    std::string strvehid = preq->strvehid();
+    xfrom = preq->fromtime();
+    xto = preq->totime();
+    mpgroupdb->getlist(xfrom,xto,strvehid,xvectorrecord);
+}

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

@@ -5,6 +5,7 @@
 #include <QMutex>
 
 #include "./../driver_group_grpc_client/grpcgroup.grpc.pb.h"
+#include "./../driver_db_grpc_server/grpcdb.grpc.pb.h"
 
 #include "groupmsg.pb.h"
 
@@ -29,6 +30,8 @@ public:
     int ProcGroupMsg(const iv::group::groupRequest * preq,iv::group::groupReply* reply);
     int ProcQueryMsg(const iv::group::groupRequest * preq,iv::group::groupReply* reply);
 
+    int ProcDBListMsg(const iv::db::listRequest * preq,iv::db::listReply * preply);
+
 private:
     std::vector<iv::groupmsgunit> mvectorgroupmsg;
     QMutex mMutexGroup;

+ 68 - 1
src/driver/driver_group_grpc_server/main.cpp

@@ -7,6 +7,7 @@
 #include <iostream>
 #include <memory>
 #include <string>
+#include <thread>
 
 #include <grpcpp/grpcpp.h>
 #include <grpcpp/health_check_service_interface.h>
@@ -25,6 +26,7 @@ using grpc::ServerContext;
 using grpc::Status;
 
 #include "./../driver_group_grpc_client/grpcgroup.grpc.pb.h"
+#include "./../driver_db_grpc_server/grpcdb.grpc.pb.h"
 
 static groupmsgbuf * gpmsgbuf;
 
@@ -32,6 +34,9 @@ std::string gstrserver;
 bool gbSaveToDB;
 std::string gstrdbpath;
 
+static std::thread * gptheadgroup;
+static std::thread * gptheaddb;
+
 // 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,
@@ -56,6 +61,27 @@ class GroupServiceImpl final : public iv::group::groupservice::Service{
 
 };
 
+class DBServiceImpl final : public iv::db::dbservice::Service{
+
+    Status querylist(ServerContext* context, const iv::db::listRequest * request,
+                    iv::db::listReply * reply) override {
+
+        std::cout<<"vehid is "<<request->strvehid().data()<<std::endl;
+ //     gpmsgbuf->ProcGroupMsg(request,reply);
+
+        gpmsgbuf->ProcDBListMsg(request,reply);
+      return Status::OK;
+    }
+
+    Status querydata(ServerContext* context, const iv::db::dataRequest * request,
+                    iv::db::dataReply * reply) override {
+
+ //     gpmsgbuf->ProcGroupMsg(request,reply);
+
+      return Status::OK;
+    }
+};
+
 void RunServer() {
   std::string server_address = gstrserver ;//("0.0.0.0:31001");
   GroupServiceImpl service;
@@ -91,6 +117,44 @@ static std::string getdefdbpath()
     return strpath;
 }
 
+void RunServerDB() {
+  std::string server_address("0.0.0.0:31011");
+  DBServiceImpl service;
+
+  grpc::EnableDefaultHealthCheckService(true);
+//  grpc::reflection::InitProtoReflectionServerBuilderPlugin();
+  ServerBuilder builder;
+  // Listen on the given address without any authentication mechanism.
+  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
+
+  builder.SetMaxReceiveMessageSize(300000000);
+ // builder.SetMaxMessageSize(100000000);
+
+
+//  builder.SetMaxSendMessageSize(100000000);
+  // Register "service" as the instance through which we'll communicate with
+  // clients. In this case it corresponds to an *synchronous* service.
+  builder.RegisterService(&service);
+  // Finally assemble the server.
+  std::unique_ptr<Server> server(builder.BuildAndStart());
+  std::cout << "Server listening on " << server_address << std::endl;
+
+  // Wait for the server to shutdown. Note that some other thread must be
+  // responsible for shutting down the server for this call to ever return.
+  server->Wait();
+}
+
+
+void threadgroup()
+{
+    RunServer();
+}
+
+void threaddb()
+{
+    RunServerDB();
+}
+
 
 int main(int argc, char *argv[])
 {
@@ -121,6 +185,9 @@ int main(int argc, char *argv[])
 
     gpmsgbuf = new groupmsgbuf();
 
-    RunServer();
+    gptheadgroup = new std::thread(threadgroup);
+    std::this_thread::sleep_for(std::chrono::milliseconds(100));
+    gptheaddb = new std::thread(threaddb);
+
     return a.exec();
 }

+ 5 - 2
src/driver/driver_map_xodrload/driver_map_xodrload.pro

@@ -29,7 +29,8 @@ SOURCES += main.cpp     \
     ../../include/msgtype/gps.pb.cc \
     ../../include/msgtype/gpsimu.pb.cc \
     ../../include/msgtype/imu.pb.cc \
-    gnss_coordinate_convert.cpp
+    gnss_coordinate_convert.cpp \
+    xodrplan.cpp
 
 HEADERS += \
     ../../../include/ivexit.h \
@@ -41,7 +42,9 @@ HEADERS += \
     ../../include/msgtype/gps.pb.h \
     ../../include/msgtype/gpsimu.pb.h \
     ../../include/msgtype/imu.pb.h \
-    gnss_coordinate_convert.h
+    gnss_coordinate_convert.h \
+    planpoint.h \
+    xodrplan.h
 
 
 !include(../../../include/common.pri ) {

+ 1 - 35
src/driver/driver_map_xodrload/globalplan.h

@@ -7,42 +7,8 @@
 #include "xodrfunc.h"
 
 #include "xodrdijkstra.h"
-class PlanPoint
-{
-public:
-    bool bInlaneAvoid = false;
-    double mx_left;
-    double my_left;
-    double mx_right;
-    double my_right;
-    double x;
-    double y;
-    double speed;
-    int lanmp; //left 1 right -1
-    double hdg;
-    double dis;
-    double mS;
-    double mWidth;
-    double mLeftWidth[5];
-    double mRightWidth[5];
-
-    double mfRoadWidth;
-    double mfDisToRoadLeft;
-    double mfDisToLaneLeft;
-    int mnLaneori = 0;  //from Right 0
-    int mnLaneTotal = 1; //Lane Total
-
-    int nSignal = -1;   //if 0 no signal point
 
-    int nRoadID =-1;
-
-    double mfSecx;
-    double mfSecy;
-    int nlrchange; //1 left 2 right
-    bool mbBoringRoad = false;
-    bool mbNoavoid = false;
-    double mfCurvature = 0.0;
-};
+#include "planpoint.h"
 
 class LaneChangePoint
 {

+ 41 - 0
src/driver/driver_map_xodrload/planpoint.h

@@ -0,0 +1,41 @@
+#ifndef PLANPOINT_H
+#define PLANPOINT_H
+
+class PlanPoint
+{
+public:
+    bool bInlaneAvoid = false;
+    double mx_left;
+    double my_left;
+    double mx_right;
+    double my_right;
+    double x;
+    double y;
+    double speed;
+    int lanmp; //left 1 right -1
+    double hdg;
+    double dis;
+    double mS;
+    double mWidth;
+    double mLeftWidth[5];
+    double mRightWidth[5];
+
+    double mfRoadWidth;
+    double mfDisToRoadLeft;
+    double mfDisToLaneLeft;
+    int mnLaneori = 0;  //from Right 0
+    int mnLaneTotal = 1; //Lane Total
+
+    int nSignal = -1;   //if 0 no signal point
+
+    int nRoadID =-1;
+
+    double mfSecx;
+    double mfSecy;
+    int nlrchange; //1 left 2 right
+    bool mbBoringRoad = false;
+    bool mbNoavoid = false;
+    double mfCurvature = 0.0;
+};
+
+#endif // PLANPOINT_H

+ 15 - 0
src/driver/driver_map_xodrload/xodrplan.cpp

@@ -0,0 +1,15 @@
+#include "xodrplan.h"
+
+xodrplan::xodrplan()
+{
+
+}
+
+int xodrplan::MakePlan(xodrdijkstra *pxd, OpenDrive *pxodr, const double x_now,
+                       const double y_now, const double head, const double x_obj,
+                       const double y_obj, const double &obj_dis, const double srcnearthresh,
+                       const double dstnearthresh, const int nlanesel, std::vector<PlanPoint> &xPlan,
+                       const double fvehiclewidth)
+{
+
+}

+ 26 - 0
src/driver/driver_map_xodrload/xodrplan.h

@@ -0,0 +1,26 @@
+#ifndef XODRPLAN_H
+#define XODRPLAN_H
+
+#include "OpenDrive/OpenDrive.h"
+
+#include <vector>
+
+#include "xodrfunc.h"
+
+#include "xodrdijkstra.h"
+
+#include "planpoint.h"
+
+class xodrplan
+{
+public:
+    xodrplan();
+
+public:
+    static int MakePlan(xodrdijkstra * pxd,OpenDrive * pxodr,const double x_now,const double y_now,const double head,
+                 const double x_obj,const double y_obj,const double & obj_dis,
+                 const double srcnearthresh,const double dstnearthresh,
+                 const int nlanesel,std::vector<PlanPoint> & xPlan,const double fvehiclewidth = 2.0);
+};
+
+#endif // XODRPLAN_H

+ 62 - 0
src/include/proto3/grpcdb.proto

@@ -0,0 +1,62 @@
+// Copyright 2015 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "io.grpc.adc.grpcdb";
+option java_outer_classname = "grpcdb";
+option objc_class_prefix = "HLW";
+
+package iv.db;
+
+
+service dbservice {
+
+  rpc querylist (listRequest) returns (listReply) {}
+  rpc querydata (dataRequest) returns (dataReply) {}
+  
+}
+
+
+message listRequest {
+
+    string strvehid = 1;   //车辆识别码
+    int64  fromtime = 2;   //开始时间
+    int64 totime = 3;  //结束时间
+}
+
+message listReply {
+  repeated int64 recodetime = 1;  
+  string strvehid = 2; 
+}
+
+message dataRequest {
+
+    string strvehid = 1;   //车辆识别码
+    int64  recodetime = 2;   //数据标识码
+}
+
+message datainfo
+{
+  int64 recvtime = 1;
+  int64 msgtime = 2;
+  bytes xdata = 3;
+}
+
+message dataReply {
+
+    string strvehid = 1;   //车辆识别码
+    repeated datainfo mdata= 2;   //数据标识码
+}

+ 73 - 0
src/tool/tool_grpcdb_query/.gitignore

@@ -0,0 +1,73 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+

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

@@ -0,0 +1,79 @@
+#include "grpcdbclient.h"
+
+grpcdbclient::grpcdbclient()
+{
+
+}
+
+void grpcdbclient::run()
+{
+    std::string target_str = mstrserverip+":";
+    target_str = target_str + mstrserverport ;//std::to_string()
+    auto cargs = grpc::ChannelArguments();
+    cargs.SetMaxReceiveMessageSize(1024 * 1024 * 1024); // 1 GB
+    cargs.SetMaxSendMessageSize(1024 * 1024 * 1024);
+
+    std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
+             target_str, grpc::InsecureChannelCredentials(),cargs);
+
+    std::unique_ptr<iv::db::dbservice::Stub> stub_ = iv::db::dbservice::NewStub(channel);
+
+    gpr_timespec timespec;
+      timespec.tv_sec = 5;//设置阻塞时间为5秒
+      timespec.tv_nsec = 0;
+      timespec.clock_type = GPR_TIMESPAN;
+
+    while(!QThread::isInterruptionRequested())
+    {
+        mWaitMutex.lock();
+        mwc.wait(&mWaitMutex,100);
+        mWaitMutex.unlock();
+
+        if(mblistrequpdate)
+        {
+            iv::db::listRequest xlistreq;
+            iv::db::listReply xlistreply;
+            mMutexReq.lock();
+            xlistreq.CopyFrom(mlistreq);
+            mblistrequpdate = false;
+            mMutexReq.unlock();
+
+            ClientContext context ;
+            context.set_deadline(timespec);
+
+            Status status = stub_->querylist(&context, xlistreq, &xlistreply);
+            if (status.ok()) {
+             std::cout<<"get list ok"<<std::endl;
+             emit reqres(0);
+            } else {
+              std::cout << status.error_code() << ": " << status.error_message()
+                        << std::endl;
+              std::cout<<"RPC failed"<<std::endl;
+              emit reqres(-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));
+
+            }
+
+        }
+
+    }
+
+}
+
+void grpcdbclient::requestlist(qint64 timefrom, qint64 timeto, std::string strvehid)
+{
+    mMutexReq.lock();
+    mlistreq.set_fromtime(timefrom);
+    mlistreq.set_totime(timeto);
+    mlistreq.set_strvehid(strvehid);
+    mblistrequpdate = true;
+    mMutexReq.unlock();
+}

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

@@ -0,0 +1,41 @@
+#ifndef GRPCDBCLIENT_H
+#define GRPCDBCLIENT_H
+
+#include <QMutex>
+#include <QThread>
+#include <QWaitCondition>
+#include <grpcpp/grpcpp.h>
+#include "../../driver/driver_db_grpc_server/grpcdb.grpc.pb.h"
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::Status;
+
+class grpcdbclient : public QThread
+{
+    Q_OBJECT
+public:
+    grpcdbclient();
+
+signals:
+    void reqres(int);
+
+private:
+    std::string mstrserverip = "127.0.0.1";
+    std::string mstrserverport = "31011";
+
+    iv::db::listRequest mlistreq;
+    bool mblistrequpdate = false;
+    QMutex mMutexReq;
+
+    QMutex mWaitMutex;
+    QWaitCondition mwc;
+
+private:
+    void run();
+
+public:
+    void requestlist(qint64 timefrom, qint64 timeto,std::string strvehid);
+};
+
+#endif // GRPCDBCLIENT_H

+ 11 - 0
src/tool/tool_grpcdb_query/main.cpp

@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    MainWindow w;
+    w.show();
+    return a.exec();
+}

+ 118 - 0
src/tool/tool_grpcdb_query/mainwindow.cpp

@@ -0,0 +1,118 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+#include <QMessageBox>
+
+#include <QDateTime>
+
+MainWindow::MainWindow(QWidget *parent)
+    : QMainWindow(parent)
+    , ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+
+    mpdbclient = new grpcdbclient();
+    mpdbclient->start();
+    connect(mpdbclient,SIGNAL(reqres(int)),this,SLOT(onreqres(int)));
+
+    setWindowTitle("Query grpcdb");
+}
+
+MainWindow::~MainWindow()
+{
+    delete ui;
+}
+
+
+void MainWindow::on_pushButton_setbegin_clicked()
+{
+    QDate date = ui->calendarWidget->selectedDate();
+    QDateTime datetime;
+    datetime.setDate(date);
+    QTime xTime;
+    xTime.setHMS(0,0,0,0);
+    datetime.setTime(xTime);
+
+    ui->lineEdit_begin->setText(datetime.toString("yyyy/MM/dd hh:mm:ss:zzz"));
+}
+
+void MainWindow::on_pushButton_setend_clicked()
+{
+    QDate date = ui->calendarWidget->selectedDate();
+    QDateTime datetime;
+    datetime.setDate(date);
+    QTime xTime;
+    xTime.setHMS(23,59,59,999);
+    datetime.setTime(xTime);
+
+    ui->lineEdit_end->setText(datetime.toString("yyyy/MM/dd hh:mm:ss:zzz"));
+}
+
+void MainWindow::on_pushButton_query_clicked()
+{
+    QString strbegin = ui->lineEdit_begin->text();
+    if(strbegin == "")
+    {
+        QMessageBox::warning(this,"Warning","Please Set begin time.",QMessageBox::YesAll);
+        ui->lineEdit_begin->setFocus();
+        return;
+    }
+
+    QDateTime xfrom = QDateTime::fromString(strbegin,"yyyy/MM/dd hh:mm:ss:zzz");
+
+    if(xfrom.isNull() || !xfrom.isValid())
+    {
+        QMessageBox::warning(this,"Warning","begin time is Not Valid.",QMessageBox::YesAll);
+        ui->lineEdit_begin->setFocus();
+        return;
+    }
+
+    QString strto = ui->lineEdit_end->text();
+    if(strto == "")
+    {
+        QMessageBox::warning(this,"Warning","Please Set end time.",QMessageBox::YesAll);
+        ui->lineEdit_end->setFocus();
+        return;
+    }
+
+    QDateTime xto = QDateTime::fromString(strto,"yyyy/MM/dd hh:mm:ss:zzz");
+
+    if(xto.isNull() || !xto.isValid())
+    {
+        QMessageBox::warning(this,"Warning","end time is Not Valid.",QMessageBox::YesAll);
+        ui->lineEdit_end->setFocus();
+        return;
+    }
+
+    if((xfrom.toMSecsSinceEpoch() >= xto.toMSecsSinceEpoch()))
+    {
+        QMessageBox::warning(this,"Warning","end time is earlier than start time.",QMessageBox::YesAll);
+        ui->lineEdit_end->setFocus();
+        return;
+    }
+
+    QString strvehid = ui->lineEdit_vehid->text();
+
+    if(strvehid == "")
+    {
+        QMessageBox::warning(this,"Warning","vehid is Not Valid.",QMessageBox::YesAll);
+        ui->lineEdit_vehid->setFocus();
+        return;
+    }
+
+
+    mpdbclient->requestlist(xfrom.toMSecsSinceEpoch(),xto.toMSecsSinceEpoch(),strvehid.toStdString());
+
+    ui->pushButton_query->setEnabled(false);
+
+}
+
+void MainWindow::onreqres(int nres)
+{
+    ui->pushButton_query->setEnabled(true);
+    if(nres == -1)
+    {
+        QMessageBox::warning(this,"Warning","Connect to Server Fail.",QMessageBox::YesAll);
+        return;
+    }
+}

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

@@ -0,0 +1,34 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+
+#include "grpcdbclient.h"
+
+QT_BEGIN_NAMESPACE
+namespace Ui { class MainWindow; }
+QT_END_NAMESPACE
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    MainWindow(QWidget *parent = nullptr);
+    ~MainWindow();
+
+private slots:
+    void on_pushButton_setbegin_clicked();
+
+    void on_pushButton_setend_clicked();
+
+    void on_pushButton_query_clicked();
+
+    void onreqres(int nres);
+
+private:
+    Ui::MainWindow *ui;
+
+    grpcdbclient * mpdbclient;
+};
+#endif // MAINWINDOW_H

+ 160 - 0
src/tool/tool_grpcdb_query/mainwindow.ui

@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1053</width>
+    <height>593</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <widget class="QCalendarWidget" name="calendarWidget">
+    <property name="geometry">
+     <rect>
+      <x>480</x>
+      <y>20</y>
+      <width>481</width>
+      <height>231</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_setbegin">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>20</y>
+      <width>131</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>设置开始日期</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_begin">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>23</y>
+      <width>231</width>
+      <height>51</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_setend">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>97</y>
+      <width>131</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>设置终止日期</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_end">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>100</y>
+      <width>231</width>
+      <height>51</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_vehid">
+    <property name="geometry">
+     <rect>
+      <x>202</x>
+      <y>180</y>
+      <width>231</width>
+      <height>51</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_query">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>260</y>
+      <width>131</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>查询</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>190</y>
+      <width>141</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>车辆ID</string>
+    </property>
+   </widget>
+   <widget class="QListView" name="listView">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>330</y>
+      <width>501</width>
+      <height>192</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_DownLoad">
+    <property name="geometry">
+     <rect>
+      <x>550</x>
+      <y>360</y>
+      <width>131</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>下载</string>
+    </property>
+   </widget>
+   <widget class="QProgressBar" name="progressBar">
+    <property name="geometry">
+     <rect>
+      <x>550</x>
+      <y>440</y>
+      <width>451</width>
+      <height>23</height>
+     </rect>
+    </property>
+    <property name="value">
+     <number>24</number>
+    </property>
+   </widget>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>1053</width>
+     <height>28</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 53 - 0
src/tool/tool_grpcdb_query/tool_grpcdb_query.pro

@@ -0,0 +1,53 @@
+QT       += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++11
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+system(protoc -I=./../../include/proto3 --cpp_out=./../../include/msgtype   ./../../include/proto3/grpcdb.proto)
+
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+    ../../driver/driver_db_grpc_server/grpcdb.grpc.pb.cc \
+    ../../include/msgtype/grpcdb.pb.cc \
+    grpcdbclient.cpp \
+    main.cpp \
+    mainwindow.cpp
+
+HEADERS += \
+    ../../driver/driver_db_grpc_server/grpcdb.grpc.pb.h \
+    ../../include/msgtype/grpcdb.pb.h \
+    grpcdbclient.h \
+    mainwindow.h
+
+FORMS += \
+    mainwindow.ui
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+!include(../../../include/common.pri ) {
+    error( "Couldn't find the common.pri file!" )
+}
+
+!include(../../../include/ivprotobuf.pri ) {
+    error( "Couldn't find the ivprotobuf.pri file!" )
+}
+
+
+!include(../../../include/ivgrpc.pri ) {
+    error( "Couldn't find the ivgrpc.pri file!" )
+}