tb_online
table.tb_online
table is as follows (tcaplusservice.optionv1.proto is the dependent table):syntax = "proto2";package myTcaplusTable;import "tcaplusservice.optionv1.proto";message tb_online {option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";required int32 openid = 1; //QQ Uinrequired int32 tconndid = 2;required string timekey = 3;required string gamesvrid = 4;optional int32 logintime = 5 [default = 1];repeated int64 lockid = 6 [packed = true]; // The `repeated` fields should use the `packed` modifier.optional pay_info pay = 7;message pay_info {optional uint64 total_money = 1;optional uint64 pay_times = 2;}}
// Access address of the target clusterstatic const char DIR_URL_ARRAY[][TCAPLUS_MAX_STRING_LENGTH] ={"tcp://10.191.***.99:9999","tcp://10.191.***.88:9999"};// The number of target cluster addressesstatic const int32_t DIR_URL_COUNT = 2;// Cluster ID of the target businessstatic const int32_t APP_ID = 3;// Table group ID of the target businessstatic const int32_t ZONE_ID = 1;// Target business passwordstatic const char * SIGNATURE = "*******";// Table name "tb_online" of the target businessstatic const char * TABLE_NAME = "tb_online";
// TcaplusDB API client for ProtobufTcaplusAsyncPbApi g_stAsyncApi;int32_t InitAsyncPbApi(){// TcaplusDB API for Protobuf configurationClientOptions 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]);}// The Protobuf table to be accessedcfg.tables.push_back(TABLE_NAME);// Log configurationstrncpy(cfg.log_cfg, "tlogconf.xml", sizeof(cfg.log_cfg));// Timeout period for connection initialization: 5 secondscfg.timeout = 5000;// Initialize connectionint32_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;}
// Count the number of received response messagesuint32_t g_dwTotalRevNum = 0;class CommonCallback : public TcaplusPbCallback{public:CommonCallback(){cout << "Init CommonCallback." << endl;}~CommonCallback(){cout << "Fini ~CommonCallback." << endl;}// A callback for the received response message, and "msgs" is an array of the received recordsint OnRecv(const std::vector< ::google::protobuf::Message *> &msgs){cout << "OnRecv[" << msgs.size() << endl;g_dwTotalRevNum++;for (size_t idx = 0; idx < msgs.size(); idx++){tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);if (NULL == t){cout << "ERROR: msgs[" << idx << "] not tb_online 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;for (int32_t i = 0; i < t->lockid_size();i++){cout << "lockid[" << i << "]=" << t->lockid(i) << endl;}tb_online_pay_info pay = t->pay();cout << "pay total_money=" << pay.total_money() << "; pay_times=" << pay.pay_times() << endl;// Get the version of the recordstd::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;}// A callback for a response errorint 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* t = dynamic_cast<tb_online *>(msgs[idx]);if (NULL == t){cout << "ERROR: msgs[" << idx << "] not tb_online 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;}// A callback for a timed-out messageint OnTimeout(const std::vector< ::google::protobuf::Message *> &msgs){cout << "OnTimeout[" << msgs.size() << endl;for (size_t idx = 0; idx < msgs.size(); idx++){tb_online* t = dynamic_cast<tb_online *>(msgs[idx]);if (NULL == t){cout << "TIMEOUT: msgs[" << idx << "] not tb_online 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_vecMsgs.size()<< endl;return 0;}};
int SendSetRequest(){// Define the Protobuf record structure and assign it a value. The structure can be converted with proto.static tb_online t;t.set_openid(2);t.set_tconndid(2);t.set_timekey("test_tcaplus_2");t.set_gamesvrid("MyValueStr_2");t.set_logintime(333);for (int32_t i = 0; i < 3;i++){t.add_lockid(i+1);}tb_online_pay_info* pay = new tb_online_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;// Specify the version number which is used by optimistic lockingstd::string version = "-1"; // std::string version="1"; "-1" indicates no comparison, and "1" indicates the version number of the server data is 1.g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, version);//Pass in the defined callback function which is automatically invoked when a response message is received.static CommonCallback cb;int32_t iRet = g_stAsyncApi.Set(&t, &cb);if (iRet != TcapErrCode::GEN_ERR_SUC){cout << "ERROR: openid= " << t.openid() << ", tconndid= " << t.tconndid() << ", timekey= " << t.timekey() << ", Set Error iRet = " << iRet << endl;return -1;}return 0;}
int main(void) {// Initialize the API clientint ret = InitAsyncPbApi();if ( ret != 0){printf("InitAsyncPbApi failed\\n");return -1;}// Send the requestret = SendSetRequest();if (0 != ret){printf("SendSetRequest failed\\n");return -1;}// Receive the responsedo{// Update and receive the response packetg_stAsyncApi.UpdateNetwork();usleep(1000 * 10);} while (g_dwTotalRevNum != 1);return 0;}
Was this page helpful?