From 61de706cf43afba9d637ef099644c58d0de492c9 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 3 Dec 2009 19:21:56 +0100 Subject: SQLite3: string& -> char*, -8k in code size Run tested Signed-off-by: Denys Vlasenko --- lib/Plugins/SQLite3.cpp | 344 +++++++++++++++++++++++++----------------------- lib/Plugins/SQLite3.h | 23 +--- lib/Utils/Database.h | 18 +-- lib/Utils/xfuncs.cpp | 45 +++---- 4 files changed, 215 insertions(+), 215 deletions(-) (limited to 'lib') 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) diff --git a/lib/Plugins/SQLite3.h b/lib/Plugins/SQLite3.h index 232e94ca..dfebf5d7 100644 --- a/lib/Plugins/SQLite3.h +++ b/lib/Plugins/SQLite3.h @@ -28,21 +28,12 @@ class CSQLite3 : public CDatabase { private: - std::string m_sDBPath; sqlite3* m_pDB; - bool OpenDB(); - bool CheckTable(); - void UpdateABRTTable(const int pOldVersion); - void CreateDB(); - void CreateTable(); - void Exec(const std::string& pCommand); - void GetTable(const std::string& pCommand, vector_database_rows_t& pTable); - bool Exist(const std::string& pUUID, const std::string& pUID); - public: CSQLite3(); + ~CSQLite3(); virtual void Connect(); virtual void DisConnect(); @@ -52,15 +43,13 @@ class CSQLite3 : public CDatabase const char *pDebugDumpPath, const char *pTime); - virtual void DeleteRow(const std::string& pUUID, const std::string& pUID); + virtual void DeleteRow(const char *pUUID, const char *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 GetRow(const std::string& pUUID, const std::string& pUID); + virtual void SetReported(const char *pUUID, const char *pUID, const char *pMessage); + virtual vector_database_rows_t GetUIDData(const char *pUID); + virtual database_row_t GetRow(const char *pUUID, const char *pUID); virtual void SetSettings(const map_plugin_settings_t& pSettings); -//ok to delete? -// virtual const map_plugin_settings_t& GetSettings(); }; -#endif /* SQLITE3_H_ */ +#endif diff --git a/lib/Utils/Database.h b/lib/Utils/Database.h index c7a95bac..1691f1ce 100644 --- a/lib/Utils/Database.h +++ b/lib/Utils/Database.h @@ -84,8 +84,8 @@ class CDatabase : public CPlugin * @param pUUID A lodal UUID of a crash. * @param pUID An UID of an user. */ - virtual void DeleteRow(const std::string& pUUID, - const std::string& pUID) = 0; + virtual void DeleteRow(const char *pUUID, + const char *pUID) = 0; virtual void DeleteRows_by_dir(const char *dump_dir) = 0; /** * A method, which sets that particular row was reported. @@ -94,9 +94,9 @@ class CDatabase : public CPlugin * @param pMessage A text explanation of reported problem * (where it is stored etc)... */ - virtual void SetReported(const std::string& pUUID, - const std::string& pUID, - const std::string& pMessage) = 0; + virtual void SetReported(const char *pUUID, + const char *pUID, + const char *pMessage) = 0; /** * A method, which gets all rows which belongs to particular user. * If the user is root, then all rows are returned. If there are no @@ -104,7 +104,7 @@ class CDatabase : public CPlugin * @param pUID An UID of an user. * @return A vector of matched rows. */ - virtual vector_database_rows_t GetUIDData(const std::string& pUID) = 0; + virtual vector_database_rows_t GetUIDData(const char *pUID) = 0; /** * A method, which returns one row accordind to UUID of a crash and * UID of an user. If there are no row, empty row is returned. @@ -112,8 +112,8 @@ class CDatabase : public CPlugin * @param pUID An UID of an user. * @return A matched row. */ - virtual database_row_t GetRow(const std::string& pUUID, - const std::string& pUID) = 0; + virtual database_row_t GetRow(const char *pUUID, + const char *pUID) = 0; }; -#endif /* DATABASE_H_ */ +#endif diff --git a/lib/Utils/xfuncs.cpp b/lib/Utils/xfuncs.cpp index 583171f7..b1941f7f 100644 --- a/lib/Utils/xfuncs.cpp +++ b/lib/Utils/xfuncs.cpp @@ -141,28 +141,22 @@ off_t xlseek(int fd, off_t offset, int whence) return off; } -// Die with an error message if we can't malloc() enough space and do an -// sprintf() into that space. -char* xasprintf(const char *format, ...) +char* xvasprintf(const char *format, va_list p) { - va_list p; int r; char *string_ptr; #if 1 // GNU extension - va_start(p, format); r = vasprintf(&string_ptr, format, p); - va_end(p); #else // Bloat for systems that haven't got the GNU extension. - va_start(p, format); + va_list p2; r = vsnprintf(NULL, 0, format, p); - va_end(p); + va_copy(p2, p); string_ptr = xmalloc(r+1); - va_start(p, format); - r = vsnprintf(string_ptr, r+1, format, p); - va_end(p); + r = vsnprintf(string_ptr, r+1, format, p2); + va_end(p2); #endif if (r < 0) @@ -170,30 +164,29 @@ char* xasprintf(const char *format, ...) return string_ptr; } -std::string ssprintf(const char *format, ...) +// Die with an error message if we can't malloc() enough space and do an +// sprintf() into that space. +char* xasprintf(const char *format, ...) { va_list p; - int r; char *string_ptr; -#if 1 - // GNU extension - va_start(p, format); - r = vasprintf(&string_ptr, format, p); - va_end(p); -#else - // Bloat for systems that haven't got the GNU extension. va_start(p, format); - r = vsnprintf(NULL, 0, format, p); + string_ptr = xvasprintf(format, p); va_end(p); - string_ptr = xmalloc(r+1); + + return string_ptr; +} + +std::string ssprintf(const char *format, ...) +{ + va_list p; + char *string_ptr; + va_start(p, format); - r = vsnprintf(string_ptr, r+1, format, p); + string_ptr = xvasprintf(format, p); va_end(p); -#endif - if (r < 0) - die_out_of_memory(); std::string res = string_ptr; free(string_ptr); return res; -- cgit