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 #define LOG_TAG "RdbUtils"
16 #include "rdb_utils.h"
17
18 #include "logger.h"
19 #include "raw_data_parser.h"
20
21 using namespace OHOS::Rdb;
22 using namespace OHOS::RdbDataShareAdapter;
23 using namespace OHOS::DataShare;
24 using namespace OHOS::NativeRdb;
25
26 constexpr RdbUtils::OperateHandler RdbUtils::HANDLERS[LAST_TYPE];
27
ToValuesBucket(DataShareValuesBucket valuesBucket)28 ValuesBucket RdbUtils::ToValuesBucket(DataShareValuesBucket valuesBucket)
29 {
30 std::map<std::string, ValueObject> valuesMap;
31 for (auto &[key, dsValue] : valuesBucket.valuesMap) {
32 ValueObject::Type value;
33 RawDataParser::Convert(std::move(dsValue), value);
34 valuesMap.insert(std::pair<std::string, ValueObject>(key, std::move(value)));
35 }
36 return ValuesBucket(valuesMap);
37 }
38
ToPredicates(const DataShareAbsPredicates & predicates,const std::string & table)39 RdbPredicates RdbUtils::ToPredicates(const DataShareAbsPredicates &predicates, const std::string &table)
40 {
41 RdbPredicates rdbPredicates(table);
42 if (predicates.GetSettingMode() == QUERY_LANGUAGE) {
43 rdbPredicates.SetWhereClause(predicates.GetWhereClause());
44 rdbPredicates.SetWhereArgs(predicates.GetWhereArgs());
45 rdbPredicates.SetOrder(predicates.GetOrder());
46 }
47
48 const auto &operations = predicates.GetOperationList();
49 for (const auto &oper : operations) {
50 if (oper.operation >= 0 && oper.operation < LAST_TYPE) {
51 (*HANDLERS[oper.operation])(oper, rdbPredicates);
52 }
53 }
54 return rdbPredicates;
55 }
56
ToValueObject(const DataSharePredicatesObject & predicatesObject)57 OHOS::NativeRdb::ValueObject RdbUtils::ToValueObject(const DataSharePredicatesObject &predicatesObject)
58 {
59 if (auto *val = std::get_if<int>(&predicatesObject.value)) {
60 return ValueObject(*val);
61 }
62 ValueObject::Type value;
63 RawDataParser::Convert(std::move(predicatesObject.value), value);
64 return value;
65 }
66
ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)67 std::shared_ptr<ResultSetBridge> RdbUtils::ToResultSetBridge(std::shared_ptr<ResultSet> resultSet)
68 {
69 if (resultSet == nullptr) {
70 LOG_ERROR("resultSet is null.");
71 return nullptr;
72 }
73 return std::make_shared<RdbResultSetBridge>(resultSet);
74 }
75
NoSupport(const OperationItem & item,RdbPredicates & query)76 void RdbUtils::NoSupport(const OperationItem &item, RdbPredicates &query)
77 {
78 LOG_ERROR("invalid operation:%{public}d", item.operation);
79 }
80
EqualTo(const OperationItem & item,RdbPredicates & predicates)81 void RdbUtils::EqualTo(const OperationItem &item, RdbPredicates &predicates)
82 {
83 predicates.EqualTo(item.GetSingle(0), ToValueObject(item.singleParams[1]));
84 }
85
NotEqualTo(const OperationItem & item,RdbPredicates & predicates)86 void RdbUtils::NotEqualTo(const OperationItem &item, RdbPredicates &predicates)
87 {
88 predicates.NotEqualTo(item.GetSingle(0), ToValueObject(item.singleParams[1]));
89 }
90
GreaterThan(const OperationItem & item,RdbPredicates & predicates)91 void RdbUtils::GreaterThan(const OperationItem &item, RdbPredicates &predicates)
92 {
93 predicates.GreaterThan(item.GetSingle(0), ToValueObject(item.singleParams[1]));
94 }
95
LessThan(const OperationItem & item,RdbPredicates & predicates)96 void RdbUtils::LessThan(const OperationItem &item, RdbPredicates &predicates)
97 {
98 predicates.LessThan(item.GetSingle(0), ToValueObject(item.singleParams[1]));
99 }
100
GreaterThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)101 void RdbUtils::GreaterThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
102 {
103 predicates.GreaterThanOrEqualTo(item.GetSingle(0), ToValueObject(item.singleParams[1]));
104 }
105
LessThanOrEqualTo(const OperationItem & item,RdbPredicates & predicates)106 void RdbUtils::LessThanOrEqualTo(const OperationItem &item, RdbPredicates &predicates)
107 {
108 predicates.LessThanOrEqualTo(item.GetSingle(0), ToValueObject(item.singleParams[1]));
109 }
110
And(const DataShare::OperationItem & item,RdbPredicates & predicates)111 void RdbUtils::And(const DataShare::OperationItem &item, RdbPredicates &predicates)
112 {
113 predicates.And();
114 }
115
Or(const DataShare::OperationItem & item,RdbPredicates & predicates)116 void RdbUtils::Or(const DataShare::OperationItem &item, RdbPredicates &predicates)
117 {
118 predicates.Or();
119 }
120
IsNull(const OperationItem & item,RdbPredicates & predicates)121 void RdbUtils::IsNull(const OperationItem &item, RdbPredicates &predicates)
122 {
123 predicates.IsNull(item.GetSingle(0));
124 }
125
IsNotNull(const DataShare::OperationItem & item,RdbPredicates & predicates)126 void RdbUtils::IsNotNull(const DataShare::OperationItem &item, RdbPredicates &predicates)
127 {
128 predicates.IsNotNull(item.GetSingle(0));
129 }
130
In(const DataShare::OperationItem & item,RdbPredicates & predicates)131 void RdbUtils::In(const DataShare::OperationItem &item, RdbPredicates &predicates)
132 {
133 predicates.In(item.GetSingle(0), MutliValue(item.multiParams[0]));
134 }
135
NotIn(const DataShare::OperationItem & item,RdbPredicates & predicates)136 void RdbUtils::NotIn(const DataShare::OperationItem &item, RdbPredicates &predicates)
137 {
138 predicates.NotIn(item.GetSingle(0), MutliValue(item.multiParams[0]));
139 }
140
Like(const DataShare::OperationItem & item,RdbPredicates & predicates)141 void RdbUtils::Like(const DataShare::OperationItem &item, RdbPredicates &predicates)
142 {
143 predicates.Like(item.GetSingle(0), ToValueObject(item.singleParams[1]));
144 }
145
NotLike(const DataShare::OperationItem & item,RdbPredicates & predicates)146 void RdbUtils::NotLike(const DataShare::OperationItem &item, RdbPredicates &predicates)
147 {
148 predicates.NotLike(item.GetSingle(0), ToValueObject(item.singleParams[1]));
149 }
150
OrderByAsc(const DataShare::OperationItem & item,RdbPredicates & predicates)151 void RdbUtils::OrderByAsc(const DataShare::OperationItem &item, RdbPredicates &predicates)
152 {
153 predicates.OrderByAsc(item.GetSingle(0));
154 }
155
OrderByDesc(const DataShare::OperationItem & item,RdbPredicates & predicates)156 void RdbUtils::OrderByDesc(const DataShare::OperationItem &item, RdbPredicates &predicates)
157 {
158 predicates.OrderByDesc(item.GetSingle(0));
159 }
160
Limit(const DataShare::OperationItem & item,RdbPredicates & predicates)161 void RdbUtils::Limit(const DataShare::OperationItem &item, RdbPredicates &predicates)
162 {
163 predicates.Limit(item.GetSingle(0));
164 predicates.Offset(item.GetSingle(1));
165 }
166
Offset(const DataShare::OperationItem & item,RdbPredicates & predicates)167 void RdbUtils::Offset(const DataShare::OperationItem &item, RdbPredicates &predicates)
168 {
169 predicates.Offset(item.GetSingle(0));
170 }
171
BeginWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)172 void RdbUtils::BeginWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
173 {
174 predicates.BeginWrap();
175 }
176
EndWrap(const DataShare::OperationItem & item,RdbPredicates & predicates)177 void RdbUtils::EndWrap(const DataShare::OperationItem &item, RdbPredicates &predicates)
178 {
179 predicates.EndWrap();
180 }
181
BeginsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)182 void RdbUtils::BeginsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
183 {
184 predicates.BeginsWith(item.GetSingle(0), ToValueObject(item.singleParams[1]));
185 }
186
EndsWith(const DataShare::OperationItem & item,RdbPredicates & predicates)187 void RdbUtils::EndsWith(const DataShare::OperationItem &item, RdbPredicates &predicates)
188 {
189 predicates.EndsWith(item.GetSingle(0), ToValueObject(item.singleParams[1]));
190 }
191
Distinct(const DataShare::OperationItem & item,RdbPredicates & predicates)192 void RdbUtils::Distinct(const DataShare::OperationItem &item, RdbPredicates &predicates)
193 {
194 predicates.Distinct();
195 }
196
GroupBy(const DataShare::OperationItem & item,RdbPredicates & predicates)197 void RdbUtils::GroupBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
198 {
199 predicates.GroupBy(MutliValue(item.multiParams[0]));
200 }
201
IndexedBy(const DataShare::OperationItem & item,RdbPredicates & predicates)202 void RdbUtils::IndexedBy(const DataShare::OperationItem &item, RdbPredicates &predicates)
203 {
204 predicates.IndexedBy(item.GetSingle(0));
205 }
206
Contains(const DataShare::OperationItem & item,RdbPredicates & predicates)207 void RdbUtils::Contains(const DataShare::OperationItem &item, RdbPredicates &predicates)
208 {
209 predicates.Contains(item.GetSingle(0), ToValueObject(item.singleParams[1]));
210 }
211
NotContains(const DataShare::OperationItem & item,RdbPredicates & predicates)212 void RdbUtils::NotContains(const DataShare::OperationItem &item, RdbPredicates &predicates)
213 {
214 predicates.NotContains(item.GetSingle(0), ToValueObject(item.singleParams[1]));
215 }
216
Glob(const DataShare::OperationItem & item,RdbPredicates & predicates)217 void RdbUtils::Glob(const DataShare::OperationItem &item, RdbPredicates &predicates)
218 {
219 predicates.Glob(item.GetSingle(0), ToValueObject(item.singleParams[1]));
220 }
221
Between(const DataShare::OperationItem & item,RdbPredicates & predicates)222 void RdbUtils::Between(const DataShare::OperationItem &item, RdbPredicates &predicates)
223 {
224 // singleParams[2] is another param
225 predicates.Between(item.GetSingle(0), ToValueObject(item.singleParams[1]), ToValueObject(item.singleParams[2]));
226 }
227
NotBetween(const DataShare::OperationItem & item,RdbPredicates & predicates)228 void RdbUtils::NotBetween(const DataShare::OperationItem &item, RdbPredicates &predicates)
229 {
230 // singleParams[2] is another param
231 predicates.NotBetween(item.GetSingle(0), ToValueObject(item.singleParams[1]), ToValueObject(item.singleParams[2]));
232 }
233
CrossJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)234 void RdbUtils::CrossJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
235 {
236 predicates.CrossJoin(item.GetSingle(0));
237 }
238
InnerJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)239 void RdbUtils::InnerJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
240 {
241 predicates.InnerJoin(item.GetSingle(0));
242 }
243
LeftOuterJoin(const DataShare::OperationItem & item,RdbPredicates & predicates)244 void RdbUtils::LeftOuterJoin(const DataShare::OperationItem &item, RdbPredicates &predicates)
245 {
246 predicates.LeftOuterJoin(item.GetSingle(0));
247 }
248
Using(const DataShare::OperationItem & item,RdbPredicates & predicates)249 void RdbUtils::Using(const DataShare::OperationItem &item, RdbPredicates &predicates)
250 {
251 predicates.Using(MutliValue(item.multiParams[0]));
252 }
253
On(const DataShare::OperationItem & item,RdbPredicates & predicates)254 void RdbUtils::On(const DataShare::OperationItem &item, RdbPredicates &predicates)
255 {
256 predicates.On(MutliValue(item.multiParams[0]));
257 }
258
RdbUtils()259 RdbUtils::RdbUtils()
260 {
261 }
262
~RdbUtils()263 RdbUtils::~RdbUtils()
264 {
265 }
266