1 /*
2 * Copyright (c) 2024 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 #define LOG_TAG "RdUtils"
17 #include "rd_utils.h"
18
19 #include <iomanip>
20 #include <iostream>
21 #include <securec.h>
22 #include <sstream>
23 #include <string>
24
25 #include "grd_error.h"
26 #include "grd_api_manager.h"
27 #include "logger.h"
28 #include "remote_result_set.h"
29 #include "task_executor.h"
30
31 namespace OHOS {
32 namespace NativeRdb {
33 using namespace OHOS::Rdb;
34
35 static GRD_APIInfo GRD_KVApiInfo;
36
37 GRD_ThreadPoolT RdUtils::threadPool_ = { 0 };
38
39 struct GrdErrnoPair {
40 int32_t grdCode;
41 int kvDbCode;
42 };
43
44 const GrdErrnoPair GRD_ERRNO_MAP[] = {
45 { GRD_OK, E_OK },
46 { GRD_REBUILD_DATABASE, E_OK },
47 { GRD_NO_DATA, E_NO_MORE_ROWS },
48 { GRD_DATA_CORRUPTED, E_SQLITE_CORRUPT },
49 { GRD_INVALID_FILE_FORMAT, E_SQLITE_CORRUPT },
50 { GRD_PRIMARY_KEY_VIOLATION, E_SQLITE_CONSTRAINT },
51 { GRD_RESTRICT_VIOLATION, E_SQLITE_CONSTRAINT },
52 { GRD_CONSTRAINT_CHECK_VIOLATION, E_SQLITE_CONSTRAINT },
53 { GRD_NOT_SUPPORT, E_NOT_SUPPORT },
54 { GRD_OVER_LIMIT, E_SQLITE_CONSTRAINT },
55 { GRD_INVALID_ARGS, E_INVALID_ARGS },
56 { GRD_FAILED_FILE_OPERATION, E_SQLITE_IOERR },
57 { GRD_INSUFFICIENT_SPACE, E_SQLITE_FULL },
58 { GRD_RESOURCE_BUSY, E_DATABASE_BUSY },
59 { GRD_DB_BUSY, E_DATABASE_BUSY },
60 { GRD_FAILED_MEMORY_ALLOCATE, E_SQLITE_NOMEM },
61 { GRD_CRC_CHECK_DISABLED, E_INVALID_ARGS },
62 { GRD_DISK_SPACE_FULL, E_SQLITE_FULL },
63
64 { GRD_PERMISSION_DENIED, E_SQLITE_PERM },
65 { GRD_PASSWORD_UNMATCHED, E_SQLITE_CANTOPEN },
66 { GRD_PASSWORD_NEED_REKEY, E_CHANGE_UNENCRYPTED_TO_ENCRYPTED },
67
68 { GRD_NAME_TOO_LONG, E_SQLITE_CONSTRAINT },
69 { GRD_INVALID_TABLE_DEFINITION, E_SQLITE_ERROR },
70 { GRD_SEMANTIC_ERROR, E_NOT_SUPPORT_THE_SQL },
71 { GRD_SYNTAX_ERROR, E_NOT_SUPPORT_THE_SQL },
72 { GRD_DATATYPE_MISMATCH, E_SQLITE_MISMATCH },
73 { GRD_WRONG_STMT_OBJECT, E_INVALID_OBJECT_TYPE },
74 { GRD_DATA_CONFLICT, E_SQLITE_CONSTRAINT },
75
76 { GRD_ACTIVE_TRANSACTION, E_SQLITE_ERROR },
77 { GRD_UNIQUE_VIOLATION, E_SQLITE_CONSTRAINT },
78 { GRD_DUPLICATE_TABLE, E_SQLITE_ERROR },
79 { GRD_UNDEFINED_TABLE, E_SQLITE_ERROR },
80 { GRD_INVALID_BIND_VALUE, E_SQLITE_ERROR },
81 { GRD_SCHEMA_CHANGED, E_SQLITE_ERROR },
82
83 { GRD_JSON_OPERATION_NOT_SUPPORT, E_NOT_SUPPORT_THE_SQL },
84 { GRD_MODEL_NOT_SUPPORT, E_NOT_SUPPORT_THE_SQL },
85 { GRD_FEATURE_NOT_SUPPORTED, E_NOT_SUPPORT_THE_SQL },
86
87 { GRD_JSON_LEN_LIMIT, E_SQLITE_TOOBIG },
88 { GRD_SUBSCRIPTION_EXCEEDED_LIMIT, E_ERROR },
89 { GRD_SYNC_EXCEED_TASK_QUEUE_LIMIT, E_ERROR },
90 { GRD_SHARED_OBJ_ENABLE_UNDO_EXCEED_LIMIT, E_ERROR },
91 { GRD_TABLE_LIMIT_EXCEEDED, E_SQLITE_CONSTRAINT },
92
93 { GRD_FIELD_TYPE_NOT_MATCH, E_SQLITE_MISMATCH },
94 { GRD_LARGE_JSON_NEST, E_NOT_SUPPORT_THE_SQL },
95 { GRD_INVALID_JSON_TYPE, E_SQLITE_ERROR },
96 { GRD_INVALID_CONFIG_VALUE, E_CONFIG_INVALID_CHANGE },
97 { GRD_INVALID_OPERATOR, E_SQLITE_ERROR },
98 { GRD_INVALID_PROJECTION_FIELD, E_SQLITE_ERROR },
99 { GRD_INVALID_PROJECTION_VALUE, E_SQLITE_ERROR },
100 { GRD_COLLECTION_NOT_EXIST, E_ERROR },
101 { GRD_DB_NOT_EXIST, E_ERROR },
102 { GRD_INVALID_VALUE, E_SQLITE_ERROR },
103 { GRD_SHARED_OBJ_NOT_EXIST, E_ERROR },
104 { GRD_SUBSCRIBE_NOT_EXIST, E_ERROR },
105 { GRD_SHARED_OBJ_UNDO_MANAGER_NOT_EXIST, E_ERROR },
106 { GRD_SHARED_OBJ_INVALID_UNDO, E_ERROR },
107 { GRD_SHARED_OBJ_INVALID_REDO, E_ERROR },
108
109 { GRD_JSON_LIB_HANDLE_FAILED, E_ERROR },
110 { GRD_DIRECTORY_OPERATE_FAILED, E_SQLITE_IOERR },
111 { GRD_FILE_OPERATE_FAILED, E_SQLITE_IOERR },
112 { GRD_LOAD_THIRD_PARTY_LIBRARY_FAILED, E_ERROR },
113 { GRD_THIRD_PARTY_FUNCTION_EXECUTE_FAILED, E_ERROR },
114 { GRD_INSUFFICIENT_RESOURCES, E_ERROR },
115
116 { GRD_RESULTSET_BUSY, E_DATABASE_BUSY },
117 { GRD_RECORD_NOT_FOUND, E_SQLITE_ERROR },
118 { GRD_FIELD_NOT_FOUND, E_SQLITE_ERROR },
119 { GRD_ARRAY_INDEX_NOT_FOUND, E_SQLITE_ERROR },
120 { GRD_KEY_CONFLICT, E_SQLITE_CONSTRAINT },
121 { GRD_FIELD_TYPE_CONFLICT, E_SQLITE_MISMATCH },
122 { GRD_SHARED_OBJ_CONFLICT, E_SQLITE_CONSTRAINT },
123 { GRD_SUBSCRIBE_CONFLICT, E_ERROR },
124 { GRD_EQUIP_ID_CONFLICT, E_SQLITE_CONSTRAINT },
125 { GRD_SHARED_OBJ_ENABLE_UNDO_CONFLICT, E_ERROR },
126
127 { GRD_DATA_EXCEPTION, E_SQLITE_CORRUPT },
128 { GRD_FIELD_OVERFLOW, E_SQLITE_ERROR },
129 { GRD_DIVISION_BY_ZERO, E_SQLITE_ERROR },
130 { GRD_RESULT_SET_NOT_AVAILABLE, E_ERROR },
131 { GRD_SHARED_OBJ_UNDO_NOT_AVAILABLE, E_ERROR },
132 { GRD_SHARED_OBJ_REDO_NOT_AVAILABLE, E_ERROR },
133 { GRD_TRANSACTION_ROLLBACK, E_SQLITE_ERROR },
134 { GRD_NO_ACTIVE_TRANSACTION, E_SQLITE_ERROR },
135
136 { GRD_DUPLICATE_COLUMN, E_SQLITE_ERROR },
137 { GRD_DUPLICATE_OBJECT, E_SQLITE_ERROR },
138 { GRD_UNDEFINE_COLUMN, E_SQLITE_ERROR },
139 { GRD_UNDEFINED_OBJECT, E_SQLITE_ERROR },
140 { GRD_INVALID_JSON_FORMAT, E_ERROR },
141 { GRD_INVALID_KEY_FORMAT, E_ERROR },
142 { GRD_INVALID_COLLECTION_NAME, E_ERROR },
143 { GRD_INVALID_EQUIP_ID, E_SQLITE_CONSTRAINT },
144 { GRD_REQUEST_TIME_OUT, E_DATABASE_BUSY },
145
146 { GRD_SYNC_PREREQUISITES_ABNORMAL, E_ERROR },
147 { GRD_CALC_MODE_SET_PERMISSION_DENIED, E_ERROR },
148 { GRD_SYSTEM_ERR, E_ERROR },
149 { GRD_INNER_ERR, E_ERROR },
150 { GRD_FAILED_MEMORY_RELEASE, E_ERROR },
151 { GRD_NOT_AVAILABLE, E_ERROR },
152 { GRD_INVALID_FORMAT, E_ERROR },
153 { GRD_TIME_OUT, E_DATABASE_BUSY },
154 { GRD_DB_INSTANCE_ABNORMAL, E_ERROR },
155 { GRD_CIPHER_ERROR, E_ERROR },
156 };
157
TransferGrdErrno(int err)158 int RdUtils::TransferGrdErrno(int err)
159 {
160 if (err > 0) {
161 return err;
162 }
163 for (const auto &item : GRD_ERRNO_MAP) {
164 if (item.grdCode == err) {
165 return item.kvDbCode;
166 }
167 }
168 return E_ERROR;
169 }
170
TransferGrdTypeToColType(int grdColType)171 ColumnType RdUtils::TransferGrdTypeToColType(int grdColType)
172 {
173 switch (grdColType) {
174 case GRD_DB_DATATYPE_INTEGER:
175 return ColumnType::TYPE_INTEGER;
176 case GRD_DB_DATATYPE_FLOAT:
177 return ColumnType::TYPE_FLOAT;
178 case GRD_DB_DATATYPE_TEXT:
179 return ColumnType::TYPE_STRING;
180 case GRD_DB_DATATYPE_BLOB:
181 return ColumnType::TYPE_BLOB;
182 case GRD_DB_DATATYPE_FLOATVECTOR:
183 return ColumnType::TYPE_FLOAT32_ARRAY;
184 default:
185 break;
186 }
187 return ColumnType::TYPE_NULL;
188 }
189
RdDbOpen(const char * dbPath,const char * configStr,uint32_t flags,GRD_DB ** db)190 int RdUtils::RdDbOpen(const char *dbPath, const char *configStr, uint32_t flags, GRD_DB **db)
191 {
192 if (GRD_KVApiInfo.DBOpenApi == nullptr) {
193 GRD_KVApiInfo = GetApiInfoInstance();
194 }
195 if (GRD_KVApiInfo.DBOpenApi == nullptr) {
196 return E_NOT_SUPPORT;
197 }
198 return TransferGrdErrno(GRD_KVApiInfo.DBOpenApi(dbPath, configStr, flags, db));
199 }
200
RdDbClose(GRD_DB * db,uint32_t flags)201 int RdUtils::RdDbClose(GRD_DB *db, uint32_t flags)
202 {
203 if (GRD_KVApiInfo.DBCloseApi == nullptr) {
204 GRD_KVApiInfo = GetApiInfoInstance();
205 }
206 if (GRD_KVApiInfo.DBCloseApi == nullptr) {
207 return E_NOT_SUPPORT;
208 }
209 return TransferGrdErrno(GRD_KVApiInfo.DBCloseApi(db, flags));
210 }
211
RdDbRepair(const char * dbPath,const char * configStr)212 int RdUtils::RdDbRepair(const char *dbPath, const char *configStr)
213 {
214 if (GRD_KVApiInfo.DBRepairApi == nullptr) {
215 GRD_KVApiInfo = GetApiInfoInstance();
216 }
217 if (GRD_KVApiInfo.DBRepairApi == nullptr) {
218 return E_NOT_SUPPORT;
219 }
220 return TransferGrdErrno(GRD_KVApiInfo.DBRepairApi(dbPath, configStr));
221 }
222
RdSqlPrepare(GRD_DB * db,const char * str,uint32_t strLen,GRD_SqlStmt ** stmt,const char ** unusedStr)223 int RdUtils::RdSqlPrepare(GRD_DB *db, const char *str, uint32_t strLen, GRD_SqlStmt **stmt, const char **unusedStr)
224 {
225 if (GRD_KVApiInfo.DBSqlPrepare == nullptr) {
226 GRD_KVApiInfo = GetApiInfoInstance();
227 }
228 if (GRD_KVApiInfo.DBSqlPrepare == nullptr) {
229 return E_NOT_SUPPORT;
230 }
231 return TransferGrdErrno(GRD_KVApiInfo.DBSqlPrepare(db, str, strLen, stmt, unusedStr));
232 }
233
RdSqlReset(GRD_SqlStmt * stmt)234 int RdUtils::RdSqlReset(GRD_SqlStmt *stmt)
235 {
236 if (GRD_KVApiInfo.DBSqlReset == nullptr) {
237 GRD_KVApiInfo = GetApiInfoInstance();
238 }
239 if (GRD_KVApiInfo.DBSqlReset == nullptr) {
240 return E_NOT_SUPPORT;
241 }
242 return TransferGrdErrno(GRD_KVApiInfo.DBSqlReset(stmt));
243 }
244
RdSqlFinalize(GRD_SqlStmt * stmt)245 int RdUtils::RdSqlFinalize(GRD_SqlStmt *stmt)
246 {
247 if (GRD_KVApiInfo.DBSqlFinalize == nullptr) {
248 GRD_KVApiInfo = GetApiInfoInstance();
249 }
250 if (GRD_KVApiInfo.DBSqlFinalize == nullptr) {
251 return E_NOT_SUPPORT;
252 }
253 return TransferGrdErrno(GRD_KVApiInfo.DBSqlFinalize(stmt));
254 }
255
RdSqlFreeBlob(void * blobElementSize)256 void RdSqlFreeBlob(void *blobElementSize)
257 {
258 delete[] ((uint8_t *)blobElementSize);
259 }
260
RdSqlBindBlob(GRD_SqlStmt * stmt,uint32_t idx,const void * val,int32_t len,void (* freeFunc)(void *))261 int RdUtils::RdSqlBindBlob(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))
262 {
263 if (GRD_KVApiInfo.DBSqlBindBlob == nullptr) {
264 GRD_KVApiInfo = GetApiInfoInstance();
265 }
266 if (GRD_KVApiInfo.DBSqlBindBlob == nullptr) {
267 return E_NOT_SUPPORT;
268 }
269 if (len <= 0) {
270 LOG_ERROR("Invalid len %{public}d", len);
271 return E_INVALID_ARGS;
272 }
273 uint8_t *tmpVal = new (std::nothrow)uint8_t[len]();
274 if (tmpVal == nullptr) {
275 return E_ERROR;
276 }
277 errno_t err = memcpy_s(tmpVal, len * sizeof(uint8_t), val, len * sizeof(uint8_t));
278 if (err != EOK) {
279 delete[] tmpVal;
280 LOG_ERROR("BindBlob failed due to memcpy %{public}d, len is %{public}d", err, len);
281 return TransferGrdErrno(GRD_INNER_ERR);
282 }
283 if (freeFunc == nullptr) {
284 freeFunc = RdSqlFreeBlob;
285 }
286 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindBlob(stmt, idx, tmpVal, len, freeFunc));
287 }
288
RdSqlFreeCharStr(void * charStr)289 void RdSqlFreeCharStr(void *charStr)
290 {
291 delete[] ((char *)charStr);
292 }
293
RdSqlBindText(GRD_SqlStmt * stmt,uint32_t idx,const void * val,int32_t len,void (* freeFunc)(void *))294 int RdUtils::RdSqlBindText(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))
295 {
296 if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
297 GRD_KVApiInfo = GetApiInfoInstance();
298 }
299 if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
300 return E_NOT_SUPPORT;
301 }
302 if (len <= 0) {
303 LOG_ERROR("Invalid len %{public}d", len);
304 return E_INVALID_ARGS;
305 }
306 char *tmpVal = new (std::nothrow)char[len + 1]();
307 if (tmpVal == nullptr) {
308 return E_ERROR;
309 }
310 errno_t err = strcpy_s(tmpVal, len + 1, (const char *)val);
311 if (err != EOK) {
312 LOG_ERROR("BindText failed due to strycpy %{public}d, len is %{public}d", err, len + 1);
313 delete[] tmpVal;
314 return TransferGrdErrno(GRD_INNER_ERR);
315 }
316 if (freeFunc == nullptr) {
317 freeFunc = RdSqlFreeCharStr;
318 }
319 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindText(stmt, idx, tmpVal, len, freeFunc));
320 }
321
RdSqlBindInt(GRD_SqlStmt * stmt,uint32_t idx,int32_t val)322 int RdUtils::RdSqlBindInt(GRD_SqlStmt *stmt, uint32_t idx, int32_t val)
323 {
324 if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
325 GRD_KVApiInfo = GetApiInfoInstance();
326 }
327 if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
328 return E_NOT_SUPPORT;
329 }
330 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt(stmt, idx, val));
331 }
332
RdSqlBindInt64(GRD_SqlStmt * stmt,uint32_t idx,int64_t val)333 int RdUtils::RdSqlBindInt64(GRD_SqlStmt *stmt, uint32_t idx, int64_t val)
334 {
335 if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
336 GRD_KVApiInfo = GetApiInfoInstance();
337 }
338 if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
339 return E_NOT_SUPPORT;
340 }
341 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt64(stmt, idx, val));
342 }
343
RdSqlBindDouble(GRD_SqlStmt * stmt,uint32_t idx,double val)344 int RdUtils::RdSqlBindDouble(GRD_SqlStmt *stmt, uint32_t idx, double val)
345 {
346 if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
347 GRD_KVApiInfo = GetApiInfoInstance();
348 }
349 if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
350 return E_NOT_SUPPORT;
351 }
352 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindDouble(stmt, idx, val));
353 }
354
RdSqlBindNull(GRD_SqlStmt * stmt,uint32_t idx)355 int RdUtils::RdSqlBindNull(GRD_SqlStmt *stmt, uint32_t idx)
356 {
357 if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
358 GRD_KVApiInfo = GetApiInfoInstance();
359 }
360 if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
361 return E_NOT_SUPPORT;
362 }
363 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindNull(stmt, idx));
364 }
365
RdSqlFreeFloatArr(void * floatElement)366 void RdSqlFreeFloatArr(void *floatElement)
367 {
368 delete[] ((float *)floatElement);
369 }
370
RdSqlBindFloatVector(GRD_SqlStmt * stmt,uint32_t idx,float * val,uint32_t dim,void (* freeFunc)(void *))371 int RdUtils::RdSqlBindFloatVector(GRD_SqlStmt *stmt, uint32_t idx, float *val,
372 uint32_t dim, void (*freeFunc)(void *))
373 {
374 if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
375 GRD_KVApiInfo = GetApiInfoInstance();
376 }
377 if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
378 return E_NOT_SUPPORT;
379 }
380 if (dim <= 0) {
381 LOG_ERROR("Invalid dim %{public}d", dim);
382 return E_INVALID_ARGS;
383 }
384 float *tmpVal = new (std::nothrow)float[dim]();
385 if (tmpVal == nullptr) {
386 return E_ERROR;
387 }
388 errno_t err = memcpy_s(tmpVal, dim * sizeof(float), val, dim * sizeof(float));
389 if (err != EOK) {
390 delete[] tmpVal;
391 LOG_ERROR("BindFloat failed due to memcpy %{public}d, dim is %{public}d", err, dim);
392 return TransferGrdErrno(GRD_INNER_ERR);
393 }
394 if (freeFunc == nullptr) {
395 freeFunc = RdSqlFreeFloatArr;
396 }
397 return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindFloatVector(stmt, idx, tmpVal, dim, freeFunc));
398 }
399
RdSqlStep(GRD_SqlStmt * stmt)400 int RdUtils::RdSqlStep(GRD_SqlStmt *stmt)
401 {
402 if (GRD_KVApiInfo.DBSqlStep == nullptr) {
403 GRD_KVApiInfo = GetApiInfoInstance();
404 }
405 if (GRD_KVApiInfo.DBSqlStep == nullptr) {
406 return E_NOT_SUPPORT;
407 }
408 return TransferGrdErrno(GRD_KVApiInfo.DBSqlStep(stmt));
409 }
410
RdSqlColCnt(GRD_SqlStmt * stmt)411 int RdUtils::RdSqlColCnt(GRD_SqlStmt *stmt)
412 {
413 if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
414 GRD_KVApiInfo = GetApiInfoInstance();
415 }
416 if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
417 return E_NOT_SUPPORT;
418 }
419 return TransferGrdErrno(GRD_KVApiInfo.DBSqlColCnt(stmt));
420 }
421
RdSqlColType(GRD_SqlStmt * stmt,uint32_t idx)422 ColumnType RdUtils::RdSqlColType(GRD_SqlStmt *stmt, uint32_t idx)
423 {
424 if (GRD_KVApiInfo.DBSqlColType == nullptr) {
425 GetApiInfoInstance();
426 }
427 if (GRD_KVApiInfo.DBSqlColType == nullptr) {
428 return TransferGrdTypeToColType(0); // for invalid
429 }
430 return TransferGrdTypeToColType(GRD_KVApiInfo.DBSqlColType(stmt, idx));
431 }
432
RdSqlColBytes(GRD_SqlStmt * stmt,uint32_t idx)433 int RdUtils::RdSqlColBytes(GRD_SqlStmt *stmt, uint32_t idx)
434 {
435 if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
436 GRD_KVApiInfo = GetApiInfoInstance();
437 }
438 if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
439 return E_NOT_SUPPORT;
440 }
441 return TransferGrdErrno(GRD_KVApiInfo.DBSqlColBytes(stmt, idx));
442 }
443
RdSqlColName(GRD_SqlStmt * stmt,uint32_t idx)444 char *RdUtils::RdSqlColName(GRD_SqlStmt *stmt, uint32_t idx)
445 {
446 if (GRD_KVApiInfo.DBSqlColName == nullptr) {
447 GRD_KVApiInfo = GetApiInfoInstance();
448 }
449 if (GRD_KVApiInfo.DBSqlColName == nullptr) {
450 return nullptr;
451 }
452 return GRD_KVApiInfo.DBSqlColName(stmt, idx);
453 }
454
RdSqlColValue(GRD_SqlStmt * stmt,uint32_t idx)455 GRD_DbValueT RdUtils::RdSqlColValue(GRD_SqlStmt *stmt, uint32_t idx)
456 {
457 if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
458 GRD_KVApiInfo = GetApiInfoInstance();
459 }
460 if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
461 return {};
462 }
463 return GRD_KVApiInfo.DBSqlColValue(stmt, idx);
464 }
465
RdSqlColBlob(GRD_SqlStmt * stmt,uint32_t idx)466 const void *RdUtils::RdSqlColBlob(GRD_SqlStmt *stmt, uint32_t idx)
467 {
468 if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
469 GRD_KVApiInfo = GetApiInfoInstance();
470 }
471 if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
472 return nullptr;
473 }
474 return GRD_KVApiInfo.DBSqlColBlob(stmt, idx);
475 }
476
RdSqlColText(GRD_SqlStmt * stmt,uint32_t idx)477 const char *RdUtils::RdSqlColText(GRD_SqlStmt *stmt, uint32_t idx)
478 {
479 if (GRD_KVApiInfo.DBSqlColText == nullptr) {
480 GRD_KVApiInfo = GetApiInfoInstance();
481 }
482 if (GRD_KVApiInfo.DBSqlColText == nullptr) {
483 return nullptr;
484 }
485 return GRD_KVApiInfo.DBSqlColText(stmt, idx);
486 }
487
RdSqlColInt(GRD_SqlStmt * stmt,uint32_t idx)488 int32_t RdUtils::RdSqlColInt(GRD_SqlStmt *stmt, uint32_t idx)
489 {
490 if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
491 GRD_KVApiInfo = GetApiInfoInstance();
492 }
493 if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
494 return 0;
495 }
496 return GRD_KVApiInfo.DBSqlColInt(stmt, idx);
497 }
498
RdSqlColInt64(GRD_SqlStmt * stmt,uint32_t idx)499 int64_t RdUtils::RdSqlColInt64(GRD_SqlStmt *stmt, uint32_t idx)
500 {
501 if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
502 GRD_KVApiInfo = GetApiInfoInstance();
503 }
504 if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
505 return 0;
506 }
507 return GRD_KVApiInfo.DBSqlColInt64(stmt, idx);
508 }
509
RdSqlColDouble(GRD_SqlStmt * stmt,uint32_t idx)510 double RdUtils::RdSqlColDouble(GRD_SqlStmt *stmt, uint32_t idx)
511 {
512 if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
513 GRD_KVApiInfo = GetApiInfoInstance();
514 }
515 if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
516 return 0;
517 }
518 return GRD_KVApiInfo.DBSqlColDouble(stmt, idx);
519 }
520
RdSqlColumnFloatVector(GRD_SqlStmt * stmt,uint32_t idx,uint32_t * dim)521 const float *RdUtils::RdSqlColumnFloatVector(GRD_SqlStmt *stmt, uint32_t idx, uint32_t *dim)
522 {
523 if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
524 GRD_KVApiInfo = GetApiInfoInstance();
525 }
526 if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
527 return nullptr;
528 }
529 return GRD_KVApiInfo.DBSqlColumnFloatVector(stmt, idx, dim);
530 }
531
ClearAndZeroString(std::string & str)532 void RdUtils::ClearAndZeroString(std::string &str)
533 {
534 std::fill(str.begin(), str.end(), char(0));
535 str.clear();
536 }
537
GetEncryptKey(const std::vector<uint8_t> & encryptedKey,char outBuff[],size_t outBufSize)538 const char *RdUtils::GetEncryptKey(const std::vector<uint8_t> &encryptedKey, char outBuff[], size_t outBufSize)
539 {
540 char *buffer = nullptr;
541 for (size_t i = 0; i < encryptedKey.size(); i++) {
542 buffer = (char *)(outBuff + i * 2); // each uint8_t will convert to 2 hex char
543 // each uint8_t will convert to 2 hex char
544 errno_t err = snprintf_s(buffer, outBufSize - i * 2, outBufSize - i * 2, "%02x", encryptedKey[i]);
545 if (err < 0) {
546 return nullptr;
547 }
548 }
549 return outBuff;
550 }
551
RdDbBackup(GRD_DB * db,const char * backupDbFile,const std::vector<uint8_t> & encryptedKey)552 int RdUtils::RdDbBackup(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
553 {
554 if (GRD_KVApiInfo.DBBackupApi == nullptr) {
555 GRD_KVApiInfo = GetApiInfoInstance();
556 }
557 if (GRD_KVApiInfo.DBBackupApi == nullptr) {
558 return E_NOT_SUPPORT;
559 }
560 const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
561 char key[keySize];
562 GRD_CipherInfoT info = { 0 };
563 info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
564 int ret = TransferGrdErrno(GRD_KVApiInfo.DBBackupApi(db, backupDbFile, &info));
565 errno_t err = memset_s(key, keySize, 0, keySize);
566 if (err != E_OK) {
567 LOG_ERROR("can not memset 0, size %{public}zu", keySize);
568 return E_ERROR;
569 }
570 return ret;
571 }
572
RdDbRestore(const char * dbFile,const char * backupDbFile,const std::vector<uint8_t> & encryptedKey)573 int RdUtils::RdDbRestore(const char *dbFile, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
574 {
575 if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
576 GRD_KVApiInfo = GetApiInfoInstance();
577 }
578 if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
579 return E_NOT_SUPPORT;
580 }
581 const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
582 char key[keySize];
583 GRD_CipherInfoT info = { 0 };
584 info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
585 int ret = TransferGrdErrno(GRD_KVApiInfo.DBRestoreApi(dbFile, backupDbFile, &info));
586 errno_t err = memset_s(key, keySize, 0, keySize);
587 if (err != E_OK) {
588 LOG_ERROR("can not memset 0, size %{public}zu", keySize);
589 return E_ERROR;
590 }
591 return ret;
592 }
593
RdDbRekey(const char * dbFile,const char * configStr,const std::vector<uint8_t> & encryptedKey)594 int RdUtils::RdDbRekey(const char *dbFile, const char *configStr, const std::vector<uint8_t> &encryptedKey)
595 {
596 if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
597 GRD_KVApiInfo = GetApiInfoInstance();
598 }
599 if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
600 return E_NOT_SUPPORT;
601 }
602 const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
603 char key[keySize];
604 GRD_CipherInfoT info = { 0 };
605 info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
606 int ret = TransferGrdErrno(GRD_KVApiInfo.DBReKeyApi(dbFile, configStr, &info));
607 errno_t err = memset_s(key, keySize, 0, keySize);
608 if (err != E_OK) {
609 LOG_ERROR("can not memset 0, size %{public}zu", keySize);
610 return E_ERROR;
611 }
612 return ret;
613 }
614
RdDbGetVersion(GRD_DB * db,GRD_ConfigTypeE type,int & version)615 int RdUtils::RdDbGetVersion(GRD_DB *db, GRD_ConfigTypeE type, int &version)
616 {
617 if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
618 GRD_KVApiInfo = GetApiInfoInstance();
619 }
620 if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
621 return E_NOT_SUPPORT;
622 }
623 GRD_DbValueT value = GRD_KVApiInfo.DBGetConfigApi(db, type);
624 version = value.value.longValue;
625 return E_OK;
626 }
627
RdDbSetVersion(GRD_DB * db,GRD_ConfigTypeE type,int version)628 int RdUtils::RdDbSetVersion(GRD_DB *db, GRD_ConfigTypeE type, int version)
629 {
630 if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
631 GRD_KVApiInfo = GetApiInfoInstance();
632 }
633 if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
634 return E_NOT_SUPPORT;
635 }
636 GRD_DbValueT value;
637 value.type = GRD_DB_DATATYPE_INTEGER;
638 value.value.longValue = version;
639 return TransferGrdErrno(GRD_KVApiInfo.DBSetConfigApi(db, type, value));
640 }
641
Schedule(void * func,void * param)642 static void Schedule(void *func, void *param)
643 {
644 auto pool = TaskExecutor::GetInstance().GetExecutor();
645 if (pool == nullptr) {
646 LOG_ERROR("pool is nullptr");
647 return;
648 }
649 pool->Execute([func, param]() {
650 void (*funcPtr)(void *) = reinterpret_cast<void (*)(void *)>(func);
651 funcPtr(param);
652 });
653 }
654
RdSqlRegistryThreadPool(GRD_DB * db)655 int RdUtils::RdSqlRegistryThreadPool(GRD_DB *db)
656 {
657 if (GRD_KVApiInfo.DBSqlRegistryThreadPool == nullptr) {
658 GRD_KVApiInfo = GetApiInfoInstance();
659 }
660 if (GRD_KVApiInfo.DBSqlRegistryThreadPool == nullptr) {
661 LOG_ERROR("registry threadPool ptr is nullptr");
662 return E_NOT_SUPPORT;
663 }
664 RdUtils::threadPool_.schedule = reinterpret_cast<GRD_ScheduleFunc>(Schedule);
665 return TransferGrdErrno(GRD_KVApiInfo.DBSqlRegistryThreadPool(db, &threadPool_));
666 }
667
668 } // namespace NativeRdb
669 } // namespace OHOS
670