【TcaplusDB知识库】PB表C++示例代码-插入List表数据


【TcaplusDB知识库】PB表C++示例代码-插入List表数据

前提

成功创建:集群,表格组,tb_online表

tb_online表描述文件table_test.proto如下:(tcaplusservice.optionv1.proto为依赖表)

syntax = "proto3";
?
package myTcaplusTable;
//import tcaplusdb extensions
import "tcaplusservice.optionv1.proto";
?
message tb_online {
   //define primary key
   option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";
   //primary key fields
   int32 openid = 1; //QQ Uin
   int32 tconndid = 2;
   string timekey = 3;
?
   //non-primary key fields
   string gamesvrid = 4;
   int32 logintime = 5 ;
   repeated int64 lockid = 6;
   pay_info pay = 7;
?
   message pay_info {
       uint64 total_money = 1;
       uint64 pay_times = 2;
  }
?
}

定义配置参数

// 目标业务的tcapdir地址
static const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] =
{
  "tcp://10.191.***.99:9999"
};
// 目标业务的tcapdir 地址个数
static const int32_t DIR_URL_COUNT = 1;
?
// 目标业务的集群ID
static const int32_t APP_ID = 3;
// 目标业务的表格组ID
static const int32_t ZONE_ID = 1;
// 目标业务的业务密码
static const char * SIGNATURE = "*******";
// 目标业务的表名 tb_online
static const char * TABLE_NAME = "tb_online";

初始化TcaplusPB客户端

//Tcaplus PB API客户端
TcaplusAsyncPbApi g_stAsyncApi;
int32_t InitAsyncPbApi()
{
   //PB API配置
   ClientOptions cfg;
   cfg.app_id = APP_ID;
   cfg.zones.push_back(ZONE_ID);
   strcpy(cfg.signature, SIGNATURE);
   for (int32_t i = 0; i < DIR_URL_COUNT; i++)
  {
       cfg.dirs.push_back(DIR_URL_ARRAY[i]);
  }
   //访问的PB表
   cfg.tables.push_back(TABLE_NAME);
   //日志配置
   strncpy(cfg.log_cfg, "tlogconf.xml", sizeof(cfg.log_cfg));
   //初始化连接超时时间5s
   cfg.timeout = 5000;
?
   //初始化连接
   int32_t iRet = g_stAsyncApi.Init(cfg);
   if (0 != iRet)
  {
       cout << "ERROR: g_stAsyncApi.Init failed, log cfg: " << cfg.log_cfg << ", iRet: " << iRet << "." << endl;
       return iRet;
  }
   return iRet;
}

定义异步回调

class CommonCallback : public TcaplusPbCallback
{
public:
   CommonCallback()
  {
       cout << "Init CommonCallback." << endl;
  }
?
   ~CommonCallback()
  {
       cout << "Fini ~CommonCallback." << endl;
  }
?
   int OnRecv(const NS_TCAPLUS_PROTOBUF_API::ListAddAfterRequest &req, NS_TCAPLUS_PROTOBUF_API::ListAddAfterResponse *res)
  {
       cout << "OnRecv[" << res->m_mapMsg.size() << " index: "<< res->m_nElemIndex <<  endl;
       g_dwTotalRevNum++;
       std::map<int, ::google::protobuf::Message*>::iterator itMap = res->m_mapMsg.begin();
       for (; itMap != res->m_mapMsg.end(); itMap++)
      {
           tb_online_list* t = dynamic_cast<tb_online_list *>(itMap->second);
           if (NULL == t)
          {
               cout << "ERROR: msgs[" << itMap->first << "] not tb_online_list type." << endl;
               return -1;
          }
?
           cout << "---------- receive a response----------:" << itMap->first << endl;
           cout << "openid=" << t->openid() << endl;
           cout << "tconndid=" << t->tconndid() << endl;
           cout << "timekey=" << t->timekey() << endl;
           cout << "gamesvrid=" << t->gamesvrid() << endl;
           tb_online_list_pay_info pay = t->pay();
           cout << "pay total_money=" << pay.total_money() << "; pay_times=" << pay.pay_times() << endl;
?
           std::string version;
           int iRet = g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, &version);
           cout << "after GetMessageOption iRet= [" << iRet << "] version:" << version.c_str() << " msg:" << t << endl;
      }
?
       return 0;
  }
