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