• 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_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