153c3577eSopenharmony_ci/*
253c3577eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
353c3577eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
453c3577eSopenharmony_ci * you may not use this file except in compliance with the License.
553c3577eSopenharmony_ci * You may obtain a copy of the License at
653c3577eSopenharmony_ci *
753c3577eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
853c3577eSopenharmony_ci *
953c3577eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1053c3577eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1153c3577eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1253c3577eSopenharmony_ci * See the License for the specific language governing permissions and
1353c3577eSopenharmony_ci * limitations under the License.
1453c3577eSopenharmony_ci */
1553c3577eSopenharmony_ci
1653c3577eSopenharmony_ci#define LOG_TAG "ExtensionUtil"
1753c3577eSopenharmony_ci#include "extension_util.h"
1853c3577eSopenharmony_ci#include "log_print.h"
1953c3577eSopenharmony_ci
2053c3577eSopenharmony_cinamespace OHOS::CloudData {
2153c3577eSopenharmony_cistd::pair<OhCloudExtVector *, size_t> ExtensionUtil::Convert(DBVBuckets &&buckets)
2253c3577eSopenharmony_ci{
2353c3577eSopenharmony_ci    OhCloudExtVector *datas = OhCloudExtVectorNew(OhCloudExtRustType::VALUETYPE_HASHMAP_VALUE);
2453c3577eSopenharmony_ci    if (datas == nullptr) {
2553c3577eSopenharmony_ci        return { nullptr, 0 };
2653c3577eSopenharmony_ci    }
2753c3577eSopenharmony_ci    size_t datasLen = 0;
2853c3577eSopenharmony_ci    for (auto &bucket : buckets) {
2953c3577eSopenharmony_ci        auto value = Convert(bucket);
3053c3577eSopenharmony_ci        if (value.first == nullptr) {
3153c3577eSopenharmony_ci            return { nullptr, 0 };
3253c3577eSopenharmony_ci        }
3353c3577eSopenharmony_ci        auto status = OhCloudExtVectorPush(datas, value.first, value.second);
3453c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS) {
3553c3577eSopenharmony_ci            return { nullptr, 0 };
3653c3577eSopenharmony_ci        }
3753c3577eSopenharmony_ci        datasLen += 1;
3853c3577eSopenharmony_ci    }
3953c3577eSopenharmony_ci    return { datas, datasLen };
4053c3577eSopenharmony_ci}
4153c3577eSopenharmony_ci
4253c3577eSopenharmony_cistd::pair<OhCloudExtHashMap *, size_t> ExtensionUtil::Convert(const DBVBucket &bucket)
4353c3577eSopenharmony_ci{
4453c3577eSopenharmony_ci    OhCloudExtHashMap *values = OhCloudExtHashMapNew(OhCloudExtRustType::VALUETYPE_VALUE);
4553c3577eSopenharmony_ci    if (values == nullptr) {
4653c3577eSopenharmony_ci        return { nullptr, 0 };
4753c3577eSopenharmony_ci    }
4853c3577eSopenharmony_ci    size_t valuesLen = 0;
4953c3577eSopenharmony_ci    for (auto &[col, dbValue] : bucket) {
5053c3577eSopenharmony_ci        void *value = nullptr;
5153c3577eSopenharmony_ci        size_t valueLen = 0;
5253c3577eSopenharmony_ci        if (dbValue.index() == TYPE_INDEX<DBAsset>) {
5353c3577eSopenharmony_ci            DBAsset dbAsset = std::get<DBAsset>(dbValue);
5453c3577eSopenharmony_ci            auto data = Convert(dbAsset);
5553c3577eSopenharmony_ci            OhCloudExtValue *asset = OhCloudExtValueNew(
5653c3577eSopenharmony_ci                OhCloudExtValueType::VALUEINNERTYPE_ASSET, data.first, data.second);
5753c3577eSopenharmony_ci            value = asset;
5853c3577eSopenharmony_ci            valueLen = data.second;
5953c3577eSopenharmony_ci        } else if (dbValue.index() == TYPE_INDEX<DBAssets>) {
6053c3577eSopenharmony_ci            DBAssets dbAssets = std::get<DBAssets>(dbValue);
6153c3577eSopenharmony_ci            auto data = Convert(dbAssets);
6253c3577eSopenharmony_ci            OhCloudExtValue *assets = OhCloudExtValueNew(
6353c3577eSopenharmony_ci                OhCloudExtValueType::VALUEINNERTYPE_ASSETS, data.first, data.second);
6453c3577eSopenharmony_ci            value = assets;
6553c3577eSopenharmony_ci            valueLen = data.second;
6653c3577eSopenharmony_ci        } else {
6753c3577eSopenharmony_ci            auto data = Convert(dbValue);
6853c3577eSopenharmony_ci            value = data.first;
6953c3577eSopenharmony_ci            valueLen = data.second;
7053c3577eSopenharmony_ci        }
7153c3577eSopenharmony_ci        if (value == nullptr) {
7253c3577eSopenharmony_ci            return { nullptr, 0 };
7353c3577eSopenharmony_ci        }
7453c3577eSopenharmony_ci        auto status = OhCloudExtHashMapInsert(values,
7553c3577eSopenharmony_ci            const_cast<void *>(reinterpret_cast<const void *>(col.c_str())), col.size(), value, valueLen);
7653c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS) {
7753c3577eSopenharmony_ci            return { nullptr, 0 };
7853c3577eSopenharmony_ci        }
7953c3577eSopenharmony_ci        valuesLen += valueLen;
8053c3577eSopenharmony_ci    }
8153c3577eSopenharmony_ci    return { values, valuesLen };
8253c3577eSopenharmony_ci}
8353c3577eSopenharmony_ci
8453c3577eSopenharmony_cistd::pair<OhCloudExtValue *, size_t> ExtensionUtil::Convert(const DBValue &dbValue)
8553c3577eSopenharmony_ci{
8653c3577eSopenharmony_ci    OhCloudExtValue *value = nullptr;
8753c3577eSopenharmony_ci    size_t valueLen = 0;
8853c3577eSopenharmony_ci    if (dbValue.index() == TYPE_INDEX<int64_t>) {
8953c3577eSopenharmony_ci        int64_t val = std::get<int64_t>(dbValue);
9053c3577eSopenharmony_ci        value = OhCloudExtValueNew(OhCloudExtValueType::VALUEINNERTYPE_INT, &val, sizeof(int64_t));
9153c3577eSopenharmony_ci        valueLen = sizeof(int64_t);
9253c3577eSopenharmony_ci    } else if (dbValue.index() == TYPE_INDEX<std::string>) {
9353c3577eSopenharmony_ci        std::string val = std::get<std::string>(dbValue);
9453c3577eSopenharmony_ci        value = OhCloudExtValueNew(OhCloudExtValueType::VALUEINNERTYPE_STRING,
9553c3577eSopenharmony_ci            const_cast<void *>(reinterpret_cast<const void *>(val.c_str())), val.size());
9653c3577eSopenharmony_ci        valueLen = val.size();
9753c3577eSopenharmony_ci    } else if (dbValue.index() == TYPE_INDEX<bool>) {
9853c3577eSopenharmony_ci        bool val = std::get<bool>(dbValue);
9953c3577eSopenharmony_ci        value = OhCloudExtValueNew(OhCloudExtValueType::VALUEINNERTYPE_BOOL, &val, sizeof(bool));
10053c3577eSopenharmony_ci        valueLen = sizeof(bool);
10153c3577eSopenharmony_ci    } else if (dbValue.index() == TYPE_INDEX<DBBytes>) {
10253c3577eSopenharmony_ci        DBBytes val = std::get<DBBytes>(dbValue);
10353c3577eSopenharmony_ci        if (!val.empty()) {
10453c3577eSopenharmony_ci            value = OhCloudExtValueNew(OhCloudExtValueType::VALUEINNERTYPE_BYTES, &val[0], val.size());
10553c3577eSopenharmony_ci            valueLen = val.size() * sizeof(uint8_t);
10653c3577eSopenharmony_ci        }
10753c3577eSopenharmony_ci    } else {
10853c3577eSopenharmony_ci        value = OhCloudExtValueNew(OhCloudExtValueType::VALUEINNERTYPE_EMPTY, nullptr, 0);
10953c3577eSopenharmony_ci        valueLen = 0;
11053c3577eSopenharmony_ci    }
11153c3577eSopenharmony_ci    return { value, valueLen };
11253c3577eSopenharmony_ci}
11353c3577eSopenharmony_ci
11453c3577eSopenharmony_cistd::pair<OhCloudExtDatabase *, size_t> ExtensionUtil::Convert(const DBMeta &dbMeta)
11553c3577eSopenharmony_ci{
11653c3577eSopenharmony_ci    OhCloudExtHashMap *databases = OhCloudExtHashMapNew(OhCloudExtRustType::VALUETYPE_TABLE);
11753c3577eSopenharmony_ci    if (databases == nullptr) {
11853c3577eSopenharmony_ci        return { nullptr, 0 };
11953c3577eSopenharmony_ci    }
12053c3577eSopenharmony_ci    size_t dbLen = 0;
12153c3577eSopenharmony_ci    for (auto &table : dbMeta.tables) {
12253c3577eSopenharmony_ci        auto [fields, tbLen] = Convert(table);
12353c3577eSopenharmony_ci        if (fields == nullptr) {
12453c3577eSopenharmony_ci            return { nullptr, 0 };
12553c3577eSopenharmony_ci        }
12653c3577eSopenharmony_ci        OhCloudExtTable *tb = OhCloudExtTableNew(reinterpret_cast<const unsigned char *>(table.name.c_str()),
12753c3577eSopenharmony_ci            table.name.size(), reinterpret_cast<const unsigned char *>(table.alias.c_str()),
12853c3577eSopenharmony_ci            table.alias.size(), fields);
12953c3577eSopenharmony_ci        if (tb == nullptr) {
13053c3577eSopenharmony_ci            return { nullptr, 0 };
13153c3577eSopenharmony_ci        }
13253c3577eSopenharmony_ci        tbLen = tbLen + table.name.size() + table.alias.size();
13353c3577eSopenharmony_ci        auto status = OhCloudExtHashMapInsert(databases,
13453c3577eSopenharmony_ci            const_cast<void *>(reinterpret_cast<const void *>(table.name.c_str())), table.name.size(), tb, tbLen);
13553c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS) {
13653c3577eSopenharmony_ci            return { nullptr, 0 };
13753c3577eSopenharmony_ci        }
13853c3577eSopenharmony_ci    }
13953c3577eSopenharmony_ci    dbLen = dbLen + dbMeta.name.size() + dbMeta.alias.size();
14053c3577eSopenharmony_ci    OhCloudExtDatabase *db = OhCloudExtDatabaseNew(reinterpret_cast<const unsigned char *>(dbMeta.name.c_str()),
14153c3577eSopenharmony_ci        dbMeta.name.size(), reinterpret_cast<const unsigned char *>(dbMeta.alias.c_str()),
14253c3577eSopenharmony_ci        dbMeta.alias.size(), databases);
14353c3577eSopenharmony_ci    if (db == nullptr) {
14453c3577eSopenharmony_ci        return { nullptr, 0 };
14553c3577eSopenharmony_ci    }
14653c3577eSopenharmony_ci    return { db, dbLen };
14753c3577eSopenharmony_ci}
14853c3577eSopenharmony_ci
14953c3577eSopenharmony_cistd::pair<OhCloudExtVector *, size_t> ExtensionUtil::Convert(const DBTable &dbTable)
15053c3577eSopenharmony_ci{
15153c3577eSopenharmony_ci    size_t tbLen = 0;
15253c3577eSopenharmony_ci    OhCloudExtVector *fields = OhCloudExtVectorNew(OhCloudExtRustType::VALUETYPE_FIELD);
15353c3577eSopenharmony_ci    if (fields == nullptr) {
15453c3577eSopenharmony_ci        return { nullptr, 0 };
15553c3577eSopenharmony_ci    }
15653c3577eSopenharmony_ci    for (auto &field : dbTable.fields) {
15753c3577eSopenharmony_ci        size_t fdLen =  field.colName.size() + field.alias.size() + sizeof(int) + sizeof(bool) * 2;
15853c3577eSopenharmony_ci        OhCloudExtFieldBuilder builder {
15953c3577eSopenharmony_ci            .colName = reinterpret_cast<const unsigned char *>(field.colName.c_str()),
16053c3577eSopenharmony_ci            .colNameLen = field.colName.size(),
16153c3577eSopenharmony_ci            .alias = reinterpret_cast<const unsigned char *>(field.alias.c_str()),
16253c3577eSopenharmony_ci            .aliasLen = field.alias.size(),
16353c3577eSopenharmony_ci            .typ = static_cast<unsigned int>(field.type),
16453c3577eSopenharmony_ci            .primary = field.primary,
16553c3577eSopenharmony_ci            .nullable = field.nullable
16653c3577eSopenharmony_ci        };
16753c3577eSopenharmony_ci        OhCloudExtField *fd = OhCloudExtFieldNew(&builder);
16853c3577eSopenharmony_ci        if (fd == nullptr) {
16953c3577eSopenharmony_ci            return { nullptr, 0 };
17053c3577eSopenharmony_ci        }
17153c3577eSopenharmony_ci        OhCloudExtVectorPush(fields, fd, fdLen);
17253c3577eSopenharmony_ci        tbLen += fdLen;
17353c3577eSopenharmony_ci    }
17453c3577eSopenharmony_ci    return { fields, tbLen };
17553c3577eSopenharmony_ci}
17653c3577eSopenharmony_ci
17753c3577eSopenharmony_ciDBVBuckets ExtensionUtil::ConvertBuckets(OhCloudExtVector *values)
17853c3577eSopenharmony_ci{
17953c3577eSopenharmony_ci    DBVBuckets buckets;
18053c3577eSopenharmony_ci    size_t len = 0;
18153c3577eSopenharmony_ci    auto status = OhCloudExtVectorGetLength(values, reinterpret_cast<unsigned int *>(&len));
18253c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || len == 0) {
18353c3577eSopenharmony_ci        return buckets;
18453c3577eSopenharmony_ci    }
18553c3577eSopenharmony_ci    buckets.reserve(len);
18653c3577eSopenharmony_ci    for (size_t i = 0; i < len; i++) {
18753c3577eSopenharmony_ci        void *value = nullptr;
18853c3577eSopenharmony_ci        size_t valueLen = 0;
18953c3577eSopenharmony_ci        status = OhCloudExtVectorGet(values, i, &value, reinterpret_cast<unsigned int *>(&valueLen));
19053c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS || value == nullptr) {
19153c3577eSopenharmony_ci            return buckets;
19253c3577eSopenharmony_ci        }
19353c3577eSopenharmony_ci        auto pValues = std::shared_ptr<OhCloudExtHashMap>(reinterpret_cast<OhCloudExtHashMap *>(value),
19453c3577eSopenharmony_ci            [](auto *val) {
19553c3577eSopenharmony_ci                OhCloudExtHashMapFree(val);
19653c3577eSopenharmony_ci            });
19753c3577eSopenharmony_ci        buckets.emplace_back(ConvertBucket(pValues.get()));
19853c3577eSopenharmony_ci    }
19953c3577eSopenharmony_ci    return buckets;
20053c3577eSopenharmony_ci}
20153c3577eSopenharmony_ci
20253c3577eSopenharmony_ciDBVBucket ExtensionUtil::ConvertBucket(OhCloudExtHashMap *value)
20353c3577eSopenharmony_ci{
20453c3577eSopenharmony_ci    DBVBucket bucket;
20553c3577eSopenharmony_ci    OhCloudExtVector *valKeys = nullptr;
20653c3577eSopenharmony_ci    OhCloudExtVector *valValues = nullptr;
20753c3577eSopenharmony_ci    auto status = OhCloudExtHashMapIterGetKeyValuePair(value, &valKeys, &valValues);
20853c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || valKeys == nullptr || valValues == nullptr) {
20953c3577eSopenharmony_ci        return bucket;
21053c3577eSopenharmony_ci    }
21153c3577eSopenharmony_ci    auto pValKeys = std::shared_ptr<OhCloudExtVector>(valKeys, [](auto *valkey) { OhCloudExtVectorFree(valkey); });
21253c3577eSopenharmony_ci    auto pValValues = std::shared_ptr<OhCloudExtVector>(valValues, [](auto *valValue) {
21353c3577eSopenharmony_ci        OhCloudExtVectorFree(valValue);
21453c3577eSopenharmony_ci    });
21553c3577eSopenharmony_ci    size_t valKeysLen = 0;
21653c3577eSopenharmony_ci    size_t valValuesLen = 0;
21753c3577eSopenharmony_ci    OhCloudExtVectorGetLength(pValKeys.get(), reinterpret_cast<unsigned int *>(&valKeysLen));
21853c3577eSopenharmony_ci    OhCloudExtVectorGetLength(pValValues.get(), reinterpret_cast<unsigned int *>(&valValuesLen));
21953c3577eSopenharmony_ci    if (valKeysLen == 0 || valKeysLen != valValuesLen) {
22053c3577eSopenharmony_ci        return bucket;
22153c3577eSopenharmony_ci    }
22253c3577eSopenharmony_ci    for (size_t j = 0; j < valKeysLen; j++) {
22353c3577eSopenharmony_ci        void *keyItem = nullptr;
22453c3577eSopenharmony_ci        size_t keyItemLen = 0;
22553c3577eSopenharmony_ci        status = OhCloudExtVectorGet(pValKeys.get(), j, &keyItem, reinterpret_cast<unsigned int *>(&keyItemLen));
22653c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS || keyItem == nullptr) {
22753c3577eSopenharmony_ci            return bucket;
22853c3577eSopenharmony_ci        }
22953c3577eSopenharmony_ci        void *valueItem = nullptr;
23053c3577eSopenharmony_ci        size_t valueItemLen = 0;
23153c3577eSopenharmony_ci        status = OhCloudExtVectorGet(pValValues.get(), j, &valueItem, reinterpret_cast<unsigned int *>(&valueItemLen));
23253c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS || valueItem == nullptr) {
23353c3577eSopenharmony_ci            return bucket;
23453c3577eSopenharmony_ci        }
23553c3577eSopenharmony_ci        OhCloudExtValue *valueOut = reinterpret_cast<OhCloudExtValue *>(valueItem);
23653c3577eSopenharmony_ci        std::string keyOut(reinterpret_cast<char *>(keyItem), keyItemLen);
23753c3577eSopenharmony_ci        bucket[keyOut] = ConvertValue(valueOut);
23853c3577eSopenharmony_ci        OhCloudExtValueFree(valueOut);
23953c3577eSopenharmony_ci    }
24053c3577eSopenharmony_ci    return bucket;
24153c3577eSopenharmony_ci}
24253c3577eSopenharmony_ci
24353c3577eSopenharmony_ciDBValue ExtensionUtil::ConvertValue(OhCloudExtValue *value)
24453c3577eSopenharmony_ci{
24553c3577eSopenharmony_ci    DBValue result;
24653c3577eSopenharmony_ci    OhCloudExtValueType type = OhCloudExtValueType::VALUEINNERTYPE_EMPTY;
24753c3577eSopenharmony_ci    void *content = nullptr;
24853c3577eSopenharmony_ci    size_t ctLen = 0;
24953c3577eSopenharmony_ci    auto status = OhCloudExtValueGetContent(value, &type, &content, reinterpret_cast<unsigned int *>(&ctLen));
25053c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || content == nullptr) {
25153c3577eSopenharmony_ci        return result;
25253c3577eSopenharmony_ci    }
25353c3577eSopenharmony_ci    DoConvertValue(content, ctLen, type, result);
25453c3577eSopenharmony_ci    return result;
25553c3577eSopenharmony_ci}
25653c3577eSopenharmony_ci
25753c3577eSopenharmony_ciDBValue ExtensionUtil::ConvertValues(OhCloudExtValueBucket *bucket, const std::string &key)
25853c3577eSopenharmony_ci{
25953c3577eSopenharmony_ci    DBValue result;
26053c3577eSopenharmony_ci    auto keyStr = const_cast<unsigned char *>(reinterpret_cast<const unsigned char *>(key.c_str()));
26153c3577eSopenharmony_ci    OhCloudExtKeyName keyName = OhCloudExtKeyNameNew(keyStr, key.size());
26253c3577eSopenharmony_ci    OhCloudExtValueType type = OhCloudExtValueType::VALUEINNERTYPE_EMPTY;
26353c3577eSopenharmony_ci    void *content = nullptr;
26453c3577eSopenharmony_ci    unsigned int ctLen = 0;
26553c3577eSopenharmony_ci    auto status = OhCloudExtValueBucketGetValue(bucket, keyName, &type, &content, &ctLen);
26653c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || content == nullptr) {
26753c3577eSopenharmony_ci        return result;
26853c3577eSopenharmony_ci    }
26953c3577eSopenharmony_ci    DoConvertValue(content, ctLen, type, result);
27053c3577eSopenharmony_ci    return result;
27153c3577eSopenharmony_ci}
27253c3577eSopenharmony_ci
27353c3577eSopenharmony_civoid ExtensionUtil::DoConvertValue(void *content, unsigned int ctLen, OhCloudExtValueType type, DBValue &dbvalue)
27453c3577eSopenharmony_ci{
27553c3577eSopenharmony_ci    switch (type) {
27653c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_EMPTY:
27753c3577eSopenharmony_ci            break;
27853c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_INT:
27953c3577eSopenharmony_ci            dbvalue = *reinterpret_cast<int64_t *>(content);
28053c3577eSopenharmony_ci            break;
28153c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_BOOL:
28253c3577eSopenharmony_ci            dbvalue = *reinterpret_cast<bool *>(content);
28353c3577eSopenharmony_ci            break;
28453c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_STRING:
28553c3577eSopenharmony_ci            dbvalue = std::string(reinterpret_cast<char *>(content), ctLen);
28653c3577eSopenharmony_ci            break;
28753c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_BYTES: {
28853c3577eSopenharmony_ci            std::vector<uint8_t> bytes;
28953c3577eSopenharmony_ci            uint8_t *begin = reinterpret_cast<uint8_t *>(content);
29053c3577eSopenharmony_ci            for (size_t i = 0; i < ctLen; i++) {
29153c3577eSopenharmony_ci                uint8_t bt = *begin;
29253c3577eSopenharmony_ci                bytes.emplace_back(bt);
29353c3577eSopenharmony_ci                begin = begin + 1;
29453c3577eSopenharmony_ci            }
29553c3577eSopenharmony_ci            dbvalue = bytes;
29653c3577eSopenharmony_ci            break;
29753c3577eSopenharmony_ci        }
29853c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_ASSET: {
29953c3577eSopenharmony_ci            OhCloudExtCloudAsset *asset = reinterpret_cast<OhCloudExtCloudAsset *>(content);
30053c3577eSopenharmony_ci            dbvalue = ConvertAsset(asset);
30153c3577eSopenharmony_ci            OhCloudExtCloudAssetFree(asset);
30253c3577eSopenharmony_ci            break;
30353c3577eSopenharmony_ci        }
30453c3577eSopenharmony_ci        case OhCloudExtValueType::VALUEINNERTYPE_ASSETS: {
30553c3577eSopenharmony_ci            OhCloudExtVector *assets = reinterpret_cast<OhCloudExtVector *>(content);
30653c3577eSopenharmony_ci            dbvalue = ConvertAssets(assets);
30753c3577eSopenharmony_ci            OhCloudExtVectorFree(assets);
30853c3577eSopenharmony_ci            break;
30953c3577eSopenharmony_ci        }
31053c3577eSopenharmony_ci        default:
31153c3577eSopenharmony_ci            break;
31253c3577eSopenharmony_ci    }
31353c3577eSopenharmony_ci}
31453c3577eSopenharmony_ci
31553c3577eSopenharmony_ciDBAssets ExtensionUtil::ConvertAssets(OhCloudExtVector *values)
31653c3577eSopenharmony_ci{
31753c3577eSopenharmony_ci    DBAssets result;
31853c3577eSopenharmony_ci    size_t assetsLen = 0;
31953c3577eSopenharmony_ci    auto status = OhCloudExtVectorGetLength(values, reinterpret_cast<unsigned int *>(&assetsLen));
32053c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || assetsLen == 0) {
32153c3577eSopenharmony_ci        return result;
32253c3577eSopenharmony_ci    }
32353c3577eSopenharmony_ci    result.reserve(assetsLen);
32453c3577eSopenharmony_ci    for (size_t i = 0; i < assetsLen; i++) {
32553c3577eSopenharmony_ci        void *value = nullptr;
32653c3577eSopenharmony_ci        size_t valueLen = 0;
32753c3577eSopenharmony_ci        status = OhCloudExtVectorGet(values, i, &value, reinterpret_cast<unsigned int *>(&valueLen));
32853c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS || value == nullptr) {
32953c3577eSopenharmony_ci            return result;
33053c3577eSopenharmony_ci        }
33153c3577eSopenharmony_ci        OhCloudExtCloudAsset *asset = reinterpret_cast<OhCloudExtCloudAsset *>(value);
33253c3577eSopenharmony_ci        result.push_back(ConvertAsset(asset));
33353c3577eSopenharmony_ci        OhCloudExtCloudAssetFree(asset);
33453c3577eSopenharmony_ci    }
33553c3577eSopenharmony_ci    return result;
33653c3577eSopenharmony_ci}
33753c3577eSopenharmony_ci
33853c3577eSopenharmony_ciDBAsset ExtensionUtil::ConvertAsset(OhCloudExtCloudAsset *asset)
33953c3577eSopenharmony_ci{
34053c3577eSopenharmony_ci    DBAsset result;
34153c3577eSopenharmony_ci    unsigned char *id = nullptr;
34253c3577eSopenharmony_ci    size_t idLen = 0;
34353c3577eSopenharmony_ci    auto status = OhCloudExtCloudAssetGetId(asset, &id, reinterpret_cast<unsigned int *>(&idLen));
34453c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || id == nullptr) {
34553c3577eSopenharmony_ci        return result;
34653c3577eSopenharmony_ci    }
34753c3577eSopenharmony_ci    result.id = std::string(reinterpret_cast<char *>(id), idLen);
34853c3577eSopenharmony_ci    unsigned char *name = nullptr;
34953c3577eSopenharmony_ci    size_t nameLen = 0;
35053c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetName(asset, &name, reinterpret_cast<unsigned int *>(&nameLen));
35153c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || name == nullptr) {
35253c3577eSopenharmony_ci        return result;
35353c3577eSopenharmony_ci    }
35453c3577eSopenharmony_ci    result.name = std::string(reinterpret_cast<char *>(name), nameLen);
35553c3577eSopenharmony_ci    unsigned char *uri = nullptr;
35653c3577eSopenharmony_ci    size_t uriLen = 0;
35753c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetUri(asset, &uri, reinterpret_cast<unsigned int *>(&uriLen));
35853c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || uri == nullptr) {
35953c3577eSopenharmony_ci        return result;
36053c3577eSopenharmony_ci    }
36153c3577eSopenharmony_ci    result.uri = std::string(reinterpret_cast<char *>(uri), uriLen);
36253c3577eSopenharmony_ci    unsigned char *crtTime = nullptr;
36353c3577eSopenharmony_ci    size_t crtTimeLen = 0;
36453c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetCreateTime(asset, &crtTime, reinterpret_cast<unsigned int *>(&crtTimeLen));
36553c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || crtTime == nullptr) {
36653c3577eSopenharmony_ci        return result;
36753c3577eSopenharmony_ci    }
36853c3577eSopenharmony_ci    result.createTime = std::string(reinterpret_cast<char *>(crtTime), crtTimeLen);
36953c3577eSopenharmony_ci    ConvertAssetLeft(asset, result);
37053c3577eSopenharmony_ci    return result;
37153c3577eSopenharmony_ci}
37253c3577eSopenharmony_ci
37353c3577eSopenharmony_civoid ExtensionUtil::ConvertAssetLeft(OhCloudExtCloudAsset *asset, DBAsset &dbAsset)
37453c3577eSopenharmony_ci{
37553c3577eSopenharmony_ci    unsigned char *mdTime = nullptr;
37653c3577eSopenharmony_ci    size_t mdTimeLen = 0;
37753c3577eSopenharmony_ci    auto status = OhCloudExtCloudAssetGetModifiedTime(asset, &mdTime, reinterpret_cast<unsigned int *>(&mdTimeLen));
37853c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || mdTime == nullptr) {
37953c3577eSopenharmony_ci        return;
38053c3577eSopenharmony_ci    }
38153c3577eSopenharmony_ci    dbAsset.modifyTime = std::string(reinterpret_cast<char *>(mdTime), mdTimeLen);
38253c3577eSopenharmony_ci    unsigned char *size = nullptr;
38353c3577eSopenharmony_ci    size_t sizeLen = 0;
38453c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetSize(asset, &size, reinterpret_cast<unsigned int *>(&sizeLen));
38553c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || size == nullptr) {
38653c3577eSopenharmony_ci        return;
38753c3577eSopenharmony_ci    }
38853c3577eSopenharmony_ci    dbAsset.size = std::string(reinterpret_cast<char *>(size), sizeLen);
38953c3577eSopenharmony_ci    unsigned char *hash = nullptr;
39053c3577eSopenharmony_ci    size_t hashLen = 0;
39153c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetHash(asset, &hash, reinterpret_cast<unsigned int *>(&hashLen));
39253c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || hash == nullptr) {
39353c3577eSopenharmony_ci        return;
39453c3577eSopenharmony_ci    }
39553c3577eSopenharmony_ci    dbAsset.hash = std::string(reinterpret_cast<char *>(hash), hashLen);
39653c3577eSopenharmony_ci    unsigned char *path = nullptr;
39753c3577eSopenharmony_ci    size_t pathLen = 0;
39853c3577eSopenharmony_ci    status = OhCloudExtCloudAssetGetLocalPath(asset, &path, reinterpret_cast<unsigned int *>(&pathLen));
39953c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || path == nullptr) {
40053c3577eSopenharmony_ci        return;
40153c3577eSopenharmony_ci    }
40253c3577eSopenharmony_ci    dbAsset.path = std::string(reinterpret_cast<char *>(path), pathLen);
40353c3577eSopenharmony_ci}
40453c3577eSopenharmony_ci
40553c3577eSopenharmony_ciDBInfo ExtensionUtil::ConvertAppInfo(OhCloudExtAppInfo *appInfo)
40653c3577eSopenharmony_ci{
40753c3577eSopenharmony_ci    DBInfo info;
40853c3577eSopenharmony_ci    unsigned char *appId = nullptr;
40953c3577eSopenharmony_ci    size_t appIdLen = 0;
41053c3577eSopenharmony_ci    auto status = OhCloudExtAppInfoGetAppId(appInfo, &appId, reinterpret_cast<unsigned int *>(&appIdLen));
41153c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || appId == nullptr) {
41253c3577eSopenharmony_ci        return info;
41353c3577eSopenharmony_ci    }
41453c3577eSopenharmony_ci    info.appId = std::string(reinterpret_cast<char *>(appId), appIdLen);
41553c3577eSopenharmony_ci    unsigned char *bundle = nullptr;
41653c3577eSopenharmony_ci    size_t bundleLen = 0;
41753c3577eSopenharmony_ci    status = OhCloudExtAppInfoGetBundleName(appInfo, &bundle, reinterpret_cast<unsigned int *>(&bundleLen));
41853c3577eSopenharmony_ci    if (status != ERRNO_SUCCESS || bundle == nullptr) {
41953c3577eSopenharmony_ci        return info;
42053c3577eSopenharmony_ci    }
42153c3577eSopenharmony_ci    info.bundleName = std::string(reinterpret_cast<char *>(bundle), bundleLen);
42253c3577eSopenharmony_ci    OhCloudExtAppInfoGetCloudSwitch(appInfo, &info.cloudSwitch);
42353c3577eSopenharmony_ci    OhCloudExtAppInfoGetInstanceId(appInfo, &info.instanceId);
42453c3577eSopenharmony_ci    return info;
42553c3577eSopenharmony_ci}
42653c3577eSopenharmony_ci
42753c3577eSopenharmony_cistd::pair<OhCloudExtCloudAsset *, size_t> ExtensionUtil::Convert(const DBAsset &dbAsset)
42853c3577eSopenharmony_ci{
42953c3577eSopenharmony_ci    OhCloudExtCloudAssetBuilder builder {
43053c3577eSopenharmony_ci        .version = dbAsset.version,
43153c3577eSopenharmony_ci        .status = ConvertAssetStatus(static_cast<DBAssetStatus>(dbAsset.status)),
43253c3577eSopenharmony_ci        .expiresTime = dbAsset.expiresTime,
43353c3577eSopenharmony_ci        .id = reinterpret_cast<const unsigned char *>(dbAsset.id.c_str()),
43453c3577eSopenharmony_ci        .idLen = dbAsset.id.size(),
43553c3577eSopenharmony_ci        .name = reinterpret_cast<const unsigned char *>(dbAsset.name.c_str()),
43653c3577eSopenharmony_ci        .nameLen = dbAsset.name.size(),
43753c3577eSopenharmony_ci        .uri = reinterpret_cast<const unsigned char *>(dbAsset.uri.c_str()),
43853c3577eSopenharmony_ci        .uriLen = dbAsset.uri.size(),
43953c3577eSopenharmony_ci        .localPath = reinterpret_cast<const unsigned char *>(dbAsset.path.c_str()),
44053c3577eSopenharmony_ci        .localPathLen = dbAsset.path.size(),
44153c3577eSopenharmony_ci        .createTime = reinterpret_cast<const unsigned char *>(dbAsset.createTime.c_str()),
44253c3577eSopenharmony_ci        .createTimeLen = dbAsset.createTime.size(),
44353c3577eSopenharmony_ci        .modifyTime = reinterpret_cast<const unsigned char *>(dbAsset.modifyTime.c_str()),
44453c3577eSopenharmony_ci        .modifyTimeLen = dbAsset.modifyTime.size(),
44553c3577eSopenharmony_ci        .size = reinterpret_cast<const unsigned char *>(dbAsset.size.c_str()),
44653c3577eSopenharmony_ci        .sizeLen = dbAsset.size.size(),
44753c3577eSopenharmony_ci        .hash = reinterpret_cast<const unsigned char *>(dbAsset.hash.c_str()),
44853c3577eSopenharmony_ci        .hashLen = dbAsset.hash.size()
44953c3577eSopenharmony_ci    };
45053c3577eSopenharmony_ci    OhCloudExtCloudAsset *asset = OhCloudExtCloudAssetNew(&builder);
45153c3577eSopenharmony_ci    size_t assetLen = sizeof(uint64_t) * 2 + sizeof(OhCloudExtAssetStatus) + dbAsset.id.size()
45253c3577eSopenharmony_ci        + dbAsset.name.size() + dbAsset.uri.size() + dbAsset.createTime.size() + dbAsset.modifyTime.size()
45353c3577eSopenharmony_ci        + dbAsset.size.size() + dbAsset.hash.size() + dbAsset.path.size();
45453c3577eSopenharmony_ci    if (asset == nullptr) {
45553c3577eSopenharmony_ci        return { nullptr, 0 };
45653c3577eSopenharmony_ci    }
45753c3577eSopenharmony_ci    return { asset, assetLen };
45853c3577eSopenharmony_ci}
45953c3577eSopenharmony_ci
46053c3577eSopenharmony_cistd::pair<OhCloudExtVector *, size_t> ExtensionUtil::Convert(const DBAssets &dbAssets)
46153c3577eSopenharmony_ci{
46253c3577eSopenharmony_ci    OhCloudExtVector *assets = OhCloudExtVectorNew(OhCloudExtRustType::VALUETYPE_CLOUD_ASSET);
46353c3577eSopenharmony_ci    if (assets == nullptr) {
46453c3577eSopenharmony_ci        return { nullptr, 0 };
46553c3577eSopenharmony_ci    }
46653c3577eSopenharmony_ci    size_t assetsLen = 0;
46753c3577eSopenharmony_ci    for (const auto &dbAsset : dbAssets) {
46853c3577eSopenharmony_ci        auto data = Convert(dbAsset);
46953c3577eSopenharmony_ci        if (data.first == nullptr) {
47053c3577eSopenharmony_ci            return { nullptr, 0 };
47153c3577eSopenharmony_ci        }
47253c3577eSopenharmony_ci        auto status = OhCloudExtVectorPush(assets, data.first, data.second);
47353c3577eSopenharmony_ci        if (status != ERRNO_SUCCESS) {
47453c3577eSopenharmony_ci            return { nullptr, 0 };
47553c3577eSopenharmony_ci        }
47653c3577eSopenharmony_ci        assetsLen += 1;
47753c3577eSopenharmony_ci    }
47853c3577eSopenharmony_ci    return { assets, assetsLen };
47953c3577eSopenharmony_ci}
48053c3577eSopenharmony_ci
48153c3577eSopenharmony_ciOhCloudExtAssetStatus ExtensionUtil::ConvertAssetStatus(DBAssetStatus status)
48253c3577eSopenharmony_ci{
48353c3577eSopenharmony_ci    switch (status) {
48453c3577eSopenharmony_ci        case DBAssetStatus::STATUS_UNKNOWN:
48553c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_UNKNOWN;
48653c3577eSopenharmony_ci        case DBAssetStatus::STATUS_NORMAL:
48753c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_NORMAL;
48853c3577eSopenharmony_ci        case DBAssetStatus::STATUS_INSERT:
48953c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_INSERT;
49053c3577eSopenharmony_ci        case DBAssetStatus::STATUS_UPDATE:
49153c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_UPDATE;
49253c3577eSopenharmony_ci        case DBAssetStatus::STATUS_DELETE:
49353c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_DELETE;
49453c3577eSopenharmony_ci        case DBAssetStatus::STATUS_ABNORMAL:
49553c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_ABNORMAL;
49653c3577eSopenharmony_ci        case DBAssetStatus::STATUS_DOWNLOADING:
49753c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_DOWNLOADING;
49853c3577eSopenharmony_ci        case DBAssetStatus::STATUS_BUTT:
49953c3577eSopenharmony_ci            return OhCloudExtAssetStatus::ASSETSTATUS_BUTT;
50053c3577eSopenharmony_ci        default:
50153c3577eSopenharmony_ci            ZLOGI("err: 0x%{public}x", status);
50253c3577eSopenharmony_ci            break;
50353c3577eSopenharmony_ci    }
50453c3577eSopenharmony_ci    return OhCloudExtAssetStatus::ASSETSTATUS_UNKNOWN;
50553c3577eSopenharmony_ci}
50653c3577eSopenharmony_ci
50753c3577eSopenharmony_ciDBErr ExtensionUtil::ConvertStatus(int status)
50853c3577eSopenharmony_ci{
50953c3577eSopenharmony_ci    switch (status) {
51053c3577eSopenharmony_ci        case ERRNO_SUCCESS:
51153c3577eSopenharmony_ci            return DBErr::E_OK;
51253c3577eSopenharmony_ci        case ERRNO_NETWORK_ERROR:
51353c3577eSopenharmony_ci            return DBErr::E_NETWORK_ERROR;
51453c3577eSopenharmony_ci        case ERRNO_LOCKED_BY_OTHERS:
51553c3577eSopenharmony_ci            return DBErr::E_LOCKED_BY_OTHERS;
51653c3577eSopenharmony_ci        case ERRNO_RECORD_LIMIT_EXCEEDED:
51753c3577eSopenharmony_ci            return DBErr::E_RECODE_LIMIT_EXCEEDED;
51853c3577eSopenharmony_ci        case ERRNO_NO_SPACE_FOR_ASSET:
51953c3577eSopenharmony_ci            return DBErr::E_NO_SPACE_FOR_ASSET;
52053c3577eSopenharmony_ci        case ERRNO_UNSUPPORTED:
52153c3577eSopenharmony_ci            return DBErr::E_NOT_SUPPORT;
52253c3577eSopenharmony_ci        default:
52353c3577eSopenharmony_ci            ZLOGI("err: 0x%{public}x", status);
52453c3577eSopenharmony_ci            break;
52553c3577eSopenharmony_ci    }
52653c3577eSopenharmony_ci    return DBErr::E_ERROR;
52753c3577eSopenharmony_ci}
52853c3577eSopenharmony_ci} // namespace OHOS::CloudData