summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-12-03 19:21:56 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2009-12-03 19:21:56 +0100
commit61de706cf43afba9d637ef099644c58d0de492c9 (patch)
treed88a12884f2c9df403ed8ef630c4a515c71851e5
parent51f279ca689ea79a873d1f80b000fd3f163b3087 (diff)
downloadabrt-61de706cf43afba9d637ef099644c58d0de492c9.tar.gz
abrt-61de706cf43afba9d637ef099644c58d0de492c9.tar.xz
abrt-61de706cf43afba9d637ef099644c58d0de492c9.zip
SQLite3: string& -> char*, -8k in code size
Run tested Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--inc/abrtlib.h1
-rw-r--r--lib/Plugins/SQLite3.cpp344
-rw-r--r--lib/Plugins/SQLite3.h23
-rw-r--r--lib/Utils/Database.h18
-rw-r--r--lib/Utils/xfuncs.cpp45
-rw-r--r--src/Daemon/MiddleWare.cpp2
6 files changed, 217 insertions, 216 deletions
diff --git a/inc/abrtlib.h b/inc/abrtlib.h
index 813450e9..7f746280 100644
--- a/inc/abrtlib.h
+++ b/inc/abrtlib.h
@@ -139,6 +139,7 @@ int ndelay_on(int fd);
int ndelay_off(int fd);
int close_on_exec_on(int fd);
char* xasprintf(const char *format, ...);
+char* xvasprintf(const char *format, va_list p);
int xopen(const char *pathname, int flags);
int xopen3(const char *pathname, int flags, int mode);
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;
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index 5f922e8d..676f168a 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -514,7 +514,7 @@ report_status_t Report(const map_crash_report_t& pCrashReport,
CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase.c_str());
database->Connect();
- database->SetReported(UUID, UID, message);
+ database->SetReported(UUID.c_str(), UID.c_str(), message.c_str());
database->DisConnect();
return ret;