2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "db_manager.h"
21 #include "tac_common.h"
26 #define LOG_TAG "DOTNET_INSTALLER_PLUGIN"
28 static int dbIntegrityCheckCb(void *user_data, int argc, char **argv, char **not_used)
30 bool* is_db_corrupted = static_cast<bool*>(user_data);
31 std::string result_DB_check = argv[0];
32 std::transform(result_DB_check.begin(), result_DB_check.end(), result_DB_check.begin(), ::tolower);
33 if(result_DB_check != "ok") {
34 *is_db_corrupted = true;
35 _ERR("DB integrity check failed");
38 _INFO("DB integrity result : %s", argv[0]);
42 sqlite3* dbCreate(std::string path)
44 sqlite3 *sqlite = NULL;
45 bool is_db_corrupted = false;
46 int ret = sqlite3_open(path.c_str(), &sqlite);
47 if (ret != SQLITE_OK) {
48 _INFO("DB file is corrupted, start to recover corrupted db");
49 if (restoreTACDB() != TAC_ERROR_NONE) {
50 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
53 return dbCreate(path);
55 ret = sqlite3_exec(sqlite, "PRAGMA journal_mode = PERSIST", NULL, NULL, NULL);
56 if (ret != SQLITE_OK) {
57 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
58 sqlite3_close(sqlite);
62 ret = sqlite3_exec(sqlite, CREATE_TAC_DB_TABLE, NULL, NULL, NULL);
63 if (ret != SQLITE_OK) {
64 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
65 sqlite3_close(sqlite);
69 ret = sqlite3_exec(sqlite, "PRAGMA integrity_check", dbIntegrityCheckCb, &is_db_corrupted, NULL);
70 if (ret == SQLITE_CORRUPT || is_db_corrupted) {
71 _INFO("DB file is corrupted, start to recover corrupted db");
72 if (restoreTACDB() != TAC_ERROR_NONE) {
73 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
74 sqlite3_close(sqlite);
78 return dbCreate(path);
83 sqlite3* dbOpen(std::string path)
85 sqlite3 *sqlite = NULL;
86 bool is_db_corrupted = false;
87 int ret = sqlite3_open(path.c_str(), &sqlite);
88 if (ret != SQLITE_OK) {
89 _INFO("DB file is corrupted, start to recover corrupted db");
90 if (restoreTACDB() != TAC_ERROR_NONE) {
91 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
96 ret = sqlite3_exec(sqlite, "PRAGMA integrity_check", dbIntegrityCheckCb, &is_db_corrupted, NULL);
97 if (ret == SQLITE_CORRUPT || is_db_corrupted) {
98 _INFO("DB file is corrupted, start to recover corrupted db");
99 if (restoreTACDB() != TAC_ERROR_NONE) {
100 _ERR("Sqlite error : [%d, %s]", ret, path.c_str());
101 sqlite3_close(sqlite);
110 void dbFinalize(sqlite3_stmt *stmt)
113 sqlite3_finalize(stmt);
118 void dbClose(sqlite3 *tac_db)
121 sqlite3_exec(tac_db, "COMMIT;", NULL, NULL, NULL);
122 sqlite3_close(tac_db);
127 void dbRollback(sqlite3 *tac_db)
130 sqlite3_exec(tac_db, "ROLLBACK;", NULL, NULL, NULL);
131 sqlite3_close(tac_db);
136 bool dbUpdate(sqlite3 *tac_db, std::string path, std::string query)
138 sqlite3_stmt *stmt = NULL;
139 int ret = sqlite3_exec(tac_db, "BEGIN;", NULL, NULL, NULL);
140 ret = sqlite3_prepare(tac_db, query.c_str(), QUERY_MAX_LEN , &stmt, NULL);
141 if (ret != SQLITE_OK) {
142 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
146 ret = sqlite3_step(stmt);
147 if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_OK) {
148 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
157 bool dbInsert(sqlite3 *tac_db, std::string path, std::string query)
159 sqlite3_stmt *stmt = NULL;
160 int ret = sqlite3_exec(tac_db, "BEGIN;", NULL, NULL, NULL);
161 ret = sqlite3_prepare(tac_db, query.c_str(), QUERY_MAX_LEN , &stmt, NULL);
162 if (ret != SQLITE_OK) {
163 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
167 ret = sqlite3_step(stmt);
168 if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_OK) {
169 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
178 std::vector<std::string> dbSelect(sqlite3 *tac_db, std::string path, std::string query)
180 std::vector<std::string> updateDB;
181 sqlite3_stmt* stmt = NULL;
182 const char* str = NULL;
183 int ret = sqlite3_prepare_v2(tac_db, query.c_str(), strlen(query.c_str()), &stmt, NULL);
184 if (ret != SQLITE_OK) {
185 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
189 while (sqlite3_step(stmt) == SQLITE_ROW) {
190 str = (const char *) sqlite3_column_text(stmt, 2);
191 updateDB.push_back((!str || !strlen(str)) ? NULL : strdup(str));
197 bool dbDelete(sqlite3 *tac_db, std::string path, std::string query)
199 sqlite3_stmt *stmt = NULL;
200 int ret = sqlite3_exec(tac_db, "BEGIN;", NULL, NULL, NULL);
201 ret = sqlite3_prepare(tac_db, query.c_str(), QUERY_MAX_LEN , &stmt, NULL);
202 if (ret != SQLITE_OK) {
203 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));
207 ret = sqlite3_step(stmt);
208 if (ret != SQLITE_DONE && ret != SQLITE_ROW && ret != SQLITE_OK) {
209 _ERR("Sqlite error : [%d, %s]", ret, sqlite3_errmsg(tac_db));