条件过滤和更新
条件更新包含条件过滤和更新两部分内容,后者目前是指对数组的更新。
1. 使用说明
对于主要的增删改查,可以通过 SetCondition
接口设置过滤条件,仅当条件满足时,才会返回查询的数据或才执行更新操作,否则返回错误码 COMMON_ERR_CONDITION_NOT_MATCHED
。
int32_t TcaplusServiceRecord::SetCondition(const std::string &condition);
// Batch 类请求,在 Request 对象上调用 SetCondition
int32_t TcaplusServiceRequest::SetCondition(const std::string &condition);
对于修改请求,除了 SetData
或 SetValue
设置数据,还可以通过 SetOperation
接口设置更新操作,目前是指对数组的插入(PUSH)、删除(POP)、修改(SET)操作。
// 设置record中数组的操作语句
// [IN] operation 操作语句,包括 PUSH / POP / SET / GET
// [IN] operateOption 操作选项,仅 GET 有用,见 enum RecordOperationOption
// retval 0 设置成功
// retval <0 设置失败
int32_t TcaplusServiceRecord::SetOperation(const std::string &operation, int operateOption);
// Batch 类请求,在 Request 对象上调用 SetOperation
int32_t TcaplusServiceRequest::SetOperation(const std::string &operation, int operateOption);
示例
USER u = {};
// 设置主键
u.dwId = 1;
strcpy(u.szName, "a");
record->SetData(&u, sizeof(u));
// 前置的条件过滤,先判断gameids是否已经包含101
record->SetCondition("gameids NOT CONTAINS($ = 101)");
// 后置的数组操作,插入101
record->SetOperation("PUSH gameids#[-1][$ = 101]");
// 发送写请求
// ...
// 处理响应返回值
if (ret == COMMON_ERR_CONDITION_NOT_MATCHED) // 条件不满足,说明gameids已经存在101了
{
// ...
}
上述 SetCondition、SetOperation 设置的是类 SQL 的文本,见详细语法说明。
2. 哪些命令支持条件更新?
版本大于等于 3.55.0 的 SDK 中,支持的命令有
- TCAPLUS_API_GET_REQ
- TCAPLUS_API_DELETE_REQ
- TCAPLUS_API_REPLACE_REQ
- TCAPLUS_API_UPDATE_REQ
- TCAPLUS_API_GET_BY_PARTKEY_REQ
- TCAPLUS_API_LIST_GET_REQ
- TCAPLUS_API_LIST_GETALL_REQ
- TCAPLUS_API_LIST_DELETE_REQ
- TCAPLUS_CMD_LIST_DELETE_BATCH_REQ
- TCAPLUS_API_LIST_REPLACE_REQ
- TCAPLUS_API_TABLE_TRAVERSE_REQ(全表遍历)
- TCAPLUS_API_LIST_TABLE_TRAVERSE_REQ(全表遍历)
- TCAPLUS_API_UPDATE_ITEM_REQ(数组的PUSH、SET、POP)
- TCAPLUS_API_LIST_UPDATE_ITEM_REQ(数组的PUSH、SET、POP)
- TCAPLUS_API_QUERY_REQ(数组的GET,即查询返回部分下标范围的数组元素)
- TCAPLUS_API_LIST_QUERY_REQ(数组的GET,即查询返回部分下标范围的数组元素)
有部分命令,以及 Batch 类操作,需要版本大于等于 3.64.0 才能支持(目前最高仅提供3.55.0的SDK,即目前批量操作不支持条件更新),包括
- TCAPLUS_API_INCREASE_REQ
- TCAPLUS_API_UPDATE_BY_PARTKEY_REQ
- TCAPLUS_API_DELETE_BY_PARTKEY_REQ
- TCAPLUS_API_BATCH_GET_REQ
- TCAPLUS_API_BATCH_DELETE_REQ
- TCAPLUS_API_BATCH_UPDATE_REQ
- TCAPLUS_API_BATCH_REPLACE_REQ
- TCAPLUS_API_BATCH_GET_BY_PARTKEY_REQ
更多关于条件过滤和更新的能力支持,请联系Tcaplus。
3. 注意事项
- 参数
condition
和operation
文本最大长度是1023。 - 条件过滤和更新依赖于 TDR 的解包(Unpack)能力,而 TcaplusDB 的 SDK 支持两种方式写入数据记录,即 Record.SetValue() 和 Record.SetData(),条件更新不支持 SetValue() 写入的复杂数据类型(结构体、数组)。
- TDR 表中数组字段有对应的 refer 字段(数组的实际大小),对数组的 PUSH、POP 操作会自动修改这个 refer 字段。