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

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

```
int offlineCalculate(
DG_TeeCtx *dgTeeCtx,
DG_PairList *pairList,
DG_BucketMap **bucketMap
)
```

#### 参数


**表1 参数说明**

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | KCAL上下文信息 | 为initTeeCtx成功初始化的结果 | 输入 |
| pairList | 输入的查询结构，为key\-value结构体 | \- | 输入 |
| bucketMap | 生成的分桶数据 | \- | 输出 |


**表2 DG_PairList结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| dgPair | key\-value结构体数组DG\_Pair | \- |
| size | 包含的key\-value结构体的个数unsigned long | \- |


**表3 DG_Pair结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| key | key值，类型DG\_String | 查询结构的key值 |
| value | value值，与key值对应的value值，类型DG\_String | 查询结构的value值 |


**表4 DG_String结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| str | char \* | 定义的DG\_String中的数据内容 |
| size | unsigned long | 定义的DG\_String中的数据内容的长度 |


#### 返回值

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


#### 错误码


**表5 错误码**

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


#### 示例

```
#include  "data_guard_mpc.h"
void BuildDgPairList(std::vector<std::pair<std::string, std::string>>& data, DG_PairList **pairList) {
auto size = data.size();
*pairList = new DG_PairList;
(*pairList)->dgPair = new DG_Pair[size];
for (unsigned long i = 0; i < size; ++i) {
(*pairList)->dgPair[i].key = BuildPairString(data[i].first);
(*pairList)->dgPair[i].value = BuildPairString(data[i].second);
}
(*pairList)->size = data.size();
}
DG_PairList *pairList = nullptr;
DG_BucketMap *bucketMap = nullptr;
unsigned int size;
BuildDgPairList(datas, &pairList);
// pirOpts为DG_InitPirOpts成功后的结果，dgTee为initTeeCtx成功后的结果。
rv = pirOpts.offlineCalculate(dgTee, pairList, &bucketMap);
if (rv != 0) {
return rv;
}
```

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