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 #define KV_UTILS_PUSH_WARNING _Pragma("GCC diagnostic push") 28 #define KV_UTILS_POP_WARNING _Pragma("GCC diagnostic pop") 29 #define KV_UTILS_GNU_DISABLE_WARNING_INTERNAL2(warningName) #warningName 30 #define KV_UTILS_GNU_DISABLE_WARNING(warningName) \ 31 _Pragma( \ 32 KV_UTILS_GNU_DISABLE_WARNING_INTERNAL2(GCC diagnostic ignored warningName)) 33 34 namespace OHOS { 35 namespace DistributedKv { 36 class KvUtils { 37 public: 38 enum { 39 STRING = 0, 40 INTEGER = 1, 41 FLOAT = 2, 42 BYTE_ARRAY = 3, 43 BOOLEAN = 4, 44 DOUBLE = 5, 45 INVALID = 255 46 }; 47 API_EXPORT static std::shared_ptr<DataShare::ResultSetBridge> ToResultSetBridge( 48 std::shared_ptr<KvStoreResultSet> resultSet); 49 API_EXPORT static Status ToQuery(const DataShare::DataShareAbsPredicates &predicates, DataQuery &query) 50 __attribute__((no_sanitize("cfi"))); 51 API_EXPORT static Entry ToEntry(const DataShare::DataShareValuesBucket &valueBucket); 52 API_EXPORT static std::vector<Entry> ToEntries(const std::vector<DataShare::DataShareValuesBucket> &valueBuckets); 53 API_EXPORT static Status GetKeys(const DataShare::DataShareAbsPredicates &predicates, std::vector<Key> &keys) 54 __attribute__((no_sanitize("cfi"))); 55 private: 56 static void NoSupport(const DataShare::OperationItem &oper, DataQuery &query); 57 static void EqualTo(const DataShare::OperationItem &oper, DataQuery &query); 58 static void NotEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 59 static void GreaterThan(const DataShare::OperationItem &oper, DataQuery &query); 60 static void LessThan(const DataShare::OperationItem &oper, DataQuery &query); 61 static void GreaterThanOrEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 62 static void LessThanOrEqualTo(const DataShare::OperationItem &oper, DataQuery &query); 63 static void And(const DataShare::OperationItem &oper, DataQuery &query); 64 static void Or(const DataShare::OperationItem &oper, DataQuery &query); 65 static void IsNull(const DataShare::OperationItem &oper, DataQuery &query); 66 static void IsNotNull(const DataShare::OperationItem &oper, DataQuery &query); 67 static void In(const DataShare::OperationItem &oper, DataQuery &query); 68 static void NotIn(const DataShare::OperationItem &oper, DataQuery &query); 69 static void Like(const DataShare::OperationItem &oper, DataQuery &query); 70 static void Unlike(const DataShare::OperationItem &oper, DataQuery &query); 71 static void OrderByAsc(const DataShare::OperationItem &oper, DataQuery &query); 72 static void OrderByDesc(const DataShare::OperationItem &oper, DataQuery &query); 73 static void Limit(const DataShare::OperationItem &oper, DataQuery &query); 74 static void InKeys(const DataShare::OperationItem &oper, DataQuery &query); 75 static void KeyPrefix(const DataShare::OperationItem &oper, DataQuery &query); 76 77 KvUtils(KvUtils &&) = delete; 78 KvUtils(const KvUtils &) = delete; 79 KvUtils &operator=(KvUtils &&) = delete; 80 KvUtils &operator=(const KvUtils &) = delete; 81 ~KvUtils() = delete; 82 static Status ToEntryKey(const std::map<std::string, DataShare::DataShareValueObject::Type> &values, Blob &blob); 83 static Status ToEntryValue(const std::map<std::string, DataShare::DataShareValueObject::Type> &values, Blob &blob); 84 static const std::string KEY; 85 static const std::string VALUE; 86 using QueryHandler = void (*)(const DataShare::OperationItem &, DataQuery &); 87 KV_UTILS_PUSH_WARNING 88 KV_UTILS_GNU_DISABLE_WARNING("-Wc99-designator") 89 static constexpr QueryHandler HANDLERS[DataShare::LAST_TYPE] = { 90 [DataShare::INVALID_OPERATION] = &KvUtils::NoSupport, 91 [DataShare::EQUAL_TO] = &KvUtils::EqualTo, 92 [DataShare::NOT_EQUAL_TO] = &KvUtils::NotEqualTo, 93 [DataShare::GREATER_THAN] = &KvUtils::GreaterThan, 94 [DataShare::LESS_THAN] = &KvUtils::LessThan, 95 [DataShare::GREATER_THAN_OR_EQUAL_TO] = &KvUtils::GreaterThanOrEqualTo, 96 [DataShare::LESS_THAN_OR_EQUAL_TO] = &KvUtils::LessThanOrEqualTo, 97 [DataShare::AND] = &KvUtils::And, 98 [DataShare::OR] = &KvUtils::Or, 99 [DataShare::IS_NULL] = &KvUtils::IsNull, 100 [DataShare::IS_NOT_NULL] = &KvUtils::IsNotNull, 101 [DataShare::SQL_IN] = &KvUtils::In, 102 [DataShare::NOT_IN] = &KvUtils::NotIn, 103 [DataShare::LIKE] = &KvUtils::Like, 104 [DataShare::UNLIKE] = &KvUtils::Unlike, 105 [DataShare::ORDER_BY_ASC] = &KvUtils::OrderByAsc, 106 [DataShare::ORDER_BY_DESC] = &KvUtils::OrderByDesc, 107 [DataShare::LIMIT] = &KvUtils::Limit, 108 [DataShare::OFFSET] = &KvUtils::NoSupport, 109 [DataShare::BEGIN_WARP] = &KvUtils::NoSupport, 110 [DataShare::END_WARP] = &KvUtils::NoSupport, 111 [DataShare::BEGIN_WITH] = &KvUtils::NoSupport, 112 [DataShare::END_WITH] = &KvUtils::NoSupport, 113 [DataShare::IN_KEY] = &KvUtils::InKeys, 114 [DataShare::DISTINCT] = &KvUtils::NoSupport, 115 [DataShare::GROUP_BY] = &KvUtils::NoSupport, 116 [DataShare::INDEXED_BY] = &KvUtils::NoSupport, 117 [DataShare::CONTAINS] = &KvUtils::NoSupport, 118 [DataShare::GLOB] = &KvUtils::NoSupport, 119 [DataShare::BETWEEN] = &KvUtils::NoSupport, 120 [DataShare::NOTBETWEEN] = &KvUtils::NoSupport, 121 [DataShare::KEY_PREFIX] = &KvUtils::KeyPrefix, 122 }; 123 KV_UTILS_POP_WARNING 124 }; 125 } // namespace DistributedKv 126 } // namespace OHOS 127 #endif // KV_UTILS_H