条件过滤和更新

条件更新包含条件过滤更新两部分内容,后者目前是指对数组的更新。

1. 使用说明

对于主要的增删改查,可以通过 SetCondition 接口设置过滤条件,仅当条件满足时,才会返回查询的数据或才执行更新操作,否则返回错误码 COMMON_ERR_CONDITION_NOT_MATCHED
对于条件更新操作,当条件不满足时,同样支持调用SetResultFlagForFail设置返回DB中的记录和对应的错误码 COMMON_ERR_CONDITION_NOT_MATCHED
注:Batch 类操作则要求 3.64.0 以上的版本(目前最高仅提供3.55.0的SDK,即目前批量操作不支持条件更新和过滤查询)

int32_t TcaplusServiceRecord::SetCondition(const std::string &condition);

// Batch 类请求,在 Request 对象上调用 SetCondition  
int32_t TcaplusServiceRequest::SetCondition(const std::string &condition);

对于修改请求,除了 SetDataSetValue 设置数据,还可以通过 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。

3. 注意事项(TDR C++ SDK 特有)

  • TDR 表的条件过滤/数组更新依赖 TDR 的 Unpack 能力。TcaplusServiceRecord::SetValue() 写入的复杂类型字段(结构体、数组)不支持条件过滤和数组更新;请改用 SetData()。详细机理及跨实例 TDR 元数据版本兼容详见《TDR 表数据读写与版本兼容性》。
  • TDR 表中数组字段对应的 refer 字段(数组实际大小)会在 PUSH/POP 时自动维护,业务无需手动同步。

其它通用注意事项详情见《条件过滤和更新功能》§7。

results matching ""

    No results matching ""