diff options
Diffstat (limited to 'lib/Plugins/SQLite3.cpp')
-rw-r--r-- | lib/Plugins/SQLite3.cpp | 344 |
1 files changed, 181 insertions, 163 deletions
diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp index 85d16125..788d43be 100644 --- a/lib/Plugins/SQLite3.cpp +++ b/lib/Plugins/SQLite3.cpp @@ -90,54 +90,26 @@ static const char *const upate_sql_commands[][ABRT_TABLE_VERSION + 1] = { }, }; - -CSQLite3::CSQLite3() : - m_sDBPath(LOCALSTATEDIR "/cache/abrt/abrt-db"), - m_pDB(NULL) -{} - - -void CSQLite3::UpdateABRTTable(const int pOldVersion) -{ - Exec(upate_sql_commands[pOldVersion][ABRT_TABLE_VERSION]); -} - - -bool CSQLite3::Exist(const string& pUUID, const string& pUID) +static void get_table(vector_database_rows_t& pTable, + sqlite3 *db, const char *fmt, ...) { - vector_database_rows_t table; - GetTable("SELECT "COL_REPORTED" FROM "ABRT_TABLE" WHERE " - COL_UUID" = '"+pUUID+"' " - "AND ("COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1');" - , table); - if (table.empty()) - { - return false; - } - return true; -} - -void CSQLite3::Exec(const string& pCommand) -{ - char *err; - int ret = sqlite3_exec(m_pDB, pCommand.c_str(), 0, 0, &err); - if (ret != SQLITE_OK) - { - throw CABRTException(EXCEP_PLUGIN, "SQLite3::Exec(): Error on: " + pCommand + " " + err); - } -} + va_list p; + va_start(p, fmt); + char *sql = xvasprintf(fmt, p); + va_end(p); -void CSQLite3::GetTable(const string& pCommand, vector_database_rows_t& pTable) -{ char **table; int ncol, nrow; char *err; - int ret = sqlite3_get_table(m_pDB, pCommand.c_str(), &table, &nrow, &ncol, &err); + int ret = sqlite3_get_table(db, sql, &table, &nrow, &ncol, &err); if (ret != SQLITE_OK) { - throw CABRTException(EXCEP_PLUGIN, "SQLite3::GetTable(): Error on: " + pCommand + " " + err); + string errstr = ssprintf("Error in SQL:'%s' error: %s", sql, err); + free(sql); + throw CABRTException(EXCEP_PLUGIN, errstr); } + free(sql); + pTable.clear(); int ii; for (ii = 0; ii < nrow; ii++) @@ -146,24 +118,16 @@ void CSQLite3::GetTable(const string& pCommand, vector_database_rows_t& pTable) database_row_t row; for (jj = 0; jj < ncol; jj++) { + char *val = table[jj + (ncol*ii) + ncol]; switch (jj) { - case 0: row.m_sUUID = table[jj + (ncol*ii) + ncol]; - break; - case 1: row.m_sUID = table[jj + (ncol*ii) + ncol]; - break; - case 2: row.m_sDebugDumpDir = table[jj + (ncol*ii) + ncol]; - break; - case 3: row.m_sCount = table[jj + (ncol*ii) + ncol]; - break; - case 4: row.m_sReported = table[jj + (ncol*ii) + ncol]; - break; - case 5: row.m_sTime = table[jj + (ncol*ii) + ncol]; - break; - case 6: row.m_sMessage = table[jj + (ncol*ii) + ncol]; - break; - default: - break; + case 0: row.m_sUUID = val; break; + case 1: row.m_sUID = val; break; + case 2: row.m_sDebugDumpDir = val; break; + case 3: row.m_sCount = val; break; + case 4: row.m_sReported = val; break; + case 5: row.m_sTime = val; break; + case 6: row.m_sMessage = val; break; } } pTable.push_back(row); @@ -172,54 +136,49 @@ void CSQLite3::GetTable(const string& pCommand, vector_database_rows_t& pTable) sqlite3_free_table(table); } - -void CSQLite3::Connect() +static void execute_sql(sqlite3 *db, const char *fmt, ...) { - if (!OpenDB()) - { - CreateDB(); - } - if (!CheckTable()) + va_list p; + va_start(p, fmt); + char *sql = xvasprintf(fmt, p); + va_end(p); + + char *err; + int ret = sqlite3_exec(db, sql, 0, 0, &err); + if (ret != SQLITE_OK) { - CreateTable(); + string errstr = ssprintf("Error in SQL:'%s' error: %s", sql, err); + free(sql); + throw CABRTException(EXCEP_PLUGIN, errstr); } + free(sql); } -bool CSQLite3::OpenDB() +static bool exists_uuid_uid(sqlite3 *db, const char *pUUID, const char *pUID) { - int ret = sqlite3_open_v2(m_sDBPath.c_str(), - &m_pDB, - SQLITE_OPEN_READWRITE, - NULL); - - if (ret != SQLITE_OK && ret != SQLITE_CANTOPEN) - { - throw CABRTException(EXCEP_PLUGIN, string("SQLite3::CheckDB(): Can't open database. ") + sqlite3_errmsg(m_pDB)); - } - return ret == SQLITE_OK; + vector_database_rows_t table; + get_table(table, db, + "SELECT "COL_REPORTED" FROM "ABRT_TABLE" WHERE " + COL_UUID" = '%s' " + "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');", + pUUID, pUID + ); + return !table.empty(); } -void CSQLite3::CreateDB() +static void update_from_old_ver(sqlite3 *db, int pOldVersion) { - int ret = sqlite3_open_v2(m_sDBPath.c_str(), - &m_pDB, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, - NULL); - if (ret != SQLITE_OK) - { - throw CABRTException(EXCEP_PLUGIN, ssprintf("Can't create database. SQLite3 error: %s", sqlite3_errmsg(m_pDB))); - } + execute_sql(db, upate_sql_commands[pOldVersion][ABRT_TABLE_VERSION]); } - -bool CSQLite3::CheckTable() +static bool check_table(sqlite3 *db) { const char *command = "SELECT NAME, SQL FROM "SQLITE3_MASTER_TABLE" " "WHERE TYPE='table';"; char **table; int ncol, nrow; char *err; - int ret = sqlite3_get_table(m_pDB, command, &table, &nrow, &ncol, &err); + int ret = sqlite3_get_table(db, command, &table, &nrow, &ncol, &err); if (ret != SQLITE_OK) { /* Should never happen */ @@ -237,7 +196,7 @@ bool CSQLite3::CheckTable() string tableVersion = tableName.substr(pos + 2); if (atoi(tableVersion.c_str()) < ABRT_TABLE_VERSION) { - UpdateABRTTable(atoi(tableVersion.c_str())); + update_from_old_ver(db, atoi(tableVersion.c_str())); } return true; } @@ -249,38 +208,84 @@ bool CSQLite3::CheckTable() string sql = table[1 + ncol]; if (sql.find(COL_MESSAGE) != string::npos) { - UpdateABRTTable(1); + update_from_old_ver(db, 1); return true; } - UpdateABRTTable(0); + update_from_old_ver(db, 0); return true; } /* -bool CSQLite3::CheckTable() +static bool check_table() { vector_database_rows_t table; - GetTable("SELECT NAME FROM "SQLITE3_MASTER_TABLE" " - "WHERE TYPE='table' AND NAME='"ABRT_TABLE"';", table); + get_table(table, m_pDB, + "SELECT NAME FROM "SQLITE3_MASTER_TABLE" " + "WHERE TYPE='table' AND NAME='"ABRT_TABLE"';"); return table.size() == 1; } */ -void CSQLite3::CreateTable() + + +CSQLite3::CSQLite3() : + m_sDBPath(LOCALSTATEDIR "/cache/abrt/abrt-db"), + m_pDB(NULL) +{} + +CSQLite3::~CSQLite3() { - Exec("CREATE TABLE "ABRT_TABLE" (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - COL_COUNT" INT NOT NULL DEFAULT 1," - COL_REPORTED" INT NOT NULL DEFAULT 0," - COL_TIME" VARCHAR NOT NULL DEFAULT 0," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID"));"); + DisConnect(); } void CSQLite3::DisConnect() { - sqlite3_close(m_pDB); + if (m_pDB) + { + sqlite3_close(m_pDB); + m_pDB = NULL; + } +} + +void CSQLite3::Connect() +{ + int ret = sqlite3_open_v2(m_sDBPath.c_str(), + &m_pDB, + SQLITE_OPEN_READWRITE, + NULL + ); + + if (ret != SQLITE_OK) + { + if (ret != SQLITE_CANTOPEN) + { + throw CABRTException(EXCEP_PLUGIN, ssprintf("CheckDB: Can't open database: %s", sqlite3_errmsg(m_pDB))); + } + + ret = sqlite3_open_v2(m_sDBPath.c_str(), + &m_pDB, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + NULL + ); + if (ret != SQLITE_OK) + { + throw CABRTException(EXCEP_PLUGIN, ssprintf("Can't create database: %s", sqlite3_errmsg(m_pDB))); + } + } + + if (!check_table(m_pDB)) + { + execute_sql(m_pDB, + "CREATE TABLE "ABRT_TABLE" (" + COL_UUID" VARCHAR NOT NULL," + COL_UID" VARCHAR NOT NULL," + COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," + COL_COUNT" INT NOT NULL DEFAULT 1," + COL_REPORTED" INT NOT NULL DEFAULT 0," + COL_TIME" VARCHAR NOT NULL DEFAULT 0," + COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," + "PRIMARY KEY ("COL_UUID","COL_UID"));" + ); + } } void CSQLite3::Insert_or_Update(const char *pUUID, @@ -288,129 +293,142 @@ void CSQLite3::Insert_or_Update(const char *pUUID, const char *pDebugDumpPath, const char *pTime) { - if (!Exist(pUUID, pUID)) + if (!exists_uuid_uid(m_pDB, pUUID, pUID)) { - string sql = ssprintf( - "INSERT INTO "ABRT_TABLE - " (" + execute_sql(m_pDB, + "INSERT INTO "ABRT_TABLE" (" COL_UUID"," COL_UID"," COL_DEBUG_DUMP_PATH"," COL_TIME ")" " VALUES ('%s','%s','%s','%s');", - pUUID, pUID, pDebugDumpPath, pTime + pUUID, pUID, pDebugDumpPath, pTime ); - Exec(sql); } else { - string sql = ssprintf( - "UPDATE "ABRT_TABLE" SET " + execute_sql(m_pDB, + "UPDATE "ABRT_TABLE" SET " COL_COUNT" = "COL_COUNT" + 1, " COL_TIME" = '%s'" " WHERE "COL_UUID" = '%s'" " AND "COL_UID" = '%s';", - pTime, pUUID, pUID + pTime, pUUID, pUID ); - Exec(sql); } } -void CSQLite3::DeleteRow(const string& pUUID, const string& pUID) +void CSQLite3::DeleteRow(const char *pUUID, const char *pUID) { - if (pUID == "0") + if (pUID[0] == '0' && !pUID[1]) { - Exec("DELETE FROM "ABRT_TABLE" " - "WHERE "COL_UUID" = '"+pUUID+"';"); + execute_sql(m_pDB, + "DELETE FROM "ABRT_TABLE" " + "WHERE "COL_UUID" = '%s';", + pUUID, pUID + ); } - else if (Exist(pUUID, pUID)) + else if (exists_uuid_uid(m_pDB, pUUID, pUID)) { - Exec("DELETE FROM "ABRT_TABLE" " - "WHERE "COL_UUID" = '"+pUUID+"' " - "AND ("COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1');"); + execute_sql(m_pDB, "DELETE FROM "ABRT_TABLE" " + "WHERE "COL_UUID" = '%s' " + "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');", + pUUID, pUID + ); } else { - throw CABRTException(EXCEP_PLUGIN, "UUID is not found in DB"); + error_msg("UUID,UID %s,%s is not found in DB", pUUID, pUID); } } void CSQLite3::DeleteRows_by_dir(const char *dump_dir) { - string sql = ssprintf( + execute_sql(m_pDB, "DELETE FROM "ABRT_TABLE" " "WHERE "COL_DEBUG_DUMP_PATH" = '%s'", dump_dir ); - Exec(sql); } -void CSQLite3::SetReported(const string& pUUID, const string& pUID, const string& pMessage) +void CSQLite3::SetReported(const char *pUUID, const char *pUID, const char *pMessage) { - if (pUID == "0") + if (pUID[0] == '0' && !pUID[1]) { - Exec("UPDATE "ABRT_TABLE" " - "SET "COL_REPORTED" = 1 " - "WHERE "COL_UUID" = '"+pUUID+"';"); - Exec("UPDATE "ABRT_TABLE" " - "SET "COL_MESSAGE" = '" + pMessage + "' " - "WHERE "COL_UUID" = '"+pUUID+"';"); + execute_sql(m_pDB, + "UPDATE "ABRT_TABLE" " + "SET "COL_REPORTED" = 1 " + "WHERE "COL_UUID" = '%s';", + pUUID + ); + execute_sql(m_pDB, "UPDATE "ABRT_TABLE" " + "SET "COL_MESSAGE" = '%s' " + "WHERE "COL_UUID" = '%s';", + pMessage, pUUID + ); } - else if (Exist(pUUID, pUID)) + else if (exists_uuid_uid(m_pDB, pUUID, pUID)) { - Exec("UPDATE "ABRT_TABLE" " - "SET "COL_REPORTED" = 1 " - "WHERE "COL_UUID" = '"+pUUID+"' " - "AND ("COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1');"); - Exec("UPDATE "ABRT_TABLE" " - "SET "COL_MESSAGE" = '" + pMessage + "' " - "WHERE "COL_UUID" = '"+pUUID+"' " - "AND ("COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1');"); + execute_sql(m_pDB, + "UPDATE "ABRT_TABLE" " + "SET "COL_REPORTED" = 1 " + "WHERE "COL_UUID" = '%s' " + "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');", + pUUID, pUID + ); + execute_sql(m_pDB, + "UPDATE "ABRT_TABLE" " + "SET "COL_MESSAGE" = '%s' " + "WHERE "COL_UUID" = '%s' " + "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');", + pMessage, pUUID, pUID + ); } else { - throw CABRTException(EXCEP_PLUGIN, "CSQLite3::SetReported(): UUID"+pUID+" is not found in DB."); + error_msg("UUID,UID %s,%s is not found in DB", pUUID, pUID); } } -vector_database_rows_t CSQLite3::GetUIDData(const string& pUID) +vector_database_rows_t CSQLite3::GetUIDData(const char *pUID) { vector_database_rows_t table; - if (pUID == "0") + if (pUID[0] == '0' && !pUID[1]) { - GetTable("SELECT * FROM "ABRT_TABLE";", table); + get_table(table, m_pDB, "SELECT * FROM "ABRT_TABLE";"); } else { - GetTable("SELECT * FROM "ABRT_TABLE - " WHERE "COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1';", - table); + get_table(table, m_pDB, + "SELECT * FROM "ABRT_TABLE + " WHERE "COL_UID" = '%s' OR "COL_UID" = '-1';", + pUID + ); } return table; } -database_row_t CSQLite3::GetRow(const string& pUUID, const string& pUID) +database_row_t CSQLite3::GetRow(const char *pUUID, const char *pUID) { vector_database_rows_t table; - if (pUID == "0") + if (pUID[0] == '0' && !pUID[1]) { - GetTable("SELECT * FROM "ABRT_TABLE" " - "WHERE "COL_UUID" = '"+pUUID+"';", - table); + get_table(table, m_pDB, + "SELECT * FROM "ABRT_TABLE" " + "WHERE "COL_UUID" = '%s';", + pUUID + ); } else { - GetTable("SELECT * FROM "ABRT_TABLE" " - "WHERE "COL_UUID" = '"+pUUID+"' " - "AND ("COL_UID" = '"+pUID+"' " - "OR "COL_UID" = '-1');", - table); + get_table(table, m_pDB, + "SELECT * FROM "ABRT_TABLE" " + "WHERE "COL_UUID" = '%s' " + "AND ("COL_UID" = '%s' OR "COL_UID" = '-1');", + pUUID, pUID + ); } if (table.size() == 0) |