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