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 
30 namespace OHOS {
31 namespace NativeRdb {
32 using namespace OHOS::Rdb;
33 
34 static GRD_APIInfo GRD_KVApiInfo;
35 
36 struct GrdErrnoPair {
37     int32_t grdCode;
38     int kvDbCode;
39 };
40 
41 const GrdErrnoPair GRD_ERRNO_MAP[] = {
42     { GRD_OK, E_OK },
43     { GRD_REBUILD_DATABASE, E_OK},
44     { GRD_NO_DATA, E_NO_MORE_ROWS },
45     { GRD_DATA_CORRUPTED, E_SQLITE_CORRUPT },
46     { GRD_INVALID_FILE_FORMAT, E_SQLITE_CORRUPT  },
47     { GRD_PRIMARY_KEY_VIOLATION, E_SQLITE_CONSTRAINT},
48     { GRD_RESTRICT_VIOLATION, E_SQLITE_CONSTRAINT},
49     { GRD_CONSTRAINT_CHECK_VIOLATION, E_SQLITE_CONSTRAINT},
50     { GRD_NOT_SUPPORT, E_NOT_SUPPORT },
51     { GRD_OVER_LIMIT, E_SQLITE_CONSTRAINT },
52     { GRD_INVALID_ARGS, E_INVALID_ARGS },
53     { GRD_FAILED_FILE_OPERATION, E_SQLITE_IOERR },
54     { GRD_INSUFFICIENT_SPACE, E_SQLITE_FULL },
55     { GRD_RESOURCE_BUSY, E_DATABASE_BUSY },
56     { GRD_DB_BUSY, E_DATABASE_BUSY },
57     { GRD_FAILED_MEMORY_ALLOCATE, E_SQLITE_NOMEM },
58     { GRD_CRC_CHECK_DISABLED, E_INVALID_ARGS },
59     { GRD_DISK_SPACE_FULL, E_SQLITE_FULL },
60 
61     { GRD_PERMISSION_DENIED, E_SQLITE_PERM },
62     { GRD_PASSWORD_UNMATCHED, E_SQLITE_CANTOPEN },
63     { GRD_PASSWORD_NEED_REKEY, E_CHANGE_UNENCRYPTED_TO_ENCRYPTED },
64 
65     { GRD_NAME_TOO_LONG, E_SQLITE_CONSTRAINT},
66     { GRD_INVALID_TABLE_DEFINITION, E_SQLITE_SCHEMA},
67     { GRD_SEMANTIC_ERROR, E_NOT_SUPPORT_THE_SQL},
68     { GRD_SYNTAX_ERROR, E_NOT_SUPPORT_THE_SQL},
69     { GRD_DATA_MISMATCH, E_SQLITE_MISMATCH},
70     { GRD_WRONG_STMT_OBJECT, E_INVALID_OBJECT_TYPE},
71     { GRD_DATA_CONFLICT, E_INVALID_CONFLICT_FLAG },
72 
73     { GRD_INNER_ERR, E_ERROR },
74     { GRD_FAILED_MEMORY_RELEASE, E_ERROR },
75     { GRD_NOT_AVAILABLE, E_ERROR },
76     { GRD_INVALID_FORMAT, E_ERROR },
77     { GRD_TIME_OUT, E_ERROR },
78     { GRD_DB_INSTANCE_ABNORMAL, E_ERROR },
79     { GRD_CIPHER_ERROR, E_ERROR },
80 };
81 
TransferGrdErrno(int err)82 int RdUtils::TransferGrdErrno(int err)
83 {
84     if (err > 0) {
85         return err;
86     }
87     for (const auto &item : GRD_ERRNO_MAP) {
88         if (item.grdCode == err) {
89             return item.kvDbCode;
90         }
91     }
92     return E_ERROR;
93 }
94 
TransferGrdTypeToColType(int grdColType)95 ColumnType RdUtils::TransferGrdTypeToColType(int grdColType)
96 {
97     switch (grdColType) {
98         case GRD_DB_DATATYPE_INTEGER:
99             return ColumnType::TYPE_INTEGER;
100         case GRD_DB_DATATYPE_FLOAT:
101             return ColumnType::TYPE_FLOAT;
102         case GRD_DB_DATATYPE_TEXT:
103             return ColumnType::TYPE_STRING;
104         case GRD_DB_DATATYPE_BLOB:
105             return ColumnType::TYPE_BLOB;
106         case GRD_DB_DATATYPE_FLOATVECTOR:
107             return ColumnType::TYPE_FLOAT32_ARRAY;
108         default:
109             break;
110     }
111     return ColumnType::TYPE_NULL;
112 }
113 
RdDbOpen(const char *dbPath, const char *configStr, uint32_t flags, GRD_DB **db)114 int RdUtils::RdDbOpen(const char *dbPath, const char *configStr, uint32_t flags, GRD_DB **db)
115 {
116     if (GRD_KVApiInfo.DBOpenApi == nullptr) {
117         GRD_KVApiInfo = GetApiInfoInstance();
118     }
119     if (GRD_KVApiInfo.DBOpenApi == nullptr) {
120         return E_NOT_SUPPORT;
121     }
122     return TransferGrdErrno(GRD_KVApiInfo.DBOpenApi(dbPath, configStr, flags, db));
123 }
124 
RdDbClose(GRD_DB *db, uint32_t flags)125 int RdUtils::RdDbClose(GRD_DB *db, uint32_t flags)
126 {
127     if (GRD_KVApiInfo.DBCloseApi == nullptr) {
128         GRD_KVApiInfo = GetApiInfoInstance();
129     }
130     if (GRD_KVApiInfo.DBCloseApi == nullptr) {
131         return E_NOT_SUPPORT;
132     }
133     return TransferGrdErrno(GRD_KVApiInfo.DBCloseApi(db, flags));
134 }
135 
RdDbRepair(const char *dbPath, const char *configStr)136 int RdUtils::RdDbRepair(const char *dbPath, const char *configStr)
137 {
138     if (GRD_KVApiInfo.DBRepairApi == nullptr) {
139         GRD_KVApiInfo = GetApiInfoInstance();
140     }
141     if (GRD_KVApiInfo.DBRepairApi == nullptr) {
142         return E_NOT_SUPPORT;
143     }
144     return TransferGrdErrno(GRD_KVApiInfo.DBRepairApi(dbPath, configStr));
145 }
146 
RdSqlPrepare(GRD_DB *db, const char *str, uint32_t strLen, GRD_SqlStmt **stmt, const char **unusedStr)147 int RdUtils::RdSqlPrepare(GRD_DB *db, const char *str, uint32_t strLen, GRD_SqlStmt **stmt, const char **unusedStr)
148 {
149     if (GRD_KVApiInfo.DBSqlPrepare == nullptr) {
150         GRD_KVApiInfo = GetApiInfoInstance();
151     }
152     if (GRD_KVApiInfo.DBSqlPrepare == nullptr) {
153         return E_NOT_SUPPORT;
154     }
155     return TransferGrdErrno(GRD_KVApiInfo.DBSqlPrepare(db, str, strLen, stmt, unusedStr));
156 }
157 
RdSqlReset(GRD_SqlStmt *stmt)158 int RdUtils::RdSqlReset(GRD_SqlStmt *stmt)
159 {
160     if (GRD_KVApiInfo.DBSqlReset == nullptr) {
161         GRD_KVApiInfo = GetApiInfoInstance();
162     }
163     if (GRD_KVApiInfo.DBSqlReset == nullptr) {
164         return E_NOT_SUPPORT;
165     }
166     return TransferGrdErrno(GRD_KVApiInfo.DBSqlReset(stmt));
167 }
168 
RdSqlFinalize(GRD_SqlStmt *stmt)169 int RdUtils::RdSqlFinalize(GRD_SqlStmt *stmt)
170 {
171     if (GRD_KVApiInfo.DBSqlFinalize == nullptr) {
172         GRD_KVApiInfo = GetApiInfoInstance();
173     }
174     if (GRD_KVApiInfo.DBSqlFinalize == nullptr) {
175         return E_NOT_SUPPORT;
176     }
177     return TransferGrdErrno(GRD_KVApiInfo.DBSqlFinalize(stmt));
178 }
179 
RdSqlFreeBlob(void *blobElementSize)180 void RdSqlFreeBlob(void *blobElementSize)
181 {
182     delete[] ((uint8_t *)blobElementSize);
183 }
184 
RdSqlBindBlob(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))185 int RdUtils::RdSqlBindBlob(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))
186 {
187     if (GRD_KVApiInfo.DBSqlBindBlob == nullptr) {
188         GRD_KVApiInfo = GetApiInfoInstance();
189     }
190     if (GRD_KVApiInfo.DBSqlBindBlob == nullptr) {
191         return E_NOT_SUPPORT;
192     }
193     if (len <= 0) {
194         LOG_ERROR("Invalid len %{public}d", len);
195         return E_INVALID_ARGS;
196     }
197     uint8_t *tmpVal = new uint8_t[len]();
198     if (tmpVal == nullptr) {
199         return E_ERROR;
200     }
201     errno_t err = memcpy_s(tmpVal, len * sizeof(uint8_t), val, len * sizeof(uint8_t));
202     if (err < 0) {
203         delete[] tmpVal;
204         LOG_ERROR("BindBlob failed due to memcpy %{public}d, len is %{public}d", err, len);
205         return TransferGrdErrno(GRD_INNER_ERR);
206     }
207     if (freeFunc == nullptr) {
208         freeFunc = RdSqlFreeBlob;
209     }
210     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindBlob(stmt, idx, tmpVal, len, freeFunc));
211 }
212 
RdSqlFreeCharStr(void *charStr)213 void RdSqlFreeCharStr(void *charStr)
214 {
215     delete[] ((char *)charStr);
216 }
217 
RdSqlBindText(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))218 int RdUtils::RdSqlBindText(GRD_SqlStmt *stmt, uint32_t idx, const void *val, int32_t len, void (*freeFunc)(void *))
219 {
220     if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
221         GRD_KVApiInfo = GetApiInfoInstance();
222     }
223     if (GRD_KVApiInfo.DBSqlBindText == nullptr) {
224         return E_NOT_SUPPORT;
225     }
226     if (len <= 0) {
227         LOG_ERROR("Invalid len %{public}d", len);
228         return E_INVALID_ARGS;
229     }
230     char *tmpVal = new char[len + 1]();
231     if (tmpVal == nullptr) {
232         return E_ERROR;
233     }
234     errno_t err = strcpy_s(tmpVal, len + 1, (const char *)val);
235     if (err < 0) {
236         LOG_ERROR("BindText failed due to strycpy %{public}d, len is %{public}d", err, len + 1);
237         delete[] tmpVal;
238         return TransferGrdErrno(GRD_INNER_ERR);
239     }
240     if (freeFunc == nullptr) {
241         freeFunc = RdSqlFreeCharStr;
242     }
243     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindText(stmt, idx, tmpVal, len, freeFunc));
244 }
245 
RdSqlBindInt(GRD_SqlStmt *stmt, uint32_t idx, int32_t val)246 int RdUtils::RdSqlBindInt(GRD_SqlStmt *stmt, uint32_t idx, int32_t val)
247 {
248     if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
249         GRD_KVApiInfo = GetApiInfoInstance();
250     }
251     if (GRD_KVApiInfo.DBSqlBindInt == nullptr) {
252         return E_NOT_SUPPORT;
253     }
254     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt(stmt, idx, val));
255 }
256 
RdSqlBindInt64(GRD_SqlStmt *stmt, uint32_t idx, int64_t val)257 int RdUtils::RdSqlBindInt64(GRD_SqlStmt *stmt, uint32_t idx, int64_t val)
258 {
259     if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
260         GRD_KVApiInfo = GetApiInfoInstance();
261     }
262     if (GRD_KVApiInfo.DBSqlBindInt64 == nullptr) {
263         return E_NOT_SUPPORT;
264     }
265     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindInt64(stmt, idx, val));
266 }
267 
RdSqlBindDouble(GRD_SqlStmt *stmt, uint32_t idx, double val)268 int RdUtils::RdSqlBindDouble(GRD_SqlStmt *stmt, uint32_t idx, double val)
269 {
270     if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
271         GRD_KVApiInfo = GetApiInfoInstance();
272     }
273     if (GRD_KVApiInfo.DBSqlBindDouble == nullptr) {
274         return E_NOT_SUPPORT;
275     }
276     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindDouble(stmt, idx, val));
277 }
278 
RdSqlBindNull(GRD_SqlStmt *stmt, uint32_t idx)279 int RdUtils::RdSqlBindNull(GRD_SqlStmt *stmt, uint32_t idx)
280 {
281     if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
282         GRD_KVApiInfo = GetApiInfoInstance();
283     }
284     if (GRD_KVApiInfo.DBSqlBindNull == nullptr) {
285         return E_NOT_SUPPORT;
286     }
287     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindNull(stmt, idx));
288 }
289 
RdSqlFreeFloatArr(void *floatElement)290 void RdSqlFreeFloatArr(void *floatElement)
291 {
292     delete[] ((float *)floatElement);
293 }
294 
RdSqlBindFloatVector(GRD_SqlStmt *stmt, uint32_t idx, float *val, uint32_t dim, void (*freeFunc)(void *))295 int RdUtils::RdSqlBindFloatVector(GRD_SqlStmt *stmt, uint32_t idx, float *val,
296     uint32_t dim, void (*freeFunc)(void *))
297 {
298     if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
299         GRD_KVApiInfo = GetApiInfoInstance();
300     }
301     if (GRD_KVApiInfo.DBSqlBindFloatVector == nullptr) {
302         return E_NOT_SUPPORT;
303     }
304     if (dim <= 0) {
305         LOG_ERROR("Invalid dim %{public}d", dim);
306         return E_INVALID_ARGS;
307     }
308     float *tmpVal = new float[dim]();
309     if (tmpVal == nullptr) {
310         return E_ERROR;
311     }
312     errno_t err = memcpy_s(tmpVal, dim * sizeof(float), val, dim * sizeof(float));
313     if (err < 0) {
314         delete[] tmpVal;
315         LOG_ERROR("BindFloat failed due to memcpy %{public}d, dim is %{public}d", err, dim);
316         return TransferGrdErrno(GRD_INNER_ERR);
317     }
318     if (freeFunc == nullptr) {
319         freeFunc = RdSqlFreeFloatArr;
320     }
321     return TransferGrdErrno(GRD_KVApiInfo.DBSqlBindFloatVector(stmt, idx, tmpVal, dim, freeFunc));
322 }
323 
RdSqlStep(GRD_SqlStmt *stmt)324 int RdUtils::RdSqlStep(GRD_SqlStmt *stmt)
325 {
326     if (GRD_KVApiInfo.DBSqlStep == nullptr) {
327         GRD_KVApiInfo = GetApiInfoInstance();
328     }
329     if (GRD_KVApiInfo.DBSqlStep == nullptr) {
330         return E_NOT_SUPPORT;
331     }
332     return TransferGrdErrno(GRD_KVApiInfo.DBSqlStep(stmt));
333 }
334 
RdSqlColCnt(GRD_SqlStmt *stmt)335 int RdUtils::RdSqlColCnt(GRD_SqlStmt *stmt)
336 {
337     if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
338         GRD_KVApiInfo = GetApiInfoInstance();
339     }
340     if (GRD_KVApiInfo.DBSqlColCnt == nullptr) {
341         return E_NOT_SUPPORT;
342     }
343     return TransferGrdErrno(GRD_KVApiInfo.DBSqlColCnt(stmt));
344 }
345 
RdSqlColType(GRD_SqlStmt *stmt, uint32_t idx)346 ColumnType RdUtils::RdSqlColType(GRD_SqlStmt *stmt, uint32_t idx)
347 {
348     if (GRD_KVApiInfo.DBSqlColType == nullptr) {
349         GetApiInfoInstance();
350     }
351     if (GRD_KVApiInfo.DBSqlColType == nullptr) {
352         return TransferGrdTypeToColType(0); // for invalid
353     }
354     return TransferGrdTypeToColType(GRD_KVApiInfo.DBSqlColType(stmt, idx));
355 }
356 
RdSqlColBytes(GRD_SqlStmt *stmt, uint32_t idx)357 int RdUtils::RdSqlColBytes(GRD_SqlStmt *stmt, uint32_t idx)
358 {
359     if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
360         GRD_KVApiInfo = GetApiInfoInstance();
361     }
362     if (GRD_KVApiInfo.DBSqlColBytes == nullptr) {
363         return E_NOT_SUPPORT;
364     }
365     return TransferGrdErrno(GRD_KVApiInfo.DBSqlColBytes(stmt, idx));
366 }
367 
RdSqlColName(GRD_SqlStmt *stmt, uint32_t idx)368 char *RdUtils::RdSqlColName(GRD_SqlStmt *stmt, uint32_t idx)
369 {
370     if (GRD_KVApiInfo.DBSqlColName == nullptr) {
371         GRD_KVApiInfo = GetApiInfoInstance();
372     }
373     if (GRD_KVApiInfo.DBSqlColName == nullptr) {
374         return nullptr;
375     }
376     return GRD_KVApiInfo.DBSqlColName(stmt, idx);
377 }
378 
RdSqlColValue(GRD_SqlStmt *stmt, uint32_t idx)379 GRD_DbValueT RdUtils::RdSqlColValue(GRD_SqlStmt *stmt, uint32_t idx)
380 {
381     if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
382         GRD_KVApiInfo = GetApiInfoInstance();
383     }
384     if (GRD_KVApiInfo.DBSqlColValue == nullptr) {
385         return {};
386     }
387     return GRD_KVApiInfo.DBSqlColValue(stmt, idx);
388 }
389 
RdSqlColBlob(GRD_SqlStmt *stmt, uint32_t idx)390 const void *RdUtils::RdSqlColBlob(GRD_SqlStmt *stmt, uint32_t idx)
391 {
392     if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
393         GRD_KVApiInfo = GetApiInfoInstance();
394     }
395     if (GRD_KVApiInfo.DBSqlColBlob == nullptr) {
396         return nullptr;
397     }
398     return GRD_KVApiInfo.DBSqlColBlob(stmt, idx);
399 }
400 
RdSqlColText(GRD_SqlStmt *stmt, uint32_t idx)401 const char *RdUtils::RdSqlColText(GRD_SqlStmt *stmt, uint32_t idx)
402 {
403     if (GRD_KVApiInfo.DBSqlColText == nullptr) {
404         GRD_KVApiInfo = GetApiInfoInstance();
405     }
406     if (GRD_KVApiInfo.DBSqlColText == nullptr) {
407         return nullptr;
408     }
409     return GRD_KVApiInfo.DBSqlColText(stmt, idx);
410 }
411 
RdSqlColInt(GRD_SqlStmt *stmt, uint32_t idx)412 int32_t RdUtils::RdSqlColInt(GRD_SqlStmt *stmt, uint32_t idx)
413 {
414     if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
415         GRD_KVApiInfo = GetApiInfoInstance();
416     }
417     if (GRD_KVApiInfo.DBSqlColInt == nullptr) {
418         return 0;
419     }
420     return GRD_KVApiInfo.DBSqlColInt(stmt, idx);
421 }
422 
RdSqlColInt64(GRD_SqlStmt *stmt, uint32_t idx)423 int64_t RdUtils::RdSqlColInt64(GRD_SqlStmt *stmt, uint32_t idx)
424 {
425     if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
426         GRD_KVApiInfo = GetApiInfoInstance();
427     }
428     if (GRD_KVApiInfo.DBSqlColInt64 == nullptr) {
429         return 0;
430     }
431     return GRD_KVApiInfo.DBSqlColInt64(stmt, idx);
432 }
433 
RdSqlColDouble(GRD_SqlStmt *stmt, uint32_t idx)434 double RdUtils::RdSqlColDouble(GRD_SqlStmt *stmt, uint32_t idx)
435 {
436     if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
437         GRD_KVApiInfo = GetApiInfoInstance();
438     }
439     if (GRD_KVApiInfo.DBSqlColDouble == nullptr) {
440         return 0;
441     }
442     return GRD_KVApiInfo.DBSqlColDouble(stmt, idx);
443 }
444 
RdSqlColumnFloatVector(GRD_SqlStmt *stmt, uint32_t idx, uint32_t *dim)445 const float *RdUtils::RdSqlColumnFloatVector(GRD_SqlStmt *stmt, uint32_t idx, uint32_t *dim)
446 {
447     if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
448         GRD_KVApiInfo = GetApiInfoInstance();
449     }
450     if (GRD_KVApiInfo.DBSqlColumnFloatVector == nullptr) {
451         return nullptr;
452     }
453     return GRD_KVApiInfo.DBSqlColumnFloatVector(stmt, idx, dim);
454 }
455 
ClearAndZeroString(std::string &str)456 void RdUtils::ClearAndZeroString(std::string &str)
457 {
458     str.clear();
459     std::fill(str.begin(), str.end(), char(0));
460 }
461 
GetEncryptKey(const std::vector<uint8_t> &encryptedKey, char outBuff[], size_t outBufSize)462 const char *RdUtils::GetEncryptKey(const std::vector<uint8_t> &encryptedKey, char outBuff[], size_t outBufSize)
463 {
464     char *buffer = nullptr;
465     for (size_t i = 0; i < encryptedKey.size(); i++) {
466         buffer = (char *)(outBuff + i * 2); // each uint8_t will convert to 2 hex char
467         // each uint8_t will convert to 2 hex char
468         errno_t err = snprintf_s(buffer, outBufSize - i * 2, outBufSize - i * 2, "%02x", encryptedKey[i]);
469         if (err < 0) {
470             return nullptr;
471         }
472     }
473     return outBuff;
474 }
475 
RdDbBackup(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)476 int RdUtils::RdDbBackup(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
477 {
478     if (GRD_KVApiInfo.DBBackupApi == nullptr) {
479         GRD_KVApiInfo = GetApiInfoInstance();
480     }
481     if (GRD_KVApiInfo.DBBackupApi == nullptr) {
482         return E_NOT_SUPPORT;
483     }
484     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
485     char key[keySize];
486     GRD_CipherInfoT info = { 0 };
487     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
488     int ret = TransferGrdErrno(GRD_KVApiInfo.DBBackupApi(db, backupDbFile, &info));
489     errno_t err = memset_s(key, keySize, 0, keySize);
490     if (err != E_OK) {
491         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
492         return E_ERROR;
493     }
494     return ret;
495 }
496 
RdDbRestore(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)497 int RdUtils::RdDbRestore(GRD_DB *db, const char *backupDbFile, const std::vector<uint8_t> &encryptedKey)
498 {
499     if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
500         GRD_KVApiInfo = GetApiInfoInstance();
501     }
502     if (GRD_KVApiInfo.DBRestoreApi == nullptr) {
503         return E_NOT_SUPPORT;
504     }
505     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
506     char key[keySize];
507     GRD_CipherInfoT info = { 0 };
508     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
509     int ret = TransferGrdErrno(GRD_KVApiInfo.DBRestoreApi(db, backupDbFile, &info));
510     errno_t err = memset_s(key, keySize, 0, keySize);
511     if (err != E_OK) {
512         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
513         return E_ERROR;
514     }
515     return ret;
516 }
517 
RdDbRekey(const char *dbFile, const char *configStr, const std::vector<uint8_t> &encryptedKey)518 int RdUtils::RdDbRekey(const char *dbFile, const char *configStr, const std::vector<uint8_t> &encryptedKey)
519 {
520     if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
521         GRD_KVApiInfo = GetApiInfoInstance();
522     }
523     if (GRD_KVApiInfo.DBReKeyApi == nullptr) {
524         return E_NOT_SUPPORT;
525     }
526     const size_t keySize = encryptedKey.size() * 2 + 1; // 2 hex number can represent a uint8_t, 1 is for '/0'
527     char key[keySize];
528     GRD_CipherInfoT info = { 0 };
529     info.hexPassword = (encryptedKey.size() > 0) ? GetEncryptKey(encryptedKey, key, keySize) : nullptr;
530     int ret = TransferGrdErrno(GRD_KVApiInfo.DBReKeyApi(dbFile, configStr, &info));
531     errno_t err = memset_s(key, keySize, 0, keySize);
532     if (err != E_OK) {
533         LOG_ERROR("can not memset 0, size %{public}zu", keySize);
534         return E_ERROR;
535     }
536     return ret;
537 }
538 
539 
RdDbGetVersion(GRD_DB *db, GRD_ConfigTypeE type, int &version)540 int RdUtils::RdDbGetVersion(GRD_DB *db, GRD_ConfigTypeE type, int &version)
541 {
542     if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
543         GRD_KVApiInfo = GetApiInfoInstance();
544     }
545     if (GRD_KVApiInfo.DBGetConfigApi == nullptr) {
546         return E_NOT_SUPPORT;
547     }
548     GRD_DbValueT value = GRD_KVApiInfo.DBGetConfigApi(db, type);
549     version = value.value.longValue;
550     return E_OK;
551 }
552 
RdDbSetVersion(GRD_DB *db, GRD_ConfigTypeE type, int version)553 int RdUtils::RdDbSetVersion(GRD_DB *db, GRD_ConfigTypeE type, int version)
554 {
555     if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
556         GRD_KVApiInfo = GetApiInfoInstance();
557     }
558     if (GRD_KVApiInfo.DBSetConfigApi == nullptr) {
559         return E_NOT_SUPPORT;
560     }
561     GRD_DbValueT value;
562     value.type = GRD_DB_DATATYPE_INTEGER;
563     value.value.longValue = version;
564     return TransferGrdErrno(GRD_KVApiInfo.DBSetConfigApi(db, type, value));
565 }
566 
567 } // namespace NativeRdb
568 } // namespace OHOS
569