1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef KV_UTILS_H 17 #define KV_UTILS_H 18 19 #include "types.h" 20 #include "datashare_abs_predicates.h" 21 #include "data_query.h" 22 #include "datashare_values_bucket.h" 23 #include "kvstore_result_set.h" 24 #include "result_set_bridge.h" 25 #include "visibility.h" 26 27 namespace OHOS { 28 namespace DistributedKv { 29 class KvUtils { 30 public: 31 enum { 32 STRING = 0, 33 INTEGER = 1, 34 FLOAT = 2, 35 BYTE_ARRAY = 3, 36 BOOLEAN = 4, 37 DOUBLE = 5, 38 INVALID = 255 39 }; 40 API_EXPORT static std::shared_ptr<DataShare::ResultSetBridge> ToResultSetBridge( 41 std::shared_ptr<KvStoreResultSet> resultSet); 42 API_EXPORT static Status ToQuery(const DataShare::DataShareAbsPredicates &predicates, DataQuery &query) 43 __attribute__((no_sanitize("cfi"))); 44 API_EXPORT static Entry ToEntry(const DataShare::DataShareValuesBucket &valueBucket); 45 API_EXPORT static std::vector<Entry> ToEntries(const std::vector<DataShare::DataShareValuesBucket> &valueBuckets); 46 API_EXPORT static Status GetKeys(const DataShare::DataShareAbsPredicates &predicates, std::vector<Key> &keys) 47 __attribute__((no_sanitize("cfi"))); 48 private: 49 static void NoSupport(const DataShare::OperationItem &oper, DataQuery &query); 50 static void EqualTo(const DataShare::OperationItem &oper, DataQuery &query); 51 static void NotEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 52 static void GreaterThan(const DataShare::OperationItem &oper, DataQuery &query); 53 static void LessThan(const DataShare::OperationItem &oper, DataQuery &query); 54 static void GreaterThanOrEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 55 static void LessThanOrEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 56 static void And(const DataShare::OperationItem &oper, DataQuery &query); 57 static void Or(const DataShare::OperationItem &oper, DataQuery &query); 58 static void IsNull(const DataShare::OperationItem &oper, DataQuery &query); 59 static void IsNotNull(const DataShare::OperationItem &oper, DataQuery &query); 60 static void In(const DataShare::OperationItem &oper, DataQuery &query); 61 static void NotIn(const DataShare::OperationItem &oper, DataQuery &query); 62 static void Like(const DataShare::OperationItem &oper, DataQuery &query); 63 static void Unlike(const DataShare::OperationItem &oper, DataQuery &query); 64 static void OrderByAsc(const DataShare::OperationItem &oper, DataQuery &query); 65 static void OrderByDesc(const DataShare::OperationItem &oper, DataQuery &query); 66 static void Limit(const DataShare::OperationItem &oper, DataQuery &query); 67 static void InKeys(const DataShare::OperationItem &oper, DataQuery &query); 68 static void KeyPrefix(const DataShare::OperationItem &oper, DataQuery &query); 69 70 KvUtils(KvUtils &&) = delete; 71 KvUtils(const KvUtils &) = delete; 72 KvUtils &operator=(KvUtils &&) = delete; 73 KvUtils &operator=(const KvUtils &) = delete; 74 ~KvUtils() = delete; 75 static Status ToEntryKey(const std::map<std::string, DataShare::DataShareValueObject::Type> &values, Blob &blob); 76 static Status ToEntryValue(const std::map<std::string, DataShare::DataShareValueObject::Type> &values, Blob &blob); 77 static const std::string KEY; 78 static const std::string VALUE; 79 using QueryHandler = void (*)(const DataShare::OperationItem &, DataQuery &); 80 static constexpr QueryHandler HANDLERS[DataShare::LAST_TYPE] = { 81 [DataShare::INVALID_OPERATION] = &KvUtils::NoSupport, 82 [DataShare::EQUAL_TO] = &KvUtils::EqualTo, 83 [DataShare::NOT_EQUAL_TO] = &KvUtils::NotEqualTo, 84 [DataShare::GREATER_THAN] = &KvUtils::GreaterThan, 85 [DataShare::LESS_THAN] = &KvUtils::LessThan, 86 [DataShare::GREATER_THAN_OR_EQUAL_TO] = &KvUtils::GreaterThanOrEqualTo, 87 [DataShare::LESS_THAN_OR_EQUAL_TO] = &KvUtils::LessThanOrEqualTo, 88 [DataShare::AND] = &KvUtils::And, 89 [DataShare::OR] = &KvUtils::Or, 90 [DataShare::IS_NULL] = &KvUtils::IsNull, 91 [DataShare::IS_NOT_NULL] = &KvUtils::IsNotNull, 92 [DataShare::SQL_IN] = &KvUtils::In, 93 [DataShare::NOT_IN] = &KvUtils::NotIn, 94 [DataShare::LIKE] = &KvUtils::Like, 95 [DataShare::UNLIKE] = &KvUtils::Unlike, 96 [DataShare::ORDER_BY_ASC] = &KvUtils::OrderByAsc, 97 [DataShare::ORDER_BY_DESC] = &KvUtils::OrderByDesc, 98 [DataShare::LIMIT] = &KvUtils::Limit, 99 [DataShare::OFFSET] = &KvUtils::NoSupport, 100 [DataShare::BEGIN_WARP] = &KvUtils::NoSupport, 101 [DataShare::END_WARP] = &KvUtils::NoSupport, 102 [DataShare::BEGIN_WITH] = &KvUtils::NoSupport, 103 [DataShare::END_WITH] = &KvUtils::NoSupport, 104 [DataShare::IN_KEY] = &KvUtils::InKeys, 105 [DataShare::DISTINCT] = &KvUtils::NoSupport, 106 [DataShare::GROUP_BY] = &KvUtils::NoSupport, 107 [DataShare::INDEXED_BY] = &KvUtils::NoSupport, 108 [DataShare::CONTAINS] = &KvUtils::NoSupport, 109 [DataShare::GLOB] = &KvUtils::NoSupport, 110 [DataShare::BETWEEN] = &KvUtils::NoSupport, 111 [DataShare::NOTBETWEEN] = &KvUtils::NoSupport, 112 [DataShare::KEY_PREFIX] = &KvUtils::KeyPrefix, 113 }; 114 }; 115 } // namespace DistributedKv 116 } // namespace OHOS 117 #endif // KV_UTILS_H