?
   int OnError(const std::vector< ::google::protobuf::Message *> &msgs, int errorcode)
  {
       cout << "OnError[" << msgs.size() << endl;
       g_dwTotalRevNum++;
       for (size_t idx = 0; idx < msgs.size(); idx++)
      {
           tb_online_list* t = dynamic_cast<tb_online_list *>(msgs[idx]);
           if (NULL == t)
          {
               cout << "ERROR: msgs[" << idx << "] not tb_online_list type." << endl;
               return -1;
          }
?
           if (TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST == errorcode)
          {
               cout << "ERROR: openid= " << t->openid() << ", tconndid= " << t->tconndid() << ", timekey= " << t->timekey() << ", record not exists" << endl;
          }
           cout << "ERROR: openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] failed:%d"  << errorcode << endl;
      }
?
       return 0;
  }
?
   int OnTimeout(const std::vector< ::google::protobuf::Message *> &msgs)
  {
       cout << "OnTimeout[" << msgs.size() << endl;
       for (size_t idx = 0; idx < msgs.size(); idx++)
      {
           tb_online_list* t = dynamic_cast<tb_online_list *>(msgs[idx]);
           if (NULL == t)
          {
               cout << "TIMEOUT: msgs[" << idx << "] not tb_online_list type!" << endl;
               return -1;
          }
?
           cout << "TIMEOUT: openid = [" << t->openid() << "], tconndid = [" << t->tconndid() << "], timekey =[" << t->timekey() << "] timeout" << endl;
      }
?
       return 0;
  }
?
   int OnFinish(const NS_TCAPLUS_PROTOBUF_API::MsgParam &m)
  {
       cout << "OnFinish: " << param.m_nOperation << " req: " << param.m_reqListAddAfter << endl;
       return 0;
  }
?
};

发送AddAfter请求

void SendAddAfterRequest(struct schedule * S, void* arg)
{
   static tb_online_list t;
   t.set_openid(2);
   t.set_tconndid(2);
   t.set_timekey("test_tcaplus_2");
   t.set_gamesvrid("MyValueStr_2");
   t.set_logintime(333);
   t.set_add(333);
?
   tb_online_list_pay_info* pay = new tb_online_list_pay_info();
   pay->set_total_money(1024);
   pay->set_pay_times(1);
   t.set_allocated_pay(pay);
?
   cout << "INIT: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << endl;
?
   std::string version = "-1";
   g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, version);
?
   static CommonCallback cb;
   static NS_TCAPLUS_PROTOBUF_API::ListAddAfterRequest req;
   req.m_pMsg = &t;
   req.m_nShift = 0;
   req.m_nElemIndex = TCAPLUS_PB_API_LIST_LAST_INDEX;
   int32_t iRet = g_stAsyncApi.ListAddAfter(req, &cb);
   if (iRet != TcapErrCode::GEN_ERR_SUC)
  {
       cout << "ERROR: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << ", Set Error iRet = " << iRet << endl;
  }
}

示例

main.cpp

int main(void) {
?
   //初始化API客户端
   int ret = InitAsyncPbApi();
   if ( ret != 0)
  {
       printf("InitAsyncPbApi failed\n");
       return -1;
  }
?
   //发送请求
   ret = SendAddAfterRequest();
   if (0 != ret)
  {
       printf("SendAddRequest failed\n");
       return -1;
  }
?
   //接收响应
   do
  {
       // 更新,接收回包
       g_stAsyncApi.UpdateNetwork();
       usleep(1000 * 10);
  } while (g_dwTotalRevNum != 1);
   return 0;
}

img

TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。