【TcaplusDB知识库】PB表 C++ 示例代码-插入数据
前提
成功创建:集群,表格组,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地址, 集群访问地址,云环境:默认1个地址
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;
}定义异步回调
//收到响应消息计数
uint32_t g_dwTotalRevNum = 0;
class CommonCallback : public TcaplusPbCallback
{
public:
    CommonCallback()
    {
        cout << "Init CommonCallback." << endl;
    }
    <sub>CommonCallback()
    {
        cout << "Fini </sub>CommonCallback." << endl;
    }
    //收到响应消息的回调,msgs为获取的记录的数组
    int 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;
            //获取记录的版本号
            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* 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;
        }
        std::string asyncid;
        std::string userbuf;
        // 获取消息的异步ID
        int iRet = g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_ASYNC_ID, &asyncid);
        if (iRet == 0)
        {
            // 获取用户传入的自定义二进制数据
            g_stAsyncApi.GetMessageOption(*t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_USER_BUFF, &userbuf);
        }
        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* 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;
    }
};发送Add请求
int SendAddRequest()
{
    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 < TOTAL_V3_ARRAY_NUM;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;
    std::string version = "-1";
    std::string asyncid = "13";
    std::string userbuf;
    g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_DATA_VERSION, version);
    // 设置消息的异步ID,异步ID是字符串形式的uint64_t数值
    g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_ASYNC_ID, asyncid);
    // 设置用户传入的自定义二进制数据, 最长1024Bytes
    g_stAsyncApi.SetMessageOption(t, NS_TCAPLUS_PROTOBUF_API::MESSAGE_OPTION_USER_BUFF, userbuf);
    static CommonCallback cb;
    int32_t iRet = g_stAsyncApi.Add(&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;
}示例
main.cpp
int main(void) {
    //初始化API客户端
    int ret = InitAsyncPbApi();
    if ( ret != 0)
    {
        printf("InitAsyncPbApi failed\n");
        return -1;
    }
    //发送请求
    ret = SendAddRequest();
    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级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。










