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

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

```
int clientCalculate(
DG_TeeCtx *dgTeeCtx,
DG_DummyMode dummyMode,
DG_TeeInput *input,
DG_TeeOutput **output
)
```

#### 参数


**表1 参数说明**

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | KCAL上下文信息 | 为initTeeCtx成功初始化的结果 | 输入 |
| dummyMode | dummy模式DG\_DummyMode | 正常模式NORMAL和dummy模式DUMMY | 输入 |
| input | 要查询的key值 DG\_TeeInput | 目前支持字符串数组 | 输入 |
| output | 返回查询结果 DG\_TeeOutput | 支持字符串数组 | 输出 |


**表2 DG_DummyMode枚举类**

| 名称 | 说明 |
| --- | --- |
| NORMAL | 正常模式，隐藏客户端真实的查询内容 |
| DUMMY | dummy模式，对client查询的真实数量与内容做dummy隐藏处理 |


**表3 DG_TeeInput结构体**

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


**表4 DG_MpcDataUnion联合体**

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


#### 返回值

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


#### 错误码


**表5 错误码**

| 错误码 | 错误码值 | 描述 | 特殊说明 |
| --- | --- | --- | --- |
| 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操作集设置类接口
设置KCAL配置信息成功，用设定好的dgCfg作为此接口的入参。
- pirOpts依赖  DG_InitPirOpts
的成功初始化PIR类算子函数组。
- 依赖的头文件为"data_guard_mpc.h"。


#### 示例

使用调用DG_InitPirOpts成功后的pirOpts来调用clientCalculate接口。


```
#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_String *strings = nullptr;
BuildDgString(dataString, &strings, size);
DG_TeeInput teeInput;
teeInput.data.strings = strings;
teeInput.size = size;
teeInput.dataType = MPC_STRING;
DG_TeeOutput* output = nullptr;
// pirOpts为DG_InitPirOpts成功后的结果，dgTee为initTeeMpcSql成功后的结果
int rv = pirOpts.clientCalculate(dgTee, DUMMY, &teeInput, &output);
if (rv != 0) {
return rv;
}
```
