---
title: clientCalculate
description: "客户端发送要查询的key到服务端获取查询结果。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0074.html
sourcePath: /source/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0074.html
indexId: f8750efc05e8eb8d7b22bdf43d11a49aaf3ff500ce5f2b3b52f9aa73ec4470e864
---
# clientCalculate

客户端发送要查询的key到服务端获取查询结果。

```
int clientCalculate(
DG_TeeCtx *dgTeeCtx,
DG_TeeMode outputMode,
DG_TeeInput *input,
DG_TeeOutput **output
)
```

#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | MPC上下文信息 | 为DG\_InitPsmOpts成功初始化的结果 | 输入 |
| outputMode | 结果形式 | TEE\_OUTPUT\_STRING和TEE\_OUTPUT\_INDEX | 输入 |
| input | 要查询的值 DG\_TeeInput | 目前支持字符串数组 | 输入 |
| output | 返回查询结果 DG\_TeeOutput | 支持字符串数组以及input数组下标 | 输出 |


```
enum DG_TeeMode {
TEE_OUTPUT_STRING,
TEE_OUTPUT_INDEX
};
```


**表1 DG_TeeInput结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| data | DG\_MpcDataUnion | 输入数据strings的类型为DG\_String \*，doubleNumbers为double \*, u64Numbers类型为u64 \* |
| size | uint64\_t | 数据量 |
| dataType | DG\_MpcDataType | 数据类型枚举有： MPC\_STRING（PSM查询） MPC\_INT（PSM字符串交集下标） |


**表2 DG_MpcDataUnion联合体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| strings | DG\_String | 字符串数组类型 |
| u64Numbers | u64 | u64数组 |
| doubleNumbers | double | double数组 |


#### 返回值

- 成功：返回0。
- 失败：返回错误码。


#### 错误码

| 错误码 | 错误码值 | 描述 | 特殊说明 |
| --- | --- | --- | --- |
| DG\_SUCCESS | 0 | 成功 | 无 |
| DG\_FAILURE | 1 | 通信失败 | 发送接收失败 |
| DG\_ERR\_MALLOC\_FAIL | 51 | 申请内存失败 | 无 |
| DG\_ERR\_STRCPY\_FAIL | 54 | 字符串拷贝失败 | 无 |
| DG\_ERR\_MPC\_TEE\_INVALID\_NODE\_INFO | 4503 | 无效的tee节点信息 | 无 |
| DG\_ERR\_MPC\_TEE\_INVALID\_PARAM | 4501 | 参数校验失败 | dgCfg为NULL或dgTeeCtx二级指针为空 |


#### 依赖

- dgCfg依赖DataGuard操作集设置类接口设置MPC配置信息成功，用设定好的dgCfg作为此接口的入参。

  - psmOpts依赖    DG_InitPsmOpts
的成功初始化PSM类算子函数组。
- 依赖的头文件为"data_guard_mpc.h"。


#### 示例

```
#include  "data_guard_mpc.h"
#include <vector>
#include <string>
#include <cstring>
void BuildDgString(std::vector<std::string> &strings, DG_String **dg, unsigned int &size)
{
size = strings.size();
DG_String *dgString = new DG_String[strings.size()];
for (size_t i = 0; i < strings.size(); i++) {
dgString[i].str = strdup(strings[i].c_str());
dgString[i].size = strings[i].size() + 1;
}
*dg = dgString;
}
DG_TeeInput BuildTeeInput(std::vector<std::string> inputData)
{
DG_String *dgInput;
unsigned int size;
BuildDgString(inputData, &dgInput, size);
DG_TeeInput dgTeeInput = {};
dgTeeInput.dataType = MPC_STRING;
dgTeeInput.data.strings = dgInput;
dgTeeInput.size = size;
return dgTeeInput;
}
DG_TeeInput teeInput = BuildTeeInput({"name", "age", "a"}) ;
DG_TeeOutput *output = nullptr;
// psmOpts为DG_InitPsmOpts成功后的结果，dgTee为initTeeMpcSql成功后的结果。
int rv = psmOpts.clientCalculate(nodeCtx, TEE_OUTPUT_STRING, &teeInput, &output);
if (rv != 0) {
return rv;
}
```

使用调用DG_InitPsmOpts成功后的psmOpts来调用initTeeCtx接口。
