【TcaplusDB知识库】PB表C++示例代码-查询List表数据
前提
成功创建:集群,表格组,tb_online表
tb_online表描述文件table_test.proto如下:(tcaplusservice.optionv1.proto为依赖表)
syntax = "proto3";package myTcaplusTable;//import tcaplusdb extensionsimport "tcaplusservice.optionv1.proto";message tb_online {//define primary keyoption(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";//primary key fieldsint32 openid = 1; //QQ Uinint32 tconndid = 2;string timekey = 3;//non-primary key fieldsstring 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;// 目标业务的集群IDstatic const int32_t APP_ID = 3;// 目标业务的表格组IDstatic const int32_t ZONE_ID = 1;// 目标业务的业务密码static const char * SIGNATURE = "*******";// 目标业务的表名 tb_onlinestatic 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));//初始化连接超时时间5scfg.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::ListReplaceRequest &req, NS_TCAPLUS_PROTOBUF_API::ListReplaceResponse *res){cout << "OnRecv[" << " m_nElemIndex:%d" << res->m_nElemIndex << endl;g_dwTotalRevNum++;tb_online_list* t = dynamic_cast<tb_online_list *>(res->m_pMsg);if (NULL == t){cout << "ERROR: msgs[" << "] not tb_online_list type." << endl;return -1;}cout << "---------- receive a response----------:" << endl;cout << "openid=" << t->openid() << endl;cout << "tconndid=" << t->tconndid() << endl;cout << "timekey=" << t->timekey() << endl;cout << "gamesvrid=" << t->gamesvrid() << endl;cout << "logintime=" << t->logintime() << 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_reqListReplace<< endl;return 0;}};发送ListGet请求
void SendListGetRequest(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_2sss");t.set_logintime(555);t.set_add(555);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::ListGetRequest req;req.m_pMsg = &t;req.m_nElemIndex = 0;int32_t iRet = g_stAsyncApi.ListGet(req, &cb);if (iRet != TcapErrCode::GEN_ERR_SUC){cout << "ERROR: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << ", Set Error iRet = " << iRet << endl;}cout << "req: " << &req << endl;}示例
main.cpp
int main(void) {//初始化API客户端int ret = InitAsyncPbApi();if ( ret != 0){printf("InitAsyncPbApi failed\n");return -1;}//发送请求ret = SendListGetRequest();if (0 != ret){printf("SendAddRequest failed\n");return -1;}//接收响应do{// 更新,接收回包g_stAsyncApi.UpdateNetwork();usleep(1000 * 10);} while (g_dwTotalRevNum != 1);return 0;}
TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。
