summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2010-09-07 18:12:17 +0200
committerNikola Pajkovsky <npajkovs@redhat.com>2010-09-08 15:53:29 +0200
commita0b7850b3ac3a89e2bb02a214039c777d244ef22 (patch)
tree406d4cddd94e4d6ec6d282907fc6bc3bf3c97a4d
parent890e78b99a136533fa5bab788ce0f6b9a9f2b47c (diff)
downloadabrt-a0b7850b3ac3a89e2bb02a214039c777d244ef22.tar.gz
abrt-a0b7850b3ac3a89e2bb02a214039c777d244ef22.tar.xz
abrt-a0b7850b3ac3a89e2bb02a214039c777d244ef22.zip
SQLite3.cpp: replace std::vector by GList
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com> Acked-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--configure.ac2
-rw-r--r--inc/abrtlib.h3
-rw-r--r--inc/database.h51
-rw-r--r--lib/plugins/Makefile.am4
-rw-r--r--lib/plugins/SQLite3.cpp127
-rw-r--r--lib/plugins/SQLite3.h5
-rw-r--r--lib/utils/Makefile.am3
-rw-r--r--lib/utils/database.c52
-rw-r--r--src/daemon/CrashWatcher.cpp20
-rw-r--r--src/daemon/MiddleWare.cpp93
10 files changed, 242 insertions, 118 deletions
diff --git a/configure.ac b/configure.ac
index cd21bab6..37363999 100644
--- a/configure.ac
+++ b/configure.ac
@@ -16,7 +16,7 @@ AC_SYS_LARGEFILE
CXXFLAGS="$CXXFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE \
-D_FILE_OFFSET_BITS=64 -fno-strict-aliasing "
CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE \
- -D_FILE_OFFSET_BITS=64 -fno-strict-aliasing "
+ -D_FILE_OFFSET_BITS=64 -fno-strict-aliasing -std=gnu99 -Wall"
AC_CHECK_PROGS(YACC, 'bison -y', [no])
[if test "$YACC" = "no"]
diff --git a/inc/abrtlib.h b/inc/abrtlib.h
index 2fc51012..a1ad9c3d 100644
--- a/inc/abrtlib.h
+++ b/inc/abrtlib.h
@@ -64,6 +64,9 @@ int vdprintf(int d, const char *format, va_list ap);
#undef NORETURN
#define NORETURN __attribute__ ((noreturn))
+#undef ERR_PTR
+#define ERR_PTR ((void*)(uintptr_t)1)
+
#undef ARRAY_SIZE
#define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0])))
diff --git a/inc/database.h b/inc/database.h
index df109bde..5d5bcf04 100644
--- a/inc/database.h
+++ b/inc/database.h
@@ -21,9 +21,7 @@
#ifndef DATABASE_H_
#define DATABASE_H_
-#include <string>
-#include <vector>
-#include "plugin.h"
+#include <glib.h>
/**
* Table
@@ -33,25 +31,39 @@
* primary key (UUID, UID)
*/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/**
* A struct contains one database row.
*/
-typedef struct database_row_t
+struct db_row
{
- std::string m_sUUID; /**< A local UUID.*/
- std::string m_sUID; /**< An UID of an user.*/
- std::string m_sInformAll;
- std::string m_sDebugDumpDir; /**< A debugdump directory of a crash.*/
- std::string m_sCount; /**< Crash rate.*/
- std::string m_sReported; /**< Is a row reported?*/
- std::string m_sMessage; /**< if a row is reported, then there can be store message abotu that*/
- std::string m_sTime; /**< Time of last occurred crash with same local UUID*/
-} database_row_t;
+ char *db_uuid; /**< A local UUID.*/
+ char *db_uid; /**< An UID of an user.*/
+ char *db_inform_all;
+ char *db_dump_dir; /**< A debugdump directory of a crash.*/
+ char *db_count; /**< Crash rate.*/
+ char *db_reported; /**< Is a row reported?*/
+ char *db_message; /**< if a row is reported, then there can be store message abotu that*/
+ char *db_time; /**< Time of last occurred crash with same local UUID*/
+};
-/**
- * A vector contains one or more database rows.
- */
-typedef std::vector<database_row_t> vector_database_rows_t;
+void db_row_free(struct db_row *row);
+
+void db_list_free(GList *list);
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+
+#include <string>
+#include <vector>
+
+#include "plugin.h"
/**
* An abstract class. The class defines a database plugin interface.
@@ -104,7 +116,7 @@ class CDatabase : public CPlugin
* @param pUID An UID of an user.
* @return A vector of matched rows.
*/
- virtual vector_database_rows_t GetUIDData(long caller_uid) = 0;
+ virtual GList *GetUIDData(long caller_uid) = 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,7 +124,8 @@ class CDatabase : public CPlugin
* @param pUID An UID of an user.
* @return A matched row.
*/
- virtual database_row_t GetRow(const char *crash_id) = 0;
+ virtual struct db_row *GetRow(const char *crash_id) = 0;
};
+#endif
#endif
diff --git a/lib/plugins/Makefile.am b/lib/plugins/Makefile.am
index a896e144..ca874e1b 100644
--- a/lib/plugins/Makefile.am
+++ b/lib/plugins/Makefile.am
@@ -98,8 +98,8 @@ libMailx_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DPLUGINS_LIB_DIR=\"$(PLUGI
# SQLite3
libSQLite3_la_SOURCES = SQLite3.cpp SQLite3.h
libSQLite3_la_LDFLAGS = -avoid-version
-libSQLite3_la_LIBADD = $(SQLITE3_LIBS)
-libSQLite3_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(SQLITE3_CFLAGS) -DLOCALSTATEDIR='"$(localstatedir)"'
+libSQLite3_la_LIBADD = $(SQLITE3_LIBS) $(GLIB_LIBS)
+libSQLite3_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(SQLITE3_CFLAGS) -DLOCALSTATEDIR='"$(localstatedir)"' $(GLIB_CFLAGS)
# Logger
libLogger_la_SOURCES = Logger.cpp Logger.h
diff --git a/lib/plugins/SQLite3.cpp b/lib/plugins/SQLite3.cpp
index 322f15a1..040314fe 100644
--- a/lib/plugins/SQLite3.cpp
+++ b/lib/plugins/SQLite3.cpp
@@ -42,6 +42,8 @@ using namespace std;
#define COL_REPORTER "Reporter"
+#define NUM_COL 8
+
/* Is this string safe wrt SQL injection?
* PHP's mysql_real_escape_string() treats \, ', ", \x00, \n, \r, and \x1a as special.
* We are a bit more paranoid and disallow any control chars.
@@ -103,13 +105,9 @@ static string sql_escape(const char *str)
/* Note:
* expects "SELECT * FROM ...", not "SELECT <only some fields> FROM ..."
*/
-static void get_table(vector_database_rows_t& pTable,
- sqlite3 *db, const char *fmt, ...)
+static GList *vget_table(sqlite3 *db, const char *fmt, va_list p)
{
- va_list p;
- va_start(p, fmt);
char *sql = xvasprintf(fmt, p);
- va_end(p);
char **table;
int ncol, nrow;
@@ -117,39 +115,57 @@ static void get_table(vector_database_rows_t& pTable,
int ret = sqlite3_get_table(db, sql, &table, &nrow, &ncol, &err);
if (ret != SQLITE_OK)
{
- string errstr = ssprintf("Error in SQL:'%s' error: %s", sql, err);
+ error_msg("Error in SQL:'%s' error: %s", sql, err);
free(sql);
sqlite3_free(err);
- throw CABRTException(EXCEP_PLUGIN, errstr.c_str());
+ return (GList*)ERR_PTR;
}
- VERB2 log("%d rows returned by SQL:%s", nrow, sql);
+ VERB2 log("%s: %d rows returned by SQL:%s", __func__, nrow, sql);
free(sql);
- pTable.clear();
+ if (ncol < NUM_COL)
+ error_msg_and_die("Unexpected number of columns: %d", ncol);
+
+ GList *rows = NULL;
int ii;
for (ii = 0; ii < nrow; ii++)
{
int jj;
- database_row_t row;
+ struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row));
for (jj = 0; jj < ncol; jj++)
{
char *val = table[jj + (ncol*ii) + ncol];
switch (jj)
{
- case 0: row.m_sUUID = val; break;
- case 1: row.m_sUID = val; break;
- case 2: row.m_sInformAll = val; break;
- case 3: row.m_sDebugDumpDir = val; break;
- case 4: row.m_sCount = val; break;
- case 5: row.m_sReported = val; break;
- case 6: row.m_sTime = val; break;
- case 7: row.m_sMessage = val; break;
+ case 0: row->db_uuid = xstrdup(val); break;
+ case 1: row->db_uid = xstrdup(val); break;
+ case 2: row->db_inform_all = xstrdup(val); break;
+ case 3: row->db_dump_dir = xstrdup(val); break;
+ case 4: row->db_count = xstrdup(val); break;
+ case 5: row->db_reported = xstrdup(val); break;
+ case 6: row->db_time = xstrdup(val); break;
+ case 7: row->db_message = xstrdup(val); break;
}
}
- pTable.push_back(row);
+ rows = g_list_append(rows, row);
}
sqlite3_free_table(table);
+
+ return rows;
+}
+
+static GList *get_table_or_die(sqlite3 *db, const char *fmt, ...)
+{
+ va_list p;
+ va_start(p, fmt);
+ GList *table = vget_table(db, fmt, p);
+ va_end(p);
+
+ if (table == (GList*)ERR_PTR)
+ xfunc_die();
+
+ return table;
}
static int execute_sql(sqlite3 *db, const char *fmt, ...)
@@ -177,13 +193,17 @@ static int execute_sql(sqlite3 *db, const char *fmt, ...)
static bool exists_uuid_uid(sqlite3 *db, const char *UUID, const char *UID)
{
- vector_database_rows_t table;
- get_table(table, db,
- "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
+ GList *table = get_table_or_die(db, "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
- return !table.empty();
+
+ if (!table)
+ return false;
+
+ db_list_free(table);
+
+ return true;
}
static void update_from_old_ver(sqlite3 *db, int old_version)
@@ -496,27 +516,26 @@ void CSQLite3::DeleteRows_by_dir(const char *dump_dir)
}
/* Get UID:UUID pair(s) to delete */
- vector_database_rows_t table;
- get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_DEBUG_DUMP_PATH"='%s';",
- dump_dir
+ GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_DEBUG_DUMP_PATH"='%s';",
+ dump_dir
);
- if (table.empty())
+
+ if (!table)
{
return;
}
+ struct db_row *row = NULL;
/* Delete from both tables */
- vector_database_rows_t::iterator it = table.begin();
- while (it != table.end())
+ for (GList *li = table; li != NULL; li = g_list_next(li))
{
+ row = (struct db_row*)li->data;
execute_sql(m_pDB,
"DELETE FROM "ABRT_REPRESULT_TABLE
" WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- it->m_sUUID.c_str(), it->m_sUID.c_str()
+ row->db_uuid, row->db_uid
);
- it++;
}
execute_sql(m_pDB,
"DELETE FROM "ABRT_TABLE
@@ -601,32 +620,31 @@ void CSQLite3::SetReportedPerReporter(const char *crash_id,
}
}
-vector_database_rows_t CSQLite3::GetUIDData(long caller_uid)
+GList *CSQLite3::GetUIDData(long caller_uid)
{
- vector_database_rows_t table;
+ GList *table = NULL;
if (caller_uid == 0)
{
- get_table(table, m_pDB, "SELECT * FROM "ABRT_TABLE";");
+ table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE";");
}
else
{
- get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UID"='%ld' OR "COL_INFORMALL"=1;",
- caller_uid
+ table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_UID"='%ld' OR "COL_INFORMALL"=1;",
+ caller_uid
);
}
return table;
}
-database_row_t CSQLite3::GetRow(const char *crash_id)
+struct db_row *CSQLite3::GetRow(const char *crash_id)
{
const char *UUID = strchr(crash_id, ':');
if (!UUID
|| !is_string_safe(crash_id)
) {
- return database_row_t();
+ return NULL;
}
/* Split crash_id into UID:UUID */
@@ -636,18 +654,23 @@ database_row_t CSQLite3::GetRow(const char *crash_id)
strncpy(UID, crash_id, uid_len);
UID[uid_len] = '\0';
- vector_database_rows_t table;
- get_table(table, m_pDB,
- "SELECT * FROM "ABRT_TABLE
- " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
- UUID, UID
+ GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE
+ " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';",
+ UUID, UID
);
- if (table.size() == 0)
+ if (!table)
{
- return database_row_t();
+ return NULL;
}
- return table[0];
+
+ GList *first = g_list_first(table);
+ struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row));
+ memcpy(row, first->data, sizeof(struct db_row));
+
+ db_list_free(table);
+
+ return row;
}
void CSQLite3::SetSettings(const map_plugin_settings_t& pSettings)
diff --git a/lib/plugins/SQLite3.h b/lib/plugins/SQLite3.h
index d2af864c..3dfd0a9d 100644
--- a/lib/plugins/SQLite3.h
+++ b/lib/plugins/SQLite3.h
@@ -47,10 +47,11 @@ class CSQLite3 : public CDatabase
virtual void SetReportedPerReporter(const char *crash_id,
const char *reporter,
const char *pMessage);
- virtual vector_database_rows_t GetUIDData(long caller_uid);
- virtual database_row_t GetRow(const char *crash_id);
+ virtual GList *GetUIDData(long caller_uid);
+ virtual struct db_row *GetRow(const char *crash_id);
virtual void SetSettings(const map_plugin_settings_t& pSettings);
};
+
#endif
diff --git a/lib/utils/Makefile.am b/lib/utils/Makefile.am
index cc77c823..15fd03e1 100644
--- a/lib/utils/Makefile.am
+++ b/lib/utils/Makefile.am
@@ -31,7 +31,8 @@ libABRTUtils_la_SOURCES = \
backtrace_parser.y \
strbuf.c strbuf.h \
abrt_packages.c abrt_packages.h \
- hooklib.c hooklib.h
+ hooklib.c hooklib.h \
+ database.c
libABRTUtils_la_CPPFLAGS = \
-Wall -Werror \
-I$(srcdir)/../../inc \
diff --git a/lib/utils/database.c b/lib/utils/database.c
new file mode 100644
index 00000000..f572a5ba
--- /dev/null
+++ b/lib/utils/database.c
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2010 ABRT team
+ Copyright (C) 2010 RedHat Inc
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "abrtlib.h"
+#include "database.h"
+
+void db_row_free(struct db_row *row)
+{
+ if (!row)
+ return;
+
+ free(row->db_uuid);
+ free(row->db_uid);
+ free(row->db_inform_all);
+ free(row->db_dump_dir);
+ free(row->db_count);
+ free(row->db_reported);
+ free(row->db_message);
+ free(row->db_time);
+
+ free(row);
+}
+
+void db_list_free(GList *list)
+{
+ if (!list)
+ return;
+
+ for (GList *li = list; li != NULL; li = g_list_next(li))
+ {
+ struct db_row *row = (struct db_row*)li->data;
+ db_row_free(row);
+ }
+ g_list_free(list);
+}
+
diff --git a/src/daemon/CrashWatcher.cpp b/src/daemon/CrashWatcher.cpp
index 63101185..416d5f41 100644
--- a/src/daemon/CrashWatcher.cpp
+++ b/src/daemon/CrashWatcher.cpp
@@ -188,27 +188,33 @@ int DeleteDebugDump(const char *crash_id, long caller_uid)
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database_row_t row = database->GetRow(crash_id);
- if (row.m_sUUID == "")
+ struct db_row *row = database->GetRow(crash_id);
+ if (!row)
{
database->DisConnect();
return ENOENT;
}
+
+ char caller_uid_str[sizeof(long) * 3 + 2];
+ sprintf(caller_uid_str, "%li", caller_uid);
+
if (caller_uid != 0 /* not called by root */
- && row.m_sInformAll != "1"
- && to_string(caller_uid) != row.m_sUID
+ && row->db_inform_all[0] != '1'
+ && strcmp(caller_uid_str, row->db_uid) != 0
) {
database->DisConnect();
+ db_row_free(row);
return EPERM;
}
database->DeleteRow(crash_id);
database->DisConnect();
- const char *dump_dir = row.m_sDebugDumpDir.c_str();
- if (dump_dir[0] != '\0')
+ if (row->db_dump_dir[0] != '\0')
{
- delete_debug_dump_dir(dump_dir);
+ delete_debug_dump_dir(row->db_dump_dir);
+ db_row_free(row);
return 0; /* success */
}
+ db_row_free(row);
}
catch (CABRTException& e)
{
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index 7752dc36..9f0f815b 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -278,21 +278,26 @@ mw_result_t CreateCrashReport(const char *crash_id,
{
VERB2 log("CreateCrashReport('%s',%ld,result)", crash_id, caller_uid);
- database_row_t row;
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- row = database->GetRow(crash_id);
+
+ struct db_row *row = database->GetRow(crash_id);
database->DisConnect();
- if (row.m_sUUID == "")
+ if (!row)
{
error_msg("crash '%s' is not in database", crash_id);
return MW_IN_DB_ERROR;
}
+
+ char caller_uid_str[sizeof(long) * 3 + 2];
+ sprintf(caller_uid_str, "%li", caller_uid);
+
if (caller_uid != 0 /* not called by root */
- && row.m_sInformAll != "1"
- && to_string(caller_uid) != row.m_sUID
+ && row->db_inform_all[0] != '1'
+ && strcmp(caller_uid_str, row->db_uid) != 0
) {
error_msg("crash '%s' can't be accessed by user with uid %ld", crash_id, caller_uid);
+ db_row_free(row);
return MW_IN_DB_ERROR;
}
@@ -300,9 +305,10 @@ mw_result_t CreateCrashReport(const char *crash_id,
try
{
dump_dir_t *dd = dd_init();
- if (!dd_opendir(dd, row.m_sDebugDumpDir.c_str()))
+ if (!dd_opendir(dd, row->db_dump_dir))
{
dd_close(dd);
+ db_row_free(row);
return MW_ERROR;
}
@@ -319,24 +325,26 @@ mw_result_t CreateCrashReport(const char *crash_id,
// Why do we reload dump dir's data via DebugDumpToCrashReport?
VERB3 log(" run_analyser_CreateReport('%s')", analyzer.c_str());
- run_analyser_CreateReport(analyzer.c_str(), row.m_sDebugDumpDir.c_str(), force);
+ run_analyser_CreateReport(analyzer.c_str(), row->db_dump_dir, force);
- std::string dup_hash = GetGlobalUUID(analyzer.c_str(), row.m_sDebugDumpDir.c_str());
+ std::string dup_hash = GetGlobalUUID(analyzer.c_str(), row->db_dump_dir);
VERB3 log(" DUPHASH:'%s'", dup_hash.c_str());
- VERB3 log(" RunAnalyzerActions('%s','%s','%s',force=%d)", analyzer.c_str(), package_name, row.m_sDebugDumpDir.c_str(), force);
- RunAnalyzerActions(analyzer.c_str(), package_name, row.m_sDebugDumpDir.c_str(), force);
+ VERB3 log(" RunAnalyzerActions('%s','%s','%s',force=%d)", analyzer.c_str(), package_name, row->db_dump_dir, force);
+ RunAnalyzerActions(analyzer.c_str(), package_name, row->db_dump_dir, force);
free(package_name);
- if (DebugDumpToCrashReport(row.m_sDebugDumpDir.c_str(), pCrashData))
+ if (DebugDumpToCrashReport(row->db_dump_dir, pCrashData))
{
- add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, row.m_sUUID.c_str());
+ add_to_crash_data_ext(pCrashData, CD_UUID , CD_SYS, CD_ISNOTEDITABLE, row->db_uuid);
add_to_crash_data_ext(pCrashData, CD_DUPHASH, CD_TXT, CD_ISNOTEDITABLE, dup_hash.c_str());
}
else
{
+ db_row_free(row);
error_msg("Error loading crash data");
return MW_ERROR;
}
+ db_row_free(row);
}
catch (CABRTException& e)
{
@@ -611,20 +619,23 @@ static bool is_debug_dump_saved(long uid, const char *debug_dump_dir)
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- vector_database_rows_t rows = database->GetUIDData(uid);
+ GList *table = database->GetUIDData(uid);
database->DisConnect();
- size_t ii;
bool found = false;
- for (ii = 0; ii < rows.size(); ii++)
+ struct db_row *row = NULL;
+ for (GList *li = table; li != NULL; li = g_list_next(li))
{
- if (0 == strcmp(rows[ii].m_sDebugDumpDir.c_str(), debug_dump_dir))
+ row = (struct db_row*)li->data;
+ if (0 == strcmp(row->db_dump_dir, debug_dump_dir))
{
found = true;
break;
}
}
+ db_list_free(table);
+
return found;
}
@@ -1012,24 +1023,28 @@ static mw_result_t SaveDebugDumpToDatabase(const char *crash_id,
database->Connect();
/* note: if [UUID,UID] record exists, pDebugDumpDir is not updated in the record */
database->Insert_or_Update(crash_id, inform_all_users, pDebugDumpDir, pTime);
- database_row_t row = database->GetRow(crash_id);
+
+ struct db_row *row = database->GetRow(crash_id);
database->DisConnect();
mw_result_t res = FillCrashInfo(crash_id, pCrashData);
if (res == MW_OK)
{
const char *first = get_crash_data_item_content(pCrashData, CD_DUMPDIR).c_str();
- if (row.m_sReported == "1")
+ if (row && row->db_reported[0] == '1')
{
log("Crash is in database already (dup of %s) and is reported", first);
+ db_row_free(row);
return MW_REPORTED;
}
- if (row.m_sCount != "1")
+ if (row && xatou(row->db_count) > 1)
{
+ db_row_free(row);
log("Crash is in database already (dup of %s)", first);
return MW_OCCURRED;
}
}
+ db_row_free(row);
return res;
}
@@ -1122,7 +1137,11 @@ mw_result_t FillCrashInfo(const char *crash_id,
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database_row_t row = database->GetRow(crash_id);
+
+ struct db_row *row = database->GetRow(crash_id);
+ if (!row)
+ return MW_ERROR;
+
database->DisConnect();
std::string package;
@@ -1131,23 +1150,26 @@ mw_result_t FillCrashInfo(const char *crash_id,
std::string analyzer;
dump_dir_t *dd = dd_init();
- if (!dd_opendir(dd, row.m_sDebugDumpDir.c_str()))
+ if (!dd_opendir(dd, row->db_dump_dir))
{
dd_close(dd);
+ db_row_free(row);
return MW_ERROR;
}
load_crash_data_from_debug_dump(dd, pCrashData);
dd_close(dd);
- add_to_crash_data(pCrashData, CD_UID , row.m_sUID.c_str() );
- add_to_crash_data(pCrashData, CD_UUID , row.m_sUUID.c_str() );
- add_to_crash_data(pCrashData, CD_INFORMALL , row.m_sInformAll.c_str() );
- add_to_crash_data(pCrashData, CD_COUNT , row.m_sCount.c_str() );
- add_to_crash_data(pCrashData, CD_REPORTED , row.m_sReported.c_str() );
- add_to_crash_data(pCrashData, CD_MESSAGE , row.m_sMessage.c_str() );
- add_to_crash_data(pCrashData, CD_DUMPDIR , row.m_sDebugDumpDir.c_str());
- add_to_crash_data(pCrashData, FILENAME_TIME , row.m_sTime.c_str() );
+ add_to_crash_data(pCrashData, CD_UID , row->db_uid );
+ add_to_crash_data(pCrashData, CD_UUID , row->db_uuid );
+ add_to_crash_data(pCrashData, CD_INFORMALL , row->db_inform_all );
+ add_to_crash_data(pCrashData, CD_COUNT , row->db_count );
+ add_to_crash_data(pCrashData, CD_REPORTED , row->db_reported );
+ add_to_crash_data(pCrashData, CD_MESSAGE , row->db_message );
+ add_to_crash_data(pCrashData, CD_DUMPDIR , row->db_dump_dir );
+ add_to_crash_data(pCrashData, FILENAME_TIME , row->db_time );
+
+ db_row_free(row);
return MW_OK;
}
@@ -1155,17 +1177,20 @@ mw_result_t FillCrashInfo(const char *crash_id,
void GetUUIDsOfCrash(long caller_uid, vector_string_t &result)
{
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
- vector_database_rows_t rows;
database->Connect();
- rows = database->GetUIDData(caller_uid);
+ GList *rows = database->GetUIDData(caller_uid);
database->DisConnect();
- unsigned ii;
- for (ii = 0; ii < rows.size(); ii++)
+ struct db_row *row = NULL;
+ for (GList *li = rows; li != NULL; li = g_list_next(li))
{
- string crash_id = ssprintf("%s:%s", rows[ii].m_sUID.c_str(), rows[ii].m_sUUID.c_str());
+ row = (struct db_row*)li->data;
+ string crash_id = ssprintf("%s:%s", row->db_uid, row->db_uuid);
result.push_back(crash_id);
}
+
+ // TODO: return GList
+ db_list_free(rows);
}
void AddAnalyzerActionOrReporter(const char *pAnalyzer,