diff options
-rw-r--r-- | lib/Plugins/SQLite3.cpp | 298 | ||||
-rw-r--r-- | lib/Plugins/SQLite3.h | 13 | ||||
-rw-r--r-- | lib/Utils/Database.h | 27 | ||||
-rw-r--r-- | src/Daemon/CrashWatcher.cpp | 29 | ||||
-rw-r--r-- | src/Daemon/CrashWatcher.h | 3 | ||||
-rw-r--r-- | src/Daemon/Daemon.cpp | 3 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.cpp | 63 | ||||
-rw-r--r-- | src/Daemon/MiddleWare.h | 13 |
8 files changed, 251 insertions, 198 deletions
diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp index 4aac98de..85d16125 100644 --- a/lib/Plugins/SQLite3.cpp +++ b/lib/Plugins/SQLite3.cpp @@ -27,10 +27,20 @@ #include <limits.h> #include <abrtlib.h> +using namespace std; + #define ABRT_TABLE_VERSION 2 #define ABRT_TABLE_VERSION_STR "2" -#define ABRT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR -#define SQLITE3_MASTER_TABLE "sqlite_master" +#define ABRT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR +#define SQLITE3_MASTER_TABLE "sqlite_master" + +#define COL_UUID "UUID" +#define COL_UID "UID" +#define COL_DEBUG_DUMP_PATH "DebugDumpPath" +#define COL_COUNT "Count" +#define COL_REPORTED "Reported" +#define COL_TIME "Time" +#define COL_MESSAGE "Message" // after a while, we can drop support for update, so a table can stay in // normal limits @@ -40,11 +50,11 @@ static const char *const upate_sql_commands[][ABRT_TABLE_VERSION + 1] = { // v0 -> v0 ";", // v0 -> v1 - "ALTER TABLE abrt ADD "DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '';", + "ALTER TABLE abrt ADD "COL_MESSAGE" VARCHAR NOT NULL DEFAULT '';", // v0 -> v2 "BEGIN TRANSACTION;" "ALTER TABLE abrt RENAME TO abrt_v2;" - "ALTER TABLE abrt_v2 ADD "DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '';" + "ALTER TABLE abrt_v2 ADD "COL_MESSAGE" VARCHAR NOT NULL DEFAULT '';" "COMMIT;", }, @@ -58,22 +68,22 @@ static const char *const upate_sql_commands[][ABRT_TABLE_VERSION + 1] = { // v1 -> v2 "BEGIN TRANSACTION;" "CREATE TABLE abrt_v2 (" - DATABASE_COLUMN_UUID" VARCHAR NOT NULL," - DATABASE_COLUMN_UID" VARCHAR NOT NULL," - DATABASE_COLUMN_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - DATABASE_COLUMN_COUNT" INT NOT NULL DEFAULT 1," - DATABASE_COLUMN_REPORTED" INT NOT NULL DEFAULT 0," - DATABASE_COLUMN_TIME" VARCHAR NOT NULL DEFAULT 0," - DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("DATABASE_COLUMN_UUID","DATABASE_COLUMN_UID"));" + 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"));" "INSERT INTO abrt_v2 " - "SELECT "DATABASE_COLUMN_UUID"," - DATABASE_COLUMN_UID"," - DATABASE_COLUMN_DEBUG_DUMP_PATH"," - DATABASE_COLUMN_COUNT"," - DATABASE_COLUMN_REPORTED"," - DATABASE_COLUMN_TIME"," - DATABASE_COLUMN_MESSAGE + "SELECT "COL_UUID"," + COL_UID"," + COL_DEBUG_DUMP_PATH"," + COL_COUNT"," + COL_REPORTED"," + COL_TIME"," + COL_MESSAGE " FROM abrt;" "DROP TABLE abrt;" "COMMIT;", @@ -93,13 +103,13 @@ void CSQLite3::UpdateABRTTable(const int pOldVersion) } -bool CSQLite3::Exist(const std::string& pUUID, const std::string& pUID) +bool CSQLite3::Exist(const string& pUUID, const string& pUID) { vector_database_rows_t table; - GetTable("SELECT "DATABASE_COLUMN_REPORTED" FROM "ABRT_TABLE" WHERE " - DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND ("DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1');" + GetTable("SELECT "COL_REPORTED" FROM "ABRT_TABLE" WHERE " + COL_UUID" = '"+pUUID+"' " + "AND ("COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1');" , table); if (table.empty()) { @@ -108,7 +118,7 @@ bool CSQLite3::Exist(const std::string& pUUID, const std::string& pUID) return true; } -void CSQLite3::Exec(const std::string& pCommand) +void CSQLite3::Exec(const string& pCommand) { char *err; int ret = sqlite3_exec(m_pDB, pCommand.c_str(), 0, 0, &err); @@ -118,48 +128,48 @@ void CSQLite3::Exec(const std::string& pCommand) } } -void CSQLite3::GetTable(const std::string& pCommand, vector_database_rows_t& pTable) +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); - if (ret != SQLITE_OK) - { - throw CABRTException(EXCEP_PLUGIN, "SQLite3::GetTable(): Error on: " + pCommand + " " + err); - } - pTable.clear(); - int ii; - for (ii = 0; ii < nrow; ii++) + char **table; + int ncol, nrow; + char *err; + int ret = sqlite3_get_table(m_pDB, pCommand.c_str(), &table, &nrow, &ncol, &err); + if (ret != SQLITE_OK) + { + throw CABRTException(EXCEP_PLUGIN, "SQLite3::GetTable(): Error on: " + pCommand + " " + err); + } + pTable.clear(); + int ii; + for (ii = 0; ii < nrow; ii++) + { + int jj; + database_row_t row; + for (jj = 0; jj < ncol; jj++) { - int jj; - database_row_t row; - for (jj = 0; jj < ncol; jj++) + switch (jj) { - 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 = 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; } - pTable.push_back(row); - } - sqlite3_free_table(table); + pTable.push_back(row); + + } + sqlite3_free_table(table); } @@ -184,7 +194,7 @@ bool CSQLite3::OpenDB() if (ret != SQLITE_OK && ret != SQLITE_CANTOPEN) { - throw CABRTException(EXCEP_PLUGIN, std::string("SQLite3::CheckDB(): Could not open database. ") + sqlite3_errmsg(m_pDB)); + throw CABRTException(EXCEP_PLUGIN, string("SQLite3::CheckDB(): Can't open database. ") + sqlite3_errmsg(m_pDB)); } return ret == SQLITE_OK; } @@ -195,56 +205,54 @@ void CSQLite3::CreateDB() &m_pDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); - if(ret != SQLITE_OK) + if (ret != SQLITE_OK) { - throw CABRTException(EXCEP_PLUGIN, std::string("SQLite3::Create(): Could not create database. ") + sqlite3_errmsg(m_pDB)); + throw CABRTException(EXCEP_PLUGIN, ssprintf("Can't create database. SQLite3 error: %s", sqlite3_errmsg(m_pDB))); } } bool CSQLite3::CheckTable() { - std::string command = "SELECT NAME, SQL FROM "SQLITE3_MASTER_TABLE" " + 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.c_str(), &table, &nrow, &ncol, &err); + int ret = sqlite3_get_table(m_pDB, command, &table, &nrow, &ncol, &err); if (ret != SQLITE_OK) { - throw CABRTException(EXCEP_PLUGIN, "SQLite3::GetTable(): Error on: " + command + " " + err); + /* Should never happen */ + error_msg_and_die("SQLite3 database is corrupted"); } if (!nrow || !nrow) { return false; } - std::string tableName = table[0 + ncol]; - std::string::size_type pos = tableName.find("_"); - if (pos != std::string::npos) + string tableName = table[0 + ncol]; + string::size_type pos = tableName.find("_"); + if (pos != string::npos) { - std::string tableVersion = tableName.substr(pos + 2); + string tableVersion = tableName.substr(pos + 2); if (atoi(tableVersion.c_str()) < ABRT_TABLE_VERSION) { UpdateABRTTable(atoi(tableVersion.c_str())); } return true; } + // TODO: after some time could be removed, and if a table is that old, - // then simoply drop it and create new one - else + // then simply drop it and create new one + + // hack for version 0 and 1 + string sql = table[1 + ncol]; + if (sql.find(COL_MESSAGE) != string::npos) { - // hack for version 0 and 1 - std::string sql = table[1 + ncol]; - if (sql.find(DATABASE_COLUMN_MESSAGE) != std::string::npos) - { - UpdateABRTTable(1); - return true; - } - UpdateABRTTable(0); + UpdateABRTTable(1); return true; } - + UpdateABRTTable(0); return true; } /* @@ -260,14 +268,14 @@ bool CSQLite3::CheckTable() 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," - DATABASE_COLUMN_COUNT" INT NOT NULL DEFAULT 1," - DATABASE_COLUMN_REPORTED" INT NOT NULL DEFAULT 0," - DATABASE_COLUMN_TIME" VARCHAR NOT NULL DEFAULT 0," - DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("DATABASE_COLUMN_UUID","DATABASE_COLUMN_UID"));"); + 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::DisConnect() @@ -275,77 +283,93 @@ void CSQLite3::DisConnect() sqlite3_close(m_pDB); } -void CSQLite3::Insert(const std::string& pUUID, - const std::string& pUID, - const std::string& pDebugDumpPath, - const std::string& pTime) +void CSQLite3::Insert_or_Update(const char *pUUID, + const char *pUID, + const char *pDebugDumpPath, + const char *pTime) { if (!Exist(pUUID, pUID)) { - Exec("INSERT INTO "ABRT_TABLE"(" - DATABASE_COLUMN_UUID"," - DATABASE_COLUMN_UID"," - DATABASE_COLUMN_DEBUG_DUMP_PATH"," - DATABASE_COLUMN_TIME")" - " VALUES ('"+pUUID+"'," - "'"+pUID+"'," - "'"+pDebugDumpPath+"'," - "'"+pTime+"'" - ");"); + string sql = ssprintf( + "INSERT INTO "ABRT_TABLE + " (" + COL_UUID"," + COL_UID"," + COL_DEBUG_DUMP_PATH"," + COL_TIME + ")" + " VALUES ('%s','%s','%s','%s');", + pUUID, pUID, pDebugDumpPath, pTime + ); + Exec(sql); } else { - Exec("UPDATE "ABRT_TABLE" " - "SET "DATABASE_COLUMN_COUNT" = "DATABASE_COLUMN_COUNT" + 1, " - DATABASE_COLUMN_TIME" = '"+pTime+"' " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND "DATABASE_COLUMN_UID" = '"+pUID+"';"); + string sql = ssprintf( + "UPDATE "ABRT_TABLE" SET " + COL_COUNT" = "COL_COUNT" + 1, " + COL_TIME" = '%s'" + " WHERE "COL_UUID" = '%s'" + " AND "COL_UID" = '%s';", + pTime, pUUID, pUID + ); + Exec(sql); } } -void CSQLite3::Delete(const std::string& pUUID, const std::string& pUID) +void CSQLite3::DeleteRow(const string& pUUID, const string& pUID) { if (pUID == "0") { Exec("DELETE FROM "ABRT_TABLE" " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';"); + "WHERE "COL_UUID" = '"+pUUID+"';"); } else if (Exist(pUUID, pUID)) { Exec("DELETE FROM "ABRT_TABLE" " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND ("DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1');"); + "WHERE "COL_UUID" = '"+pUUID+"' " + "AND ("COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1');"); } else { - throw CABRTException(EXCEP_PLUGIN, "CSQLite3::Delete(): UUID is not found in DB."); + throw CABRTException(EXCEP_PLUGIN, "UUID is not found in DB"); } } -void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID, const std::string& pMessage) +void CSQLite3::DeleteRows_by_dir(const char *dump_dir) +{ + string sql = ssprintf( + "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) { if (pUID == "0") { Exec("UPDATE "ABRT_TABLE" " - "SET "DATABASE_COLUMN_REPORTED" = 1 " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';"); + "SET "COL_REPORTED" = 1 " + "WHERE "COL_UUID" = '"+pUUID+"';"); Exec("UPDATE "ABRT_TABLE" " - "SET "DATABASE_COLUMN_MESSAGE" = '" + pMessage + "' " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';"); + "SET "COL_MESSAGE" = '" + pMessage + "' " + "WHERE "COL_UUID" = '"+pUUID+"';"); } else if (Exist(pUUID, pUID)) { Exec("UPDATE "ABRT_TABLE" " - "SET "DATABASE_COLUMN_REPORTED" = 1 " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND ("DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1');"); + "SET "COL_REPORTED" = 1 " + "WHERE "COL_UUID" = '"+pUUID+"' " + "AND ("COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1');"); Exec("UPDATE "ABRT_TABLE" " - "SET "DATABASE_COLUMN_MESSAGE" = '" + pMessage + "' " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND ("DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1');"); + "SET "COL_MESSAGE" = '" + pMessage + "' " + "WHERE "COL_UUID" = '"+pUUID+"' " + "AND ("COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1');"); } else { @@ -353,7 +377,7 @@ void CSQLite3::SetReported(const std::string& pUUID, const std::string& pUID, co } } -vector_database_rows_t CSQLite3::GetUIDData(const std::string& pUID) +vector_database_rows_t CSQLite3::GetUIDData(const string& pUID) { vector_database_rows_t table; if (pUID == "0") @@ -363,29 +387,29 @@ vector_database_rows_t CSQLite3::GetUIDData(const std::string& pUID) else { GetTable("SELECT * FROM "ABRT_TABLE - " WHERE "DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1';", + " WHERE "COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1';", table); } return table; } -database_row_t CSQLite3::GetUUIDData(const std::string& pUUID, const std::string& pUID) +database_row_t CSQLite3::GetRow(const string& pUUID, const string& pUID) { vector_database_rows_t table; if (pUID == "0") { GetTable("SELECT * FROM "ABRT_TABLE" " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"';", + "WHERE "COL_UUID" = '"+pUUID+"';", table); } else { GetTable("SELECT * FROM "ABRT_TABLE" " - "WHERE "DATABASE_COLUMN_UUID" = '"+pUUID+"' " - "AND ("DATABASE_COLUMN_UID" = '"+pUID+"' " - "OR "DATABASE_COLUMN_UID" = '-1');", + "WHERE "COL_UUID" = '"+pUUID+"' " + "AND ("COL_UID" = '"+pUID+"' " + "OR "COL_UID" = '-1');", table); } diff --git a/lib/Plugins/SQLite3.h b/lib/Plugins/SQLite3.h index fc13bd73..232e94ca 100644 --- a/lib/Plugins/SQLite3.h +++ b/lib/Plugins/SQLite3.h @@ -47,15 +47,16 @@ class CSQLite3 : public CDatabase virtual void Connect(); virtual void DisConnect(); - virtual void Insert(const std::string& pUUID, - const std::string& pUID, - const std::string& pDebugDumpPath, - const std::string& pTime); + virtual void Insert_or_Update(const char *pUUID, + const char *pUID, + const char *pDebugDumpPath, + const char *pTime); - virtual void Delete(const std::string& pUUID, const std::string& pUID); + virtual void DeleteRow(const std::string& pUUID, const std::string& pUID); + virtual void DeleteRows_by_dir(const char *dump_dir); virtual void SetReported(const std::string& pUUID, const std::string& pUID, const std::string& pMessage); virtual vector_database_rows_t GetUIDData(const std::string& pUID); - virtual database_row_t GetUUIDData(const std::string& pUUID, const std::string& pUID); + virtual database_row_t GetRow(const std::string& pUUID, const std::string& pUID); virtual void SetSettings(const map_plugin_settings_t& pSettings); //ok to delete? diff --git a/lib/Utils/Database.h b/lib/Utils/Database.h index 0fc31ee7..c7a95bac 100644 --- a/lib/Utils/Database.h +++ b/lib/Utils/Database.h @@ -35,18 +35,10 @@ * primary key (UUID, UID) */ -#define DATABASE_COLUMN_UUID "UUID" -#define DATABASE_COLUMN_UID "UID" -#define DATABASE_COLUMN_DEBUG_DUMP_PATH "DebugDumpPath" -#define DATABASE_COLUMN_COUNT "Count" -#define DATABASE_COLUMN_REPORTED "Reported" -#define DATABASE_COLUMN_TIME "Time" -#define DATABASE_COLUMN_MESSAGE "Message" - /** * A struct contains one database row. */ -typedef struct SDatabaseRow +typedef struct database_row_t { std::string m_sUUID; /**< A local UUID.*/ std::string m_sUID; /**< An UID of an user.*/ @@ -83,23 +75,24 @@ class CDatabase : public CPlugin * @param pDebugDumpPath A debugdump path. * @param pTime Time when a crash occurs. */ - virtual void Insert(const std::string& pUUID, - const std::string& pUID, - const std::string& pDebugDumpPath, - const std::string& pTime) = 0; + virtual void Insert_or_Update(const char *pUUID, + const char *pUID, + const char *pDebugDumpPath, + const char *pTime) = 0; /** * A method, which deletes one row in a database. * @param pUUID A lodal UUID of a crash. * @param pUID An UID of an user. */ - virtual void Delete(const std::string& pUUID, + virtual void DeleteRow(const std::string& pUUID, const std::string& pUID) = 0; + virtual void DeleteRows_by_dir(const char *dump_dir) = 0; /** * A method, which sets that particular row was reported. * @param pUUID A local UUID of a crash. * @param pUID An UID of an user. - * @param pMessga A text explanation of reported problem (where - * it is stored etc... + * @param pMessage A text explanation of reported problem + * (where it is stored etc)... */ virtual void SetReported(const std::string& pUUID, const std::string& pUID, @@ -119,7 +112,7 @@ class CDatabase : public CPlugin * @param pUID An UID of an user. * @return A matched row. */ - virtual database_row_t GetUUIDData(const std::string& pUUID, + virtual database_row_t GetRow(const std::string& pUUID, const std::string& pUID) = 0; }; diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index b82823c5..d9c3cb11 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -62,7 +62,7 @@ vector_crash_infos_t GetCrashInfos(const char *pUID) const char *uuid = UUIDsUIDs[ii].first.c_str(); const char *uid = UUIDsUIDs[ii].second.c_str(); - res = GetCrashInfo(uuid, uid, info); + res = FillCrashInfo(uuid, uid, info); switch (res) { case MW_OK: @@ -70,12 +70,12 @@ vector_crash_infos_t GetCrashInfos(const char *pUID) break; case MW_ERROR: error_msg("Can't find dump directory for UUID %s, deleting from database", uuid); - DeleteCrashInfo(uuid, uid); + DeleteCrashInfoInDB(uuid, uid); break; case MW_FILE_ERROR: error_msg("Can't open file in dump directory for UUID %s, deleting", uuid); { - std::string debugDumpDir = DeleteCrashInfo(uuid, uid); + std::string debugDumpDir = DeleteCrashInfoInDB(uuid, uid); delete_debug_dump_dir(debugDumpDir.c_str()); } break; @@ -132,7 +132,7 @@ map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force) case MW_FILE_ERROR: default: error_msg("Corrupted crash with UUID %s, deleting", pUUID); - std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); + std::string debugDumpDir = DeleteCrashInfoInDB(pUUID, pUID); delete_debug_dump_dir(debugDumpDir.c_str()); break; } @@ -211,7 +211,7 @@ bool DeleteDebugDump(const char *pUUID, const char *pUID) { try { - std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); + std::string debugDumpDir = DeleteCrashInfoInDB(pUUID, pUID); delete_debug_dump_dir(debugDumpDir.c_str()); } catch (CABRTException& e) @@ -225,3 +225,22 @@ bool DeleteDebugDump(const char *pUUID, const char *pUID) } return true; } + +bool DeleteDebugDump_by_dir(const char *dump_dir) +{ + try + { + DeleteCrashInfosInDB_by_dir(dump_dir); + delete_debug_dump_dir(dump_dir); + } + catch (CABRTException& e) + { + if (e.type() == EXCEP_FATAL) + { + throw e; + } + error_msg("%s", e.what()); + return false; + } + return true; +} diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h index 995d2a12..00814183 100644 --- a/src/Daemon/CrashWatcher.h +++ b/src/Daemon/CrashWatcher.h @@ -52,5 +52,6 @@ vector_crash_infos_t GetCrashInfos(const char *pUID); int CreateReportThread(const char* pUUID, const char* pUID, int force, const char* pSender); map_crash_report_t GetJobResult(const char* pUUID, const char* pUID, int force); bool DeleteDebugDump(const char *pUUID, const char *pUID); +bool DeleteDebugDump_by_dir(const char *dump_dir); -#endif /*CRASHWATCHER_H_*/ +#endif diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index c2d22656..4cfd0491 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -474,7 +474,8 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition condition, gpoin ) { log("Size of '%s' >= %u MB, deleting '%s'", DEBUG_DUMPS_DIR, g_settings_nMaxCrashReportsSize, worst_dir.c_str()); g_pCommLayer->QuotaExceed(_("Report size exceeded the quota. Please check system's MaxCrashReportsSize value in abrt.conf.")); - delete_debug_dump_dir(concat_path_file(DEBUG_DUMPS_DIR, worst_dir.c_str()).c_str()); + /* deletes both directory and DB record */ + DeleteDebugDump_by_dir(concat_path_file(DEBUG_DUMPS_DIR, worst_dir.c_str()).c_str()); worst_dir = ""; } diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 94e27ae2..5f922e8d 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -247,7 +247,7 @@ mw_result_t CreateCrashReport(const char *pUUID, { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - row = database->GetUUIDData(pUUID, pUID); + row = database->GetRow(pUUID, pUID); database->DisConnect(); } if (pUUID[0] == '\0' || row.m_sUUID != pUUID) @@ -520,18 +520,26 @@ report_status_t Report(const map_crash_report_t& pCrashReport, return ret; } -std::string DeleteCrashInfo(const char *pUUID, - const char *pUID) +std::string DeleteCrashInfoInDB(const char *pUUID, + const char *pUID) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); - database->Delete(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); + database->DeleteRow(pUUID, pUID); database->DisConnect(); return row.m_sDebugDumpDir; } +void DeleteCrashInfosInDB_by_dir(const char *dump_dir) +{ + CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); + database->Connect(); + database->DeleteRows_by_dir(dump_dir); + database->DisConnect(); +} + /** * Check whether particular debugdump directory is saved * in database. This check is done together with an UID of an user. @@ -746,26 +754,31 @@ static void RunAnalyzerActions(const char *pAnalyzer, const char *pDebugDumpDir) * @return It return results of operation. See mw_result_t. */ static mw_result_t SaveDebugDumpToDatabase(const char *pUUID, - const char *pUID, - const char *pTime, - const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo) + const char *pUID, + const char *pTime, + const char *pDebugDumpDir, + map_crash_info_t& pCrashInfo) { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database->Insert(pUUID, pUID, pDebugDumpDir, pTime); - database_row_t row = database->GetUUIDData(pUUID, pUID); + /* note: if [UUID,UID] record exists, pDebugDumpDir is not updated in the record */ + database->Insert_or_Update(pUUID, pUID, pDebugDumpDir, pTime); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); - mw_result_t res = GetCrashInfo(pUUID, pUID, pCrashInfo); - if (row.m_sReported == "1") - { - log("Crash is already reported"); - return MW_REPORTED; - } - if (row.m_sCount != "1") + + mw_result_t res = FillCrashInfo(pUUID, pUID, pCrashInfo); + if (res == MW_OK) { - log("Crash is in database already"); - return MW_OCCURED; + if (row.m_sReported == "1") + { + log("Crash is already reported"); + return MW_REPORTED; + } + if (row.m_sCount != "1") + { + log("Crash is in database already"); + return MW_OCCURED; + } } return res; } @@ -775,13 +788,13 @@ std::string getDebugDumpDir(const char *pUUID, { CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); return row.m_sDebugDumpDir; } mw_result_t SaveDebugDump(const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo) + map_crash_info_t& pCrashInfo) { std::string UID; std::string time; @@ -823,14 +836,13 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, return SaveDebugDumpToDatabase(lUUID.c_str(), uid_str, time.c_str(), pDebugDumpDir, pCrashInfo); } -mw_result_t GetCrashInfo(const char *pUUID, +mw_result_t FillCrashInfo(const char *pUUID, const char *pUID, map_crash_info_t& pCrashInfo) { - pCrashInfo.clear(); CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str()); database->Connect(); - database_row_t row = database->GetUUIDData(pUUID, pUID); + database_row_t row = database->GetRow(pUUID, pUID); database->DisConnect(); std::string package; @@ -856,6 +868,7 @@ mw_result_t GetCrashInfo(const char *pUUID, return MW_ERROR; } + pCrashInfo.clear(); add_crash_data_to_crash_info(pCrashInfo, CD_EXECUTABLE, executable); add_crash_data_to_crash_info(pCrashInfo, CD_PACKAGE, package); add_crash_data_to_crash_info(pCrashInfo, CD_DESCRIPTION, description); diff --git a/src/Daemon/MiddleWare.h b/src/Daemon/MiddleWare.h index 3de287b3..44fa3b6b 100644 --- a/src/Daemon/MiddleWare.h +++ b/src/Daemon/MiddleWare.h @@ -112,8 +112,9 @@ std::string getDebugDumpDir( const char *pUUID, * @param pUID An UID of an user. * @return A debugdump directory. */ -std::string DeleteCrashInfo(const char *pUUID, - const char *pUID); +std::string DeleteCrashInfoInDB(const char *pUUID, + const char *pUID); +void DeleteCrashInfosInDB_by_dir(const char *dump_dir); /** * Saves debugdump into database. If saving is successful, * it fills crash info. @@ -122,7 +123,7 @@ std::string DeleteCrashInfo(const char *pUUID, * @return It return results of operation. See mw_result_t. */ mw_result_t SaveDebugDump(const char *pDebugDumpDir, - map_crash_info_t& pCrashInfo); + map_crash_info_t& pCrashInfo); /** * Get one crash info. If getting is successful, * then crash info is filled. @@ -131,9 +132,9 @@ mw_result_t SaveDebugDump(const char *pDebugDumpDir, * @param pCrashInfo A crash info. * @return It return results of operation. See mw_result_t. */ -mw_result_t GetCrashInfo(const char *pUUID, - const char *pUID, - map_crash_info_t& pCrashInfo); +mw_result_t FillCrashInfo(const char *pUUID, + const char *pUID, + map_crash_info_t& pCrashInfo); /** * Gets all local UUIDs and UIDs of crashes. These crashes * occurred when a particular user was logged in. |