• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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