summaryrefslogtreecommitdiffstats
path: root/lib/Plugins
diff options
context:
space:
mode:
authorZdenek Prikryl <zprikryl@redhat.com>2009-08-24 18:41:19 +0200
committerZdenek Prikryl <zprikryl@redhat.com>2009-08-24 18:41:19 +0200
commit057aefaf2625ca1976a3863b4647324303664a94 (patch)
tree406766ee2dc10b709c18f497cdfbdfcd0685b1f6 /lib/Plugins
parent7782c9b438aeb1b5b5bbc797b4eea6171a4d8d49 (diff)
downloadabrt-057aefaf2625ca1976a3863b4647324303664a94.tar.gz
abrt-057aefaf2625ca1976a3863b4647324303664a94.tar.xz
abrt-057aefaf2625ca1976a3863b4647324303664a94.zip
added support for updating abrt's table
Diffstat (limited to 'lib/Plugins')
-rw-r--r--lib/Plugins/SQLite3.cpp95
-rw-r--r--lib/Plugins/SQLite3.h1
2 files changed, 90 insertions, 6 deletions
diff --git a/lib/Plugins/SQLite3.cpp b/lib/Plugins/SQLite3.cpp
index 49f4448a..7ddd43fd 100644
--- a/lib/Plugins/SQLite3.cpp
+++ b/lib/Plugins/SQLite3.cpp
@@ -25,15 +25,52 @@
#include <string>
#include <iostream>
#include "ABRTException.h"
+#include <stdlib.h>
-#define ABRT_TABLE "abrt"
+
+#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"
+
+static const char* upate_sql_commands[][ABRT_TABLE_VERSION + 1] = {
+ // v0 -> *
+ {
+ // v0 -> v0
+ ";",
+ // v0 -> v1
+ "ALTER TABLE abrt ADD "DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '';",
+ // v0 -> v2
+ "ALTER TABLE abrt RENAME TO abrt_v2;"
+ "ALTER TABLE abrt_v2 ADD "DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '';",
+
+ },
+ //v1 -> *
+ {
+ // v1 -> v0
+ // TODO: does it make sense to support downgrade?
+ ";",
+ // v1 -> v1
+ ";",
+ // v1 -> v2
+ "ALTER TABLE abrt RENAME TO abrt_v2;",
+ },
+};
+
+
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 std::string& pUUID, const std::string& pUID)
{
vector_database_rows_t table;
@@ -87,9 +124,9 @@ void CSQLite3::GetTable(const std::string& pCommand, vector_database_rows_t& pTa
break;
case 4: row.m_sReported = table[jj +(ncol*ii) + ncol];
break;
- case 5: row.m_sMessage = table[jj +(ncol*ii) + ncol];
+ case 5: row.m_sTime = table[jj +(ncol*ii) + ncol];
break;
- case 6: row.m_sTime = table[jj +(ncol*ii) + ncol];
+ case 6: row.m_sMessage = table[jj +(ncol*ii) + ncol];
break;
default:
break;
@@ -140,6 +177,52 @@ void CSQLite3::CreateDB()
}
}
+
+bool CSQLite3::CheckTable()
+{
+ std::string 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);
+ if (ret != SQLITE_OK)
+ {
+ throw CABRTException(EXCEP_PLUGIN, "SQLite3::GetTable(): Error on: " + command + " " + err);
+ }
+ if (!nrow || !nrow)
+ {
+ return false;
+ }
+
+ std::string tableName = table[0 + ncol];
+ std::string::size_type pos = tableName.find("_");
+ if (pos != std::string::npos)
+ {
+ std::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
+ else
+ {
+ // 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);
+ return true;
+ }
+
+ return true;
+}
+/*
bool CSQLite3::CheckTable()
{
vector_database_rows_t table;
@@ -148,7 +231,7 @@ bool CSQLite3::CheckTable()
return table.size() == 1;
}
-
+*/
void CSQLite3::CreateTable()
{
Exec("CREATE TABLE "ABRT_TABLE" ("
@@ -157,8 +240,8 @@ void CSQLite3::CreateTable()
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_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
DATABASE_COLUMN_TIME" VARCHAR NOT NULL DEFAULT 0,"
+ DATABASE_COLUMN_MESSAGE" VARCHAR NOT NULL DEFAULT '',"
"PRIMARY KEY ("DATABASE_COLUMN_UUID","DATABASE_COLUMN_UID"));");
}
@@ -295,7 +378,7 @@ map_plugin_settings_t CSQLite3::GetSettings()
PLUGIN_INFO(DATABASE,
CSQLite3,
"SQLite3",
- "0.0.1",
+ "0.0.2",
"SQLite3 database plugin.",
"zprikryl@redhat.com,jmoskovc@redhat.com",
"https://fedorahosted.org/abrt/wiki",
diff --git a/lib/Plugins/SQLite3.h b/lib/Plugins/SQLite3.h
index 0b8e22a5..1604d3be 100644
--- a/lib/Plugins/SQLite3.h
+++ b/lib/Plugins/SQLite3.h
@@ -35,6 +35,7 @@ class CSQLite3 : public CDatabase
bool OpenDB();
bool CheckTable();
+ void UpdateABRTTable(const int pOldVersion);
void CreateDB();
void CreateTable();
void Exec(const std::string& pCommand);