• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DbThreadPoolT 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     int result = TransferGrdErrno(GRD_KVApiInfo.DBSqlBindBlob(stmt, idx, tmpVal, len, freeFunc));
287     if (result != E_OK) {
288         LOG_ERROR("DBSqlBindBlob failed, error code: %{public}d", result);
289         freeFunc(tmpVal);
290     }
291     return result;
292 }
293 
RdSqlFreeCharStr(void * charStr)294 void RdSqlFreeCharStr(void *charStr)
295 {
296     delete[] ((char *)charStr);
297 }
298 
RdSqlBindText(GRD_SqlStmt * stmt,uint32_t idx,const void * val,int32_t len,void (* freeFunc)(void *))299 int RdUtils::RdSqlBindText(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))
300 {
301     if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
302         GRD_KVApiInfo = GetApiInfoInstance();
303     }
304     if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
305         return E_NOT_SUPPORT;
306     }
307     if (len < 0) {
308         LOG_ERROR("Invalid len %{public}d", len);
309         return E_INVALID_ARGS;
310     }
311     char *tmpVal = new (std::nothrow)char[len + 1]();
312     if (tmpVal == nullptr) {
313         return E_ERROR;
314     }
315     errno_t err = strcpy_s(tmpVal, len + 1, (const char *)val);
316     if (err != EOK) {
317         LOG_ERROR("BindText failed due to strycpy %{public}d, len is %{public}d", err, len + 1);
318         delete[] tmpVal;
319         return TransferGrdErrno(GRD_INNER_ERR);
320     }
321     if (freeFunc == nullptr) {
322         freeFunc = RdSqlFreeCharStr;
323     }
324     int result = TransferGrdErrno(GRD_KVApiInfo.DBSqlBindText(stmt, idx, tmpVal, len, freeFunc));
325     if (result != E_OK) {
326         LOG_ERROR("DBSqlBindText failed, error code: %{public}d", result);
327         freeFunc(tmpVal);
328     }
329     return result;
330 }
331 
RdSqlBindInt(GRD_SqlStmt * stmt,uint32_t idx,int32_t val)332 int RdUtils::RdSqlBindInt(GRD_SqlStmt *stmt, uint32_t idx, int32_t val)
333 {
334     if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
335         GRD_KVApiInfo = GetApiInfoInstance();
336     }
337     if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
338         return E_NOT_SUPPORT;
339     }
340     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt(stmt, idx, val));
341 }
342 
RdSqlBindInt64(GRD_SqlStmt * stmt,uint32_t idx,int64_t val)343 int RdUtils::RdSqlBindInt64(GRD_SqlStmt *stmt, uint32_t idx, int64_t val)
344 {
345     if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
346         GRD_KVApiInfo = GetApiInfoInstance();
347     }
348     if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
349         return E_NOT_SUPPORT;
350     }
351     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt64(stmt, idx, val));
352 }
353 
RdSqlBindDouble(GRD_SqlStmt * stmt,uint32_t idx,double val)354 int RdUtils::RdSqlBindDouble(GRD_SqlStmt *stmt, uint32_t idx, double val)
355 {
356     if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
357         GRD_KVApiInfo = GetApiInfoInstance();
358     }
359     if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
360         return E_NOT_SUPPORT;
361     }
362     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindDouble(stmt, idx, val));
363 }
364 
RdSqlBindNull(GRD_SqlStmt * stmt,uint32_t idx)365 int RdUtils::RdSqlBindNull(GRD_SqlStmt *stmt, uint32_t idx)
366 {
367     if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
368         GRD_KVApiInfo = GetApiInfoInstance();
369     }
370     if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
371         return E_NOT_SUPPORT;
372     }
373     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindNull(stmt, idx));
374 }
375 
RdSqlFreeFloatArr(void * floatElement)376 void RdSqlFreeFloatArr(void *floatElement)
377 {
378     delete[] ((float *)floatElement);
379 }
380 
RdSqlBindFloatVector(GRD_SqlStmt * stmt,uint32_t idx,float * val,uint32_t dim,void (* freeFunc)(void *))381 int RdUtils::RdSqlBindFloatVector(GRD_SqlStmt *stmt, uint32_t idx, float *val,
382     uint32_t dim, void (*freeFunc)(void *))
383 {
384     if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
385         GRD_KVApiInfo = GetApiInfoInstance();
386     }
387     if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
388         return E_NOT_SUPPORT;
389     }
390     if (dim <= 0) {
391         LOG_ERROR("Invalid dim %{public}d", dim);
392         return E_INVALID_ARGS;
393     }
394     float *tmpVal = new (std::nothrow)float[dim]();
395     if (tmpVal == nullptr) {
396         return E_ERROR;
397     }
398     errno_t err = memcpy_s(tmpVal, dim * sizeof(float), val, dim * sizeof(float));
399     if (err != EOK) {
400         delete[] tmpVal;
401         LOG_ERROR("BindFloat failed due to memcpy %{public}d, dim is %{public}d", err, dim);
402         return TransferGrdErrno(GRD_INNER_ERR);
403     }
404     if (freeFunc == nullptr) {
405         freeFunc = RdSqlFreeFloatArr;
406     }
407     int result = TransferGrdErrno(GRD_KVApiInfo.DBSqlBindFloatVector(stmt, idx, tmpVal, dim, freeFunc));
408     if (result != E_OK) {
409         LOG_ERROR("DBSqlBindFloatVector failed, error code: %{public}d", result);
410         freeFunc(tmpVal);
411     }
412     return result;
413 }
414 
RdSqlStep(GRD_SqlStmt * stmt)415 int RdUtils::RdSqlStep(GRD_SqlStmt *stmt)
416 {
417     if (GRD_KVApiInfo.DBSqlStep == nullptr) {
418         GRD_KVApiInfo = GetApiInfoInstance();
419     }
420     if (GRD_KVApiInfo.DBSqlStep == nullptr) {
421         return E_NOT_SUPPORT;
422     }
423     return TransferGrdErrno(GRD_KVApiInfo.DBSqlStep(stmt));
424 }
425 
RdSqlColCnt(GRD_SqlStmt * stmt)426 int RdUtils::RdSqlColCnt(GRD_SqlStmt *stmt)
427 {
428     if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
429         GRD_KVApiInfo = GetApiInfoInstance();
430     }
431     if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
432         return E_NOT_SUPPORT;
433     }
434     return TransferGrdErrno(GRD_KVApiInfo.DBSqlColCnt(stmt));
435 }
436 
RdSqlColType(GRD_SqlStmt * stmt,uint32_t idx)437 ColumnType RdUtils::RdSqlColType(GRD_SqlStmt *stmt, uint32_t idx)
438 {
439     if (GRD_KVApiInfo.DBSqlColType == nullptr) {
440         GetApiInfoInstance();
441     }
442     if (GRD_KVApiInfo.DBSqlColType == nullptr) {
443         return TransferGrdTypeToColType(0); // for invalid
444     }
445     return TransferGrdTypeToColType(GRD_KVApiInfo.DBSqlColType(stmt, idx));
446 }
447 
RdSqlColBytes(GRD_SqlStmt * stmt,uint32_t idx)448 int RdUtils::RdSqlColBytes(GRD_SqlStmt *stmt, uint32_t idx)
449 {
450     if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
451         GRD_KVApiInfo = GetApiInfoInstance();
452     }
453     if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
454         return E_NOT_SUPPORT;
455     }
456     return TransferGrdErrno(GRD_KVApiInfo.DBSqlColBytes(stmt, idx));
457 }
458 
RdSqlColName(GRD_SqlStmt * stmt,uint32_t idx)459 char *RdUtils::RdSqlColName(GRD_SqlStmt *stmt, uint32_t idx)
460 {
461     if (GRD_KVApiInfo.DBSqlColName == nullptr) {
462         GRD_KVApiInfo = GetApiInfoInstance();
463     }
464     if (GRD_KVApiInfo.DBSqlColName == nullptr) {
465         return nullptr;
466     }
467     return GRD_KVApiInfo.DBSqlColName(stmt, idx);
468 }
469 
RdSqlColValue(GRD_SqlStmt * stmt,uint32_t idx)470 GRD_DbValueT RdUtils::RdSqlColValue(GRD_SqlStmt *stmt, uint32_t idx)
471 {
472     if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
473         GRD_KVApiInfo = GetApiInfoInstance();
474     }
475     if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
476         return {};
477     }
478     return GRD_KVApiInfo.DBSqlColValue(stmt, idx);
479 }
480 
RdSqlColBlob(GRD_SqlStmt * stmt,uint32_t idx)481 const void *RdUtils::RdSqlColBlob(GRD_SqlStmt *stmt, uint32_t idx)
482 {
483     if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
484         GRD_KVApiInfo = GetApiInfoInstance();
485     }
486     if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
487         return nullptr;
488     }
489     return GRD_KVApiInfo.DBSqlColBlob(stmt, idx);
490 }
491 
RdSqlColText(GRD_SqlStmt * stmt,uint32_t idx)492 const char *RdUtils::RdSqlColText(GRD_SqlStmt *stmt, uint32_t idx)
493 {
494     if (GRD_KVApiInfo.DBSqlColText == nullptr) {
495         GRD_KVApiInfo = GetApiInfoInstance();
496     }
497     if (GRD_KVApiInfo.DBSqlColText == nullptr) {
498         return nullptr;
499     }
500     return GRD_KVApiInfo.DBSqlColText(stmt, idx);
501 }
502 
RdSqlColInt(GRD_SqlStmt * stmt,uint32_t idx)503 int32_t RdUtils::RdSqlColInt(GRD_SqlStmt *stmt, uint32_t idx)
504 {
505     if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
506         GRD_KVApiInfo = GetApiInfoInstance();
507     }
508     if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
509         return 0;
510     }
511     return GRD_KVApiInfo.DBSqlColInt(stmt, idx);
512 }
513 
RdSqlColInt64(GRD_SqlStmt * stmt,uint32_t idx)514 int64_t RdUtils::RdSqlColInt64(GRD_SqlStmt *stmt, uint32_t idx)
515 {
516     if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
517         GRD_KVApiInfo = GetApiInfoInstance();
518     }
519     if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
520         return 0;
521     }
522     return GRD_KVApiInfo.DBSqlColInt64(stmt, idx);
523 }
524 
RdSqlColDouble(GRD_SqlStmt * stmt,uint32_t idx)525 double RdUtils::RdSqlColDouble(GRD_SqlStmt *stmt, uint32_t idx)
526 {
527     if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
528         GRD_KVApiInfo = GetApiInfoInstance();
529     }
530     if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
531         return 0;
532     }
533     return GRD_KVApiInfo.DBSqlColDouble(stmt, idx);
534 }
535 
RdSqlColumnFloatVector(GRD_SqlStmt * stmt,uint32_t idx,uint32_t * dim)536 const float *RdUtils::RdSqlColumnFloatVector(GRD_SqlStmt *stmt, uint32_t idx, uint32_t *dim)
537 {
538     if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
539         GRD_KVApiInfo = GetApiInfoInstance();
540     }
541     if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
542         return nullptr;
543     }
544     return GRD_KVApiInfo.DBSqlColumnFloatVector(stmt, idx, dim);
545 }
546 
ClearAndZeroString(std::string & str)547 void RdUtils::ClearAndZeroString(std::string &str)
548 {
549     std::fill(str.begin(), str.end(), char(0));
550     str.clear();
551 }
552 
GetEncryptKey(const std::vector<uint8_t> & encryptedKey,char outBuff[],size_t outBufSize)553 const char *RdUtils::GetEncryptKey(const std::vector<uint8_t> &encryptedKey, char outBuff[], size_t outBufSize)
554 {
555     char *buffer = nullptr;
556     for (size_t i = 0; i < encryptedKey.size(); i++) {
557         buffer = (char *)(outBuff + i * 2); // each uint8_t will convert to 2 hex char
558         // each uint8_t will convert to 2 hex char
559         errno_t err = snprintf_s(buffer, outBufSize - i * 2, outBufSize - i * 2, "%02x", encryptedKey[i]);
560         if (err < 0) {
561             return nullptr;
562         }
563     }
564     return outBuff;
565 }
566 
RdDbBackup(GRD_DB * db,const char * backupDbFile,const std::vector<uint8_t> & encryptedKey)567 int RdUtils::RdDbBackup(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
568 {
569     if (GRD_KVApiInfo.DBBackupApi == nullptr) {
570         GRD_KVApiInfo = GetApiInfoInstance();
571     }
572     if (GRD_KVApiInfo.DBBackupApi == nullptr) {
573         return E_NOT_SUPPORT;
574     }
575     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
576     char key[keySize];
577     GRD_CipherInfoT info = { 0 };
578     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
579     int ret = TransferGrdErrno(GRD_KVApiInfo.DBBackupApi(db, backupDbFile, &info));
580     errno_t err = memset_s(key, keySize, 0, keySize);
581     if (err != E_OK) {
582         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
583         return E_ERROR;
584     }
585     return ret;
586 }
587 
RdDbRestore(const char * dbFile,const char * backupDbFile,const std::vector<uint8_t> & encryptedKey)588 int RdUtils::RdDbRestore(const char *dbFile, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
589 {
590     if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
591         GRD_KVApiInfo = GetApiInfoInstance();
592     }
593     if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
594         return E_NOT_SUPPORT;
595     }
596     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
597     char key[keySize];
598     GRD_CipherInfoT info = { 0 };
599     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
600     int ret = TransferGrdErrno(GRD_KVApiInfo.DBRestoreApi(dbFile, backupDbFile, &info));
601     errno_t err = memset_s(key, keySize, 0, keySize);
602     if (err != E_OK) {
603         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
604         return E_ERROR;
605     }
606     return ret;
607 }
608 
RdDbRekey(const char * dbFile,const char * configStr,const std::vector<uint8_t> & encryptedKey)609 int RdUtils::RdDbRekey(const char *dbFile, const char *configStr, const std::vector<uint8_t> &encryptedKey)
610 {
611     if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
612         GRD_KVApiInfo = GetApiInfoInstance();
613     }
614     if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
615         return E_NOT_SUPPORT;
616     }
617     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
618     char key[keySize];
619     GRD_CipherInfoT info = { 0 };
620     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
621     int ret = TransferGrdErrno(GRD_KVApiInfo.DBReKeyApi(dbFile, configStr, &info));
622     errno_t err = memset_s(key, keySize, 0, keySize);
623     if (err != E_OK) {
624         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
625         return E_ERROR;
626     }
627     return ret;
628 }
629 
RdDbGetVersion(GRD_DB * db,GRD_ConfigTypeE type,int & version)630 int RdUtils::RdDbGetVersion(GRD_DB *db, GRD_ConfigTypeE type, int &version)
631 {
632     if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
633         GRD_KVApiInfo = GetApiInfoInstance();
634     }
635     if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
636         return E_NOT_SUPPORT;
637     }
638     GRD_DbValueT value = GRD_KVApiInfo.DBGetConfigApi(db, type);
639     version = value.value.longValue;
640     return E_OK;
641 }
642 
RdDbSetVersion(GRD_DB * db,GRD_ConfigTypeE type,int version)643 int RdUtils::RdDbSetVersion(GRD_DB *db, GRD_ConfigTypeE type, int version)
644 {
645     if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
646         GRD_KVApiInfo = GetApiInfoInstance();
647     }
648     if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
649         return E_NOT_SUPPORT;
650     }
651     GRD_DbValueT value;
652     value.type = GRD_DB_DATATYPE_INTEGER;
653     value.value.longValue = version;
654     return TransferGrdErrno(GRD_KVApiInfo.DBSetConfigApi(db, type, value));
655 }
656 
Schedule(void * func,void * param)657 static uint64_t Schedule(void *func, void *param)
658 {
659     auto pool = TaskExecutor::GetInstance().GetExecutor();
660     if (pool == nullptr) {
661         LOG_ERROR("|Schedule| pool is nullptr");
662         return static_cast<uint64_t>(TaskExecutor::INVALID_TASK_ID);
663     }
664     TaskExecutor::TaskId taskId = pool->Execute([func, param]() {
665         void (*funcPtr)(void *) = reinterpret_cast<void (*)(void *)>(func);
666         funcPtr(param);
667     });
668     return static_cast<uint64_t>(taskId);
669 }
670 
Remove(uint64_t taskId,bool wait)671 static bool Remove(uint64_t taskId, bool wait)
672 {
673     auto pool = TaskExecutor::GetInstance().GetExecutor();
674     if (pool == nullptr) {
675         LOG_ERROR("|Remove| pool is nullptr");
676         return false;
677     }
678     return pool->Remove(taskId, wait);
679 }
680 
RdSqlRegistryThreadPool(GRD_DB * db)681 int RdUtils::RdSqlRegistryThreadPool(GRD_DB *db)
682 {
683     if (GRD_KVApiInfo.DBSqlRegistryThreadPool == nullptr) {
684         GRD_KVApiInfo = GetApiInfoInstance();
685     }
686     if (GRD_KVApiInfo.DBSqlRegistryThreadPool == nullptr) {
687         LOG_ERROR("registry threadPool ptr is nullptr");
688         return E_NOT_SUPPORT;
689     }
690     RdUtils::threadPool_.schedule = reinterpret_cast<GRD_DbScheduleFunc>(Schedule);
691     RdUtils::threadPool_.remove = reinterpret_cast<GRD_DbRemoveFunc>(Remove);
692     return TransferGrdErrno(GRD_KVApiInfo.DBSqlRegistryThreadPool(db, &threadPool_));
693 }
694 
RdSqlRegistryClusterAlgo(GRD_DB * db,const char * clstAlgoName,GRD_ClusterAlgoFunc func)695 int RdUtils::RdSqlRegistryClusterAlgo(GRD_DB *db, const char *clstAlgoName, GRD_ClusterAlgoFunc func)
696 {
697     if (GRD_KVApiInfo.DBSqlRegistryClusterAlgo == nullptr) {
698         GRD_KVApiInfo = GetApiInfoInstance();
699     }
700     if (GRD_KVApiInfo.DBSqlRegistryClusterAlgo == nullptr) {
701         LOG_ERROR("registry ClusterAlgo ptr is nullptr");
702         return E_NOT_SUPPORT;
703     }
704     return TransferGrdErrno(GRD_KVApiInfo.DBSqlRegistryClusterAlgo(db, clstAlgoName, func));
705 }
706 
707 } // namespace NativeRdb
708 } // namespace OHOS
709