---
title: offlineCalculate
description: "服务端生成分桶数据，方便线上查询时快速查询结果。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0073.html
sourcePath: /source/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0073.html
indexId: 338f547d2211f13e91e0012989818a14b51b1b5bc9930e25437801410395d0ad64
---
# offlineCalculate

服务端生成分桶数据，方便线上查询时快速查询结果。

```
int offlineCalculate(
DG_TeeCtx *dgTeeCtx,
DG_TeeInput *input,
DG_Buckets **buckets
)
```

#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | MPC上下文信息 | 为DG\_InitPsmOpts成功初始化的结果 | 输入 |
| input | 输入数据 | \- | 输入 |
| buckets | 生成的分桶数据 | \- | 输出 |


**表1 DG_TeeInput结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| data | DG\_MpcDataUnion | 输入数据strings的类型为DG\_String \*，doubleNumbers为double \*, u64Numbers类型为u64 \* |
| size | uint64\_t | 数据量 |
| dataType | DG\_MpcDataType | 数据类型枚举有： MPC\_STRING（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\_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"。


#### 示例

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


```
#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_Buckets *buckets = nullptr;
DG_TeeInput dgTeeInput = BuildTeeInput({"name", "age", "a"}) ;
// psmOpts为DG_InitPsmOpts成功后的结果，dgTee为initTeeMpcSql成功后的结果。
int rv = psmOpts.offlineCalculate(nodeCtx, &dgTeeInput, &buckets);
if (rv != 0) {
return rv;
}
```
