diff options
Diffstat (limited to 'lib/Plugins/SQLite3.cpp')
-rw-r--r-- | lib/Plugins/SQLite3.cpp | 62 |
1 files changed, 42 insertions, 20 deletions
diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp index 645287b..c886ff0 100644 --- a/lib/Plugins/SQLite3.cpp +++ b/lib/Plugins/SQLite3.cpp @@ -26,7 +26,8 @@ #include <iostream> -#define TABLE_NAME "abrt" +#define ABRT_TABLE "abrt" +#define SQLITE3_MASTER_TABLE "sqlite_master" CSQLite3::CSQLite3() : m_sDBPath("/var/cache/abrt/abrt-db"), @@ -36,7 +37,7 @@ CSQLite3::CSQLite3() : bool CSQLite3::Exist(const std::string& pUUID, const std::string& pUID) { vector_database_rows_t table; - GetTable("SELECT "DATABASE_COLUMN_REPORTED" FROM "TABLE_NAME" WHERE " + GetTable("SELECT "DATABASE_COLUMN_REPORTED" FROM "ABRT_TABLE" WHERE " DATABASE_COLUMN_UUID" = '"+pUUID+"' AND " DATABASE_COLUMN_UID" = '"+pUID+"';", table); if(table.empty()) @@ -101,22 +102,31 @@ void CSQLite3::GetTable(const std::string& pCommand, vector_database_rows_t& pTa void CSQLite3::Connect() { + if (!OpenDB()) + { + CreateDB(); + } + if (!CheckTable()) + { + CreateTable(); + } +} + +bool CSQLite3::OpenDB() +{ int ret = sqlite3_open_v2(m_sDBPath.c_str(), &m_pDB, SQLITE_OPEN_READWRITE, NULL); - if(ret == SQLITE_CANTOPEN) - { - Create(); - } - else if (ret != SQLITE_OK) + if (ret != SQLITE_OK && ret != SQLITE_CANTOPEN) { - throw std::string("SQLite3::Connect(): Could not open database.") + sqlite3_errmsg(m_pDB); + throw std::string("SQLite3::CheckDB(): Could not open database. ") + sqlite3_errmsg(m_pDB); } + return ret == SQLITE_OK; } -void CSQLite3::Create() +void CSQLite3::CreateDB() { int ret = sqlite3_open_v2(m_sDBPath.c_str(), &m_pDB, @@ -124,10 +134,22 @@ void CSQLite3::Create() NULL); if(ret != SQLITE_OK) { - throw std::string("SQLite3::Create(): Could not create database.") + sqlite3_errmsg(m_pDB); + throw std::string("SQLite3::Create(): Could not create database. ") + sqlite3_errmsg(m_pDB); } +} + +bool CSQLite3::CheckTable() +{ + vector_database_rows_t table; + GetTable("SELECT NAME FROM "SQLITE3_MASTER_TABLE" " + "WHERE TYPE='table' AND NAME='"ABRT_TABLE"';", table); + + return table.size() == 1; +} - Exec("CREATE TABLE "TABLE_NAME" (" +void CSQLite3::CreateTable() +{ + Exec("CREATE TABLE "ABRT_TABLE" (" DATABASE_COLUMN_UUID" VARCHAR NOT NULL," DATABASE_COLUMN_UID" VARCHAR NOT NULL," DATABASE_COLUMN_DEBUG_DUMP_PATH" VARCHAR NOT NULL," @@ -149,7 +171,7 @@ void CSQLite3::Insert(const std::string& pUUID, { if (!Exist(pUUID, pUID)) { - Exec("INSERT INTO "TABLE_NAME"(" + Exec("INSERT INTO "ABRT_TABLE"(" DATABASE_COLUMN_UUID"," DATABASE_COLUMN_UID"," DATABASE_COLUMN_DEBUG_DUMP_PATH"," @@ -162,7 +184,7 @@ void CSQLite3::Insert(const std::string& pUUID, } else { - Exec("UPDATE "TABLE_NAME" " + Exec("UPDATE "ABRT_TABLE" " "SET "DATABASE_COLUMN_COUNT" = "DATABASE_COLUMN_COUNT" + 1, " DATABASE_COLUMN_TIME" = '"+pTime+"' " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " @@ -174,12 +196,12 @@ void CSQLite3::Delete(const std::string& pUUID, const std::string& pUID) { if (pUID == "0") { - Exec("DELETE FROM "TABLE_NAME" " + Exec("DELETE FROM "ABRT_TABLE" " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';"); } else if (Exist(pUUID, pUID)) { - Exec("DELETE FROM "TABLE_NAME" " + Exec("DELETE FROM "ABRT_TABLE" " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " "AND "DATABASE_COLUMN_UID" = '"+pUID+"';"); } @@ -193,7 +215,7 @@ void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID) { if (Exist(pUUID, pUID)) { - Exec("UPDATE "TABLE_NAME" " + Exec("UPDATE "ABRT_TABLE" " "SET "DATABASE_COLUMN_REPORTED" = 1 " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " "AND "DATABASE_COLUMN_UID" = '"+pUID+"';"); @@ -209,11 +231,11 @@ const vector_database_rows_t CSQLite3::GetUIDData(const std::string& pUID) vector_database_rows_t table; if (pUID == "0") { - GetTable("SELECT * FROM "TABLE_NAME";", table); + GetTable("SELECT * FROM "ABRT_TABLE";", table); } else { - GetTable("SELECT * FROM "TABLE_NAME + GetTable("SELECT * FROM "ABRT_TABLE " WHERE "DATABASE_COLUMN_UID" = '"+pUID+"';", table); } @@ -226,13 +248,13 @@ const database_row_t CSQLite3::GetUUIDData(const std::string& pUUID, const std:: if (pUID == "0") { - GetTable("SELECT * FROM "TABLE_NAME" " + GetTable("SELECT * FROM "ABRT_TABLE" " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';", table); } else { - GetTable("SELECT * FROM "TABLE_NAME" " + GetTable("SELECT * FROM "ABRT_TABLE" " "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " "AND "DATABASE_COLUMN_UID" = '"+pUID+"';", table); |