【TcaplusDB知识库】PB表C++示例代码-插入List表数据
前提
成功创建:集群,表格组,tb_online表
tb_online表描述文件
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