1 /*
2 * Copyright (c) 2022 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 #include "sqlite3_utils.h"
17
18 #include <securec.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22
23 #include "softbus_adapter_mem.h"
24 #include "softbus_errcode.h"
25 #include "softbus_log.h"
26
27 #define SQL_DEFAULT_LEN 256
28
29 /* The index of database context state */
30 #define DB_STATE_QUERYING (0x1)
31 #define DB_STATE_TRANSACTION (0x1 << 1)
32
33 typedef int32_t (*BindParaCb)(DbContext *ctx, int32_t paraNum, uint8_t *data);
34 typedef int32_t (*QueryDataCb)(DbContext *ctx, uint8_t *data, int32_t idx);
35
36 typedef struct {
37 const char *tableName;
38 const char *sqlForCreate;
39 const char *sqlForInsert;
40 const char *sqlForSearchByKey;
41 const char *sqlForRemoveByKey;
42 BindParaCb insertCb;
43 BindParaCb searchCb;
44 BindParaCb removeCb;
45 QueryDataCb queryDataCb;
46 } SqliteManager;
47
48 /* The default SQL statement */
49 #define SQL_DROP_TABLE "DROP TABLE "
50 #define SQL_REMOVE_ALL_RECORD "DELETE FROM "
51 #define SQL_BEGIN_TRANSACTION "BEGIN TRANSACTION"
52 #define SQL_COMMIT_TRANSACTION "COMMIT TRANSACTION"
53 #define SQL_ROLLBACK_TRANSACTION "ROLLBACK TRANSACTION"
54 #define SQL_SEARCH_IF_TABLE_EXIST "SELECT * FROM sqlite_master WHERE type ='table' AND name = '%s'"
55
56 /**
57 * @brief The SQL statement of TrustedDeviceInfo table.
58 *
59 * This table is used to store the trusted relationship, and its name is TrustedDeviceInfo in {@link DATABASE_NAME}.
60 * After each networking, record the udid value according to the device account.
61 */
62 #define TABLE_NAME_OF_TRUSTED_DEV_INFO "TrustedDeviceInfo"
63 #define SQL_CREATE_TRUSTED_DEV_INFO_TABLE "CREATE TABLE IF NOT EXISTS "TABLE_NAME_OF_TRUSTED_DEV_INFO" \
64 (accountHash TEXT NOT NULL, \
65 udid TEXT NOT NULL, \
66 primary key(accountHash, udid));"
67 #define SQL_INSERT_TRUSTED_DEV_INFO "INSERT INTO "TABLE_NAME_OF_TRUSTED_DEV_INFO" \
68 (accountHash, udid) VALUES (?, ?)"
69 #define SQL_SEARCH_TRUSTED_DEV_INFO_BY_ID "SELECT udid FROM "TABLE_NAME_OF_TRUSTED_DEV_INFO" \
70 WHERE accountHash = ?"
71 #define SQL_REMOVE_TRUSTED_DEV_INFO_BY_ID "DELETE FROM "TABLE_NAME_OF_TRUSTED_DEV_INFO" \
72 WHERE accountHash = ? AND udid = ?"
73
74 static int32_t BindInsertTrustedDevInfoCb(DbContext *ctx, int32_t paraNum, uint8_t *data);
75 static int32_t BindSelectTrustedDevInfoCb(DbContext *ctx, int32_t paraNum, uint8_t *data);
76 static int32_t GetTrustedDevInfoByIdCb(DbContext *ctx, uint8_t *data, int32_t idx);
77
78 static SqliteManager g_sqliteMgr[TABLE_NAME_ID_MAX] = {
79 [TABLE_TRUSTED_DEV_INFO] = {
80 .tableName = TABLE_NAME_OF_TRUSTED_DEV_INFO,
81 .sqlForCreate = SQL_CREATE_TRUSTED_DEV_INFO_TABLE,
82 .sqlForInsert = SQL_INSERT_TRUSTED_DEV_INFO,
83 .sqlForSearchByKey = SQL_SEARCH_TRUSTED_DEV_INFO_BY_ID,
84 .sqlForRemoveByKey = SQL_REMOVE_TRUSTED_DEV_INFO_BY_ID,
85 .insertCb = BindInsertTrustedDevInfoCb,
86 .searchCb = BindSelectTrustedDevInfoCb,
87 .removeCb = BindInsertTrustedDevInfoCb,
88 .queryDataCb = GetTrustedDevInfoByIdCb,
89 },
90 };
91
GetTrustedDevInfoByIdCb(DbContext * ctx,uint8_t * data,int32_t idx)92 static int32_t GetTrustedDevInfoByIdCb(DbContext *ctx, uint8_t *data, int32_t idx)
93 {
94 int32_t i = 0;
95 char *info = (char *)data + idx * UDID_BUF_LEN;
96
97 if (GetQueryResultColText(ctx, i, info, UDID_BUF_LEN) != SOFTBUS_OK) {
98 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "get query result failed");
99 return SOFTBUS_ERR;
100 }
101 return SOFTBUS_OK;
102 }
103
BindInsertTrustedDevInfoCb(DbContext * ctx,int32_t paraNum,uint8_t * data)104 static int32_t BindInsertTrustedDevInfoCb(DbContext *ctx, int32_t paraNum, uint8_t *data)
105 {
106 int32_t rc;
107 int32_t idx = 1;
108
109 if (data == NULL) {
110 return SQLITE_ERROR;
111 }
112 const TrustedDevInfoRecord *record = (TrustedDevInfoRecord *)data;
113 rc = BindParaText(ctx, idx, record->accountHexHash, strlen(record->accountHexHash));
114 if (rc != SQLITE_OK) {
115 return rc;
116 }
117 return BindParaText(ctx, ++idx, record->udid, strlen(record->udid));
118 }
119
BindSelectTrustedDevInfoCb(DbContext * ctx,int32_t paraNum,uint8_t * data)120 static int32_t BindSelectTrustedDevInfoCb(DbContext *ctx, int32_t paraNum, uint8_t *data)
121 {
122 int32_t idx = 1;
123
124 if (data == NULL) {
125 return SQLITE_ERROR;
126 }
127 return BindParaText(ctx, idx, (char *)data, strlen((char *)data));
128 }
129
ExecuteSql(DbContext * ctx,const char * sql,uint32_t len,BindParaCb cb,uint8_t * data)130 static int32_t ExecuteSql(DbContext *ctx, const char *sql, uint32_t len, BindParaCb cb, uint8_t *data)
131 {
132 int32_t paraNum;
133 int32_t rc;
134
135 if (sql == NULL || sql[0] == '\0') {
136 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "execute sql get invalid param");
137 return SQLITE_ERROR;
138 }
139 rc = sqlite3_prepare_v2(ctx->db, sql, len, &ctx->stmt, NULL);
140 if (rc != SQLITE_OK || ctx->stmt == NULL) {
141 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_prepare_v2 failed, %s", sqlite3_errmsg(ctx->db));
142 return sqlite3_errcode(ctx->db);
143 }
144 paraNum = sqlite3_bind_parameter_count(ctx->stmt);
145 if (paraNum <= 0) {
146 rc = sqlite3_step(ctx->stmt);
147 if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
148 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_step <= 0 failed, %s", sqlite3_errmsg(ctx->db));
149 }
150 return rc;
151 }
152 if (paraNum > 0 && cb == NULL) {
153 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "need cd for binding parameter");
154 (void)sqlite3_finalize(ctx->stmt);
155 ctx->stmt = NULL;
156 return SQLITE_ERROR;
157 }
158 rc = cb(ctx, paraNum, data);
159 if (rc != SQLITE_OK) {
160 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "binding parameter cd fail");
161 (void)sqlite3_finalize(ctx->stmt);
162 ctx->stmt = NULL;
163 return sqlite3_errcode(ctx->db);
164 }
165 rc = sqlite3_step(ctx->stmt);
166 if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
167 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_step > 0 failed, %s", sqlite3_errmsg(ctx->db));
168 }
169 return rc;
170 }
171
QueryData(DbContext * ctx,const char * sql,uint32_t len,BindParaCb cb,uint8_t * data)172 static int32_t QueryData(DbContext *ctx, const char *sql, uint32_t len, BindParaCb cb, uint8_t *data)
173 {
174 int32_t rc;
175
176 rc = ExecuteSql(ctx, sql, len, cb, data);
177 if (rc != SQLITE_ROW) {
178 (void)sqlite3_finalize(ctx->stmt);
179 ctx->stmt = NULL;
180 } else {
181 ctx->state |= DB_STATE_QUERYING;
182 }
183 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_DBG, "QueryData done, state: %d", ctx->state);
184 return rc;
185 }
186
QueryDataNext(DbContext * ctx)187 static int32_t QueryDataNext(DbContext *ctx)
188 {
189 int32_t rc;
190
191 rc = sqlite3_step(ctx->stmt);
192 if (rc != SQLITE_ROW) {
193 ctx->state &= ~DB_STATE_QUERYING;
194 (void)sqlite3_finalize(ctx->stmt);
195 ctx->stmt = NULL;
196 }
197 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_DBG, "QueryDataNext done, state: %d", ctx->state);
198 return rc;
199 }
200
CheckDbContextParam(const DbContext * ctx)201 static bool CheckDbContextParam(const DbContext *ctx)
202 {
203 if (ctx == NULL) {
204 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
205 return false;
206 }
207 if (ctx->db == NULL || ctx->stmt != NULL) {
208 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid db context state");
209 return false;
210 }
211 return true;
212 }
213
CheckBindOrQueryParam(const DbContext * ctx)214 static bool CheckBindOrQueryParam(const DbContext *ctx)
215 {
216 if (ctx == NULL) {
217 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid db context parameters");
218 return false;
219 }
220 if (ctx->db == NULL || ctx->stmt == NULL) {
221 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid db context state");
222 return false;
223 }
224 return true;
225 }
226
OpenDatabase(DbContext ** ctx)227 int32_t OpenDatabase(DbContext **ctx)
228 {
229 int32_t rc;
230 sqlite3 *sqlite = NULL;
231
232 if (ctx == NULL) {
233 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
234 return SOFTBUS_INVALID_PARAM;
235 }
236 rc = sqlite3_open_v2(DATABASE_NAME, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
237 SQLITE_OPEN_NOMUTEX, NULL);
238 if (rc != SQLITE_OK || sqlite == NULL) {
239 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_open_v2 fail: %s", sqlite3_errmsg(sqlite));
240 (void)sqlite3_close_v2(sqlite);
241 return SOFTBUS_ERR;
242 }
243 *ctx = (DbContext *)SoftBusCalloc(sizeof(DbContext));
244 if (*ctx == NULL) {
245 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "malloc DbContext fail");
246 (void)sqlite3_close_v2(sqlite);
247 return SOFTBUS_MALLOC_ERR;
248 } else {
249 (*ctx)->db = sqlite;
250 }
251 return SOFTBUS_OK;
252 }
253
CloseDatabase(DbContext * ctx)254 int32_t CloseDatabase(DbContext *ctx)
255 {
256 if (!CheckDbContextParam(ctx)) {
257 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
258 return SOFTBUS_INVALID_PARAM;
259 }
260 (void)sqlite3_close_v2(ctx->db);
261 SoftBusFree(ctx);
262 return SOFTBUS_OK;
263 }
264
CreateTable(DbContext * ctx,TableNameID id)265 int32_t CreateTable(DbContext *ctx, TableNameID id)
266 {
267 int32_t rc;
268 char *errMsg = NULL;
269
270 if (!CheckDbContextParam(ctx)) {
271 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
272 return SOFTBUS_INVALID_PARAM;
273 }
274 const char *sql = g_sqliteMgr[id].sqlForCreate;
275 if (sql == NULL || sql[0] == '\0') {
276 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "createsql is not impl");
277 return SOFTBUS_ERR;
278 }
279 rc = sqlite3_exec(ctx->db, sql, NULL, NULL, &errMsg);
280 if (rc != SQLITE_OK && errMsg != NULL) {
281 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite_exec fail: %s", errMsg);
282 sqlite3_free(errMsg);
283 }
284 return rc == SQLITE_OK ? SOFTBUS_OK : SOFTBUS_ERR;
285 }
286
DeleteTable(DbContext * ctx,TableNameID id)287 int32_t DeleteTable(DbContext *ctx, TableNameID id)
288 {
289 int32_t rc;
290 char sql[SQL_DEFAULT_LEN] = {0};
291
292 if (!CheckDbContextParam(ctx)) {
293 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
294 return SOFTBUS_INVALID_PARAM;
295 }
296 rc = sprintf_s(sql, SQL_DEFAULT_LEN, "%s%s", SQL_DROP_TABLE, g_sqliteMgr[id].tableName);
297 if (rc < 0) {
298 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sprintf_s sql fail");
299 return SOFTBUS_ERR;
300 }
301 rc = ExecuteSql(ctx, sql, strlen(sql), NULL, NULL);
302 if (rc != SQLITE_DONE) {
303 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "delete table fail");
304 rc = SOFTBUS_ERR;
305 } else {
306 rc = SOFTBUS_OK;
307 }
308 (void)sqlite3_finalize(ctx->stmt);
309 ctx->stmt = NULL;
310 return rc;
311 }
312
CheckTableExist(DbContext * ctx,TableNameID id,bool * isExist)313 int32_t CheckTableExist(DbContext *ctx, TableNameID id, bool *isExist)
314 {
315 int32_t rc;
316 char sql[SQL_DEFAULT_LEN] = {0};
317
318 if (!CheckDbContextParam(ctx) || isExist == NULL) {
319 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
320 return SOFTBUS_INVALID_PARAM;
321 }
322 rc = sprintf_s(sql, SQL_DEFAULT_LEN, SQL_SEARCH_IF_TABLE_EXIST, g_sqliteMgr[id].tableName);
323 if (rc < 0) {
324 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sprintf_s sql fail");
325 return SOFTBUS_ERR;
326 }
327 *isExist = false;
328 rc = ExecuteSql(ctx, sql, strlen(sql), NULL, NULL);
329 if (rc == SQLITE_ROW && sqlite3_column_count(ctx->stmt) != 0) {
330 *isExist = true;
331 }
332 (void)sqlite3_finalize(ctx->stmt);
333 ctx->stmt = NULL;
334 return SOFTBUS_OK;
335 }
336
InsertRecord(DbContext * ctx,TableNameID id,uint8_t * data)337 int32_t InsertRecord(DbContext *ctx, TableNameID id, uint8_t *data)
338 {
339 int32_t rc;
340
341 if (!CheckDbContextParam(ctx) || data == NULL) {
342 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
343 return SOFTBUS_INVALID_PARAM;
344 }
345 rc = ExecuteSql(ctx, g_sqliteMgr[id].sqlForInsert, strlen(g_sqliteMgr[id].sqlForInsert),
346 g_sqliteMgr[id].insertCb, data);
347 if (rc != SQLITE_DONE) {
348 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "insert data failed");
349 rc = SOFTBUS_ERR;
350 } else {
351 rc = SOFTBUS_OK;
352 }
353 (void)sqlite3_finalize(ctx->stmt);
354 ctx->stmt = NULL;
355 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_DBG, "insert data done");
356 return rc;
357 }
358
RemoveRecordByKey(DbContext * ctx,TableNameID id,uint8_t * data)359 int32_t RemoveRecordByKey(DbContext *ctx, TableNameID id, uint8_t *data)
360 {
361 int32_t rc;
362
363 if (!CheckDbContextParam(ctx) || data == NULL) {
364 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
365 return SOFTBUS_INVALID_PARAM;
366 }
367 rc = ExecuteSql(ctx, g_sqliteMgr[id].sqlForRemoveByKey, strlen(g_sqliteMgr[id].sqlForRemoveByKey),
368 g_sqliteMgr[id].removeCb, data);
369 if (rc != SQLITE_DONE) {
370 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "remove data failed");
371 rc = SOFTBUS_ERR;
372 } else {
373 rc = SOFTBUS_OK;
374 }
375 (void)sqlite3_finalize(ctx->stmt);
376 ctx->stmt = NULL;
377 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_DBG, "remove data done");
378 return rc;
379 }
380
RemoveAllRecord(DbContext * ctx,TableNameID id)381 int32_t RemoveAllRecord(DbContext *ctx, TableNameID id)
382 {
383 int32_t rc;
384 char sql[SQL_DEFAULT_LEN] = {0};
385
386 if (!CheckDbContextParam(ctx)) {
387 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
388 return SOFTBUS_INVALID_PARAM;
389 }
390 rc = sprintf_s(sql, SQL_DEFAULT_LEN, "%s%s", SQL_REMOVE_ALL_RECORD, g_sqliteMgr[id].tableName);
391 if (rc < 0) {
392 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sprintf_s sql fail");
393 return SOFTBUS_ERR;
394 }
395 rc = ExecuteSql(ctx, sql, strlen(sql), NULL, NULL);
396 if (rc != SQLITE_DONE) {
397 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "remove data failed");
398 rc = SOFTBUS_ERR;
399 } else {
400 rc = SOFTBUS_OK;
401 }
402 (void)sqlite3_finalize(ctx->stmt);
403 ctx->stmt = NULL;
404 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_DBG, "remove data done");
405 return rc;
406 }
407
GetRecordNumByKey(DbContext * ctx,TableNameID id,uint8_t * data)408 int32_t GetRecordNumByKey(DbContext *ctx, TableNameID id, uint8_t *data)
409 {
410 int32_t rc;
411 int32_t num = 0;
412
413 if (!CheckDbContextParam(ctx)) {
414 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
415 return 0;
416 }
417 rc = QueryData(ctx, g_sqliteMgr[id].sqlForSearchByKey, strlen(g_sqliteMgr[id].sqlForSearchByKey),
418 g_sqliteMgr[id].searchCb, data);
419 if (rc != SQLITE_ROW) {
420 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "find no match data");
421 return 0;
422 }
423 do {
424 num++;
425 rc = QueryDataNext(ctx);
426 } while (rc == SQLITE_ROW);
427 if (rc != SQLITE_DONE) {
428 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "GetQueryDataNum failed");
429 return 0;
430 }
431 return num;
432 }
433
QueryRecordByKey(DbContext * ctx,TableNameID id,uint8_t * data,uint8_t ** replyInfo,int infoNum)434 int32_t QueryRecordByKey(DbContext *ctx, TableNameID id, uint8_t *data, uint8_t **replyInfo, int infoNum)
435 {
436 int32_t rc;
437 int32_t num = 0;
438
439 if (!CheckDbContextParam(ctx) || replyInfo == NULL) {
440 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
441 return SOFTBUS_INVALID_PARAM;
442 }
443 rc = QueryData(ctx, g_sqliteMgr[id].sqlForSearchByKey, strlen(g_sqliteMgr[id].sqlForSearchByKey),
444 g_sqliteMgr[id].searchCb, data);
445 if (rc != SQLITE_ROW) {
446 return SOFTBUS_ERR;
447 }
448 do {
449 if (g_sqliteMgr[id].queryDataCb != NULL) {
450 g_sqliteMgr[id].queryDataCb(ctx, *replyInfo, num);
451 }
452 rc = QueryDataNext(ctx);
453 num++;
454 } while (rc == SQLITE_ROW && num < infoNum);
455 if (rc != SQLITE_DONE) {
456 if (rc == SQLITE_ROW) {
457 ctx->state &= ~DB_STATE_QUERYING;
458 (void)sqlite3_finalize(ctx->stmt);
459 ctx->stmt = NULL;
460 }
461 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "QueryData failed");
462 return SOFTBUS_ERR;
463 }
464 return SOFTBUS_OK;
465 }
466
OpenTransaction(DbContext * ctx)467 int32_t OpenTransaction(DbContext *ctx)
468 {
469 int32_t rc;
470
471 if (!CheckDbContextParam(ctx)) {
472 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
473 return SOFTBUS_INVALID_PARAM;
474 }
475 if ((ctx->state & DB_STATE_TRANSACTION) != 0) {
476 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "already open the transaction: %d", ctx->state);
477 return SOFTBUS_OK;
478 }
479 rc = ExecuteSql(ctx, SQL_BEGIN_TRANSACTION, strlen(SQL_BEGIN_TRANSACTION), NULL, NULL);
480 if (rc != SQLITE_DONE) {
481 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "open transaction failed");
482 rc = SOFTBUS_ERR;
483 } else {
484 ctx->state |= DB_STATE_TRANSACTION;
485 rc = SOFTBUS_OK;
486 }
487 (void)sqlite3_finalize(ctx->stmt);
488 ctx->stmt = NULL;
489 return rc;
490 }
491
CloseTransaction(DbContext * ctx,CloseTransactionType type)492 int32_t CloseTransaction(DbContext *ctx, CloseTransactionType type)
493 {
494 int32_t rc;
495 const char *sql = SQL_COMMIT_TRANSACTION;
496
497 if (!CheckDbContextParam(ctx)) {
498 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
499 return SOFTBUS_INVALID_PARAM;
500 }
501 if ((ctx->state & DB_STATE_TRANSACTION) == 0) {
502 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the transaction already closed: %d", ctx->state);
503 return SOFTBUS_OK;
504 }
505 if (type == CLOSE_TRANS_ROLLBACK) {
506 sql = SQL_ROLLBACK_TRANSACTION;
507 }
508 rc = ExecuteSql(ctx, sql, strlen(sql), NULL, NULL);
509 if (rc != SQLITE_DONE) {
510 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "close transaction failed");
511 rc = SOFTBUS_ERR;
512 } else {
513 rc = SOFTBUS_OK;
514 }
515 ctx->state &= ~DB_STATE_TRANSACTION;
516 (void)sqlite3_finalize(ctx->stmt);
517 ctx->stmt = NULL;
518 return rc;
519 }
520
EncryptedDb(DbContext * ctx,const uint8_t * password,uint32_t len)521 int32_t EncryptedDb(DbContext *ctx, const uint8_t *password, uint32_t len)
522 {
523 int32_t rc;
524
525 if (!CheckDbContextParam(ctx) || password == NULL) {
526 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
527 return SOFTBUS_INVALID_PARAM;
528 }
529 rc = sqlite3_key(ctx->db, password, len);
530 if (rc != SQLITE_OK) {
531 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "config key failed: %s", sqlite3_errmsg(ctx->db));
532 return SOFTBUS_ERR;
533 }
534 return SOFTBUS_OK;
535 }
536
UpdateDbPassword(DbContext * ctx,const uint8_t * password,uint32_t len)537 int32_t UpdateDbPassword(DbContext *ctx, const uint8_t *password, uint32_t len)
538 {
539 int32_t rc;
540
541 if (!CheckDbContextParam(ctx) || password == NULL) {
542 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
543 return SOFTBUS_INVALID_PARAM;
544 }
545 rc = sqlite3_rekey(ctx->db, password, len);
546 if (rc != SQLITE_OK) {
547 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "update key failed: %s", sqlite3_errmsg(ctx->db));
548 return SOFTBUS_ERR;
549 }
550 return SOFTBUS_OK;
551 }
552
BindParaInt(DbContext * ctx,int32_t idx,int32_t value)553 int32_t BindParaInt(DbContext *ctx, int32_t idx, int32_t value)
554 {
555 int32_t rc;
556
557 if (!CheckBindOrQueryParam(ctx) || idx <= 0) {
558 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
559 return SQLITE_ERROR;
560 }
561 rc = sqlite3_bind_int(ctx->stmt, idx, value);
562 if (rc != SQLITE_OK) {
563 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_bind_int failed: %s", sqlite3_errmsg(ctx->db));
564 }
565 return rc;
566 }
567
BindParaInt64(DbContext * ctx,int32_t idx,int64_t value)568 int32_t BindParaInt64(DbContext *ctx, int32_t idx, int64_t value)
569 {
570 int32_t rc;
571
572 if (!CheckBindOrQueryParam(ctx) || idx <= 0) {
573 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
574 return SQLITE_ERROR;
575 }
576 rc = sqlite3_bind_int64(ctx->stmt, idx, value);
577 if (rc != SQLITE_OK) {
578 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_bind_int64 failed: %s", sqlite3_errmsg(ctx->db));
579 }
580 return rc;
581 }
582
BindParaText(DbContext * ctx,int32_t idx,const char * value,uint32_t valueLen)583 int32_t BindParaText(DbContext *ctx, int32_t idx, const char *value, uint32_t valueLen)
584 {
585 int32_t rc;
586
587 if (!CheckBindOrQueryParam(ctx) || idx <= 0 || value == NULL || value[0] == '\0' || strlen(value) != valueLen) {
588 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
589 return SQLITE_ERROR;
590 }
591 rc = sqlite3_bind_text(ctx->stmt, idx, value, valueLen, SQLITE_STATIC);
592 if (rc != SQLITE_OK) {
593 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_bind_text failed: %s", sqlite3_errmsg(ctx->db));
594 }
595 return rc;
596 }
597
BindParaDouble(DbContext * ctx,int32_t idx,double value)598 int32_t BindParaDouble(DbContext *ctx, int32_t idx, double value)
599 {
600 int32_t rc;
601
602 if (!CheckBindOrQueryParam(ctx) || idx <= 0) {
603 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
604 return SQLITE_ERROR;
605 }
606 rc = sqlite3_bind_double(ctx->stmt, idx, value);
607 if (rc != SQLITE_OK) {
608 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "sqlite3_bind_double failed: %s", sqlite3_errmsg(ctx->db));
609 }
610 return rc;
611 }
612
GetQueryResultColCount(DbContext * ctx,int32_t * count)613 int32_t GetQueryResultColCount(DbContext *ctx, int32_t *count)
614 {
615 if (!CheckBindOrQueryParam(ctx)) {
616 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
617 return SOFTBUS_INVALID_PARAM;
618 }
619 if ((ctx->state & DB_STATE_QUERYING) == 0) {
620 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the query already closed: %d", ctx->state);
621 return SOFTBUS_ERR;
622 }
623 *count = sqlite3_column_count(ctx->stmt);
624 return SOFTBUS_OK;
625 }
626
GetQueryResultColText(DbContext * ctx,int32_t iCol,char * text,uint32_t len)627 int32_t GetQueryResultColText(DbContext *ctx, int32_t iCol, char *text, uint32_t len)
628 {
629 const unsigned char *result;
630
631 if (!CheckBindOrQueryParam(ctx) || iCol < 0 || text == NULL) {
632 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
633 return SOFTBUS_INVALID_PARAM;
634 }
635 if ((ctx->state & DB_STATE_QUERYING) == 0) {
636 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the query already closed: %d", ctx->state);
637 return SOFTBUS_ERR;
638 }
639 if (sqlite3_column_type(ctx->stmt, iCol) != SQLITE_TEXT) {
640 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "column type not match");
641 return SOFTBUS_ERR;
642 }
643 result = sqlite3_column_text(ctx->stmt, iCol);
644 if (strcpy_s(text, len, (const char *)result) != EOK) {
645 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "strcpy_s fail");
646 return SOFTBUS_ERR;
647 }
648 return SOFTBUS_OK;
649 }
650
GetQueryResultColInt(DbContext * ctx,int32_t iCol,int32_t * value)651 int32_t GetQueryResultColInt(DbContext *ctx, int32_t iCol, int32_t *value)
652 {
653 if (!CheckBindOrQueryParam(ctx) || iCol < 0) {
654 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
655 return SOFTBUS_INVALID_PARAM;
656 }
657 if ((ctx->state & DB_STATE_QUERYING) == 0) {
658 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the query already closed: %d", ctx->state);
659 return SOFTBUS_ERR;
660 }
661 if (sqlite3_column_type(ctx->stmt, iCol) != SQLITE_INTEGER) {
662 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "column type not match");
663 return SOFTBUS_ERR;
664 }
665 *value = sqlite3_column_int(ctx->stmt, iCol);
666 return SOFTBUS_OK;
667 }
668
GetQueryResultColInt64(DbContext * ctx,int32_t iCol,int64_t * value)669 int32_t GetQueryResultColInt64(DbContext *ctx, int32_t iCol, int64_t *value)
670 {
671 if (!CheckBindOrQueryParam(ctx) || iCol < 0) {
672 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
673 return SOFTBUS_INVALID_PARAM;
674 }
675 if ((ctx->state & DB_STATE_QUERYING) == 0) {
676 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the query already closed: %d", ctx->state);
677 return SOFTBUS_ERR;
678 }
679 if (sqlite3_column_type(ctx->stmt, iCol) != SQLITE_INTEGER) {
680 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "column type not match");
681 return SOFTBUS_ERR;
682 }
683 *value = sqlite3_column_int64(ctx->stmt, iCol);
684 return SOFTBUS_OK;
685 }
686
GetQueryResultColDouble(DbContext * ctx,int32_t iCol,double * value)687 int32_t GetQueryResultColDouble(DbContext *ctx, int32_t iCol, double *value)
688 {
689 if (!CheckBindOrQueryParam(ctx) || iCol < 0) {
690 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "invalid parameters");
691 return SOFTBUS_INVALID_PARAM;
692 }
693 if ((ctx->state & DB_STATE_QUERYING) == 0) {
694 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "the query already closed: %d", ctx->state);
695 return SOFTBUS_ERR;
696 }
697 if (sqlite3_column_type(ctx->stmt, iCol) != SQLITE_FLOAT) {
698 SoftBusLog(SOFTBUS_LOG_COMM, SOFTBUS_LOG_ERROR, "column type not match");
699 return SOFTBUS_ERR;
700 }
701 *value = sqlite3_column_double(ctx->stmt, iCol);
702 return SOFTBUS_OK;
703 }
704