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