]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
ras-daemon: make sqlite3 code optional
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 8 May 2013 11:33:05 +0000 (08:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 8 May 2013 11:35:41 +0000 (08:35 -0300)
The sqlite3 code is experimental and currently having some issues
with multi-threading. Convert it into an optional feature that
it is only explicitly enabled.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Makefile.am
configure.ac
ras-events.h
ras-record.c
ras-record.h
rasdaemon.c

index eea60e937e8b17c047bb365876828420a6c0b248..2d75fbf63efeb8fb491e15dbe99beb64ea9c3274 100644 (file)
@@ -3,5 +3,8 @@ SUBDIRS = libtrace
 EXTRA_DIST = misc/rasdaemon.service
 
 sbin_PROGRAMS = rasdaemon
-rasdaemon_SOURCES = rasdaemon.c ras-record.c ras-events.c ras-mc-handler.c
-rasdaemon_LDADD = -lpthread -lsqlite3 libtrace/libtrace.a
+rasdaemon_SOURCES = rasdaemon.c ras-events.c ras-mc-handler.c
+if WITH_SQLITE3
+   rasdaemon_SOURCES += ras-record.c
+endif
+rasdaemon_LDADD = -lpthread $(SQLITE3_LIBS) libtrace/libtrace.a
index a64bb5da13d81bad4f558ceb1c3a6be68ea245de..5a141a842d5385dab58622719caebbaea5e6acd8 100644 (file)
@@ -1,10 +1,24 @@
 AC_INIT([RAS Daemon], 0.1)
+AM_SILENT_RULES([yes])
 AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_FILES([Makefile libtrace/Makefile])
 AM_INIT_AUTOMAKE
 AC_PROG_CC
 AC_PROG_INSTALL
 AC_PROG_LIBTOOL
-AC_CHECK_LIB(sqlite3, sqlite3_open,[echo "found sqlite3"] , AC_MSG_ERROR([*** Unable to find sqlite3 library]), )
+
+AC_ARG_ENABLE([sqlite3],
+    AS_HELP_STRING([--enable-sqlite], [enable storing data at SQL lite database (currently experimental]))
+
+AS_IF([test "x$enable_sqlite3" = "xyes"], [
+  AC_CHECK_LIB(sqlite3, sqlite3_open,[echo "found sqlite3"] , AC_MSG_ERROR([*** Unable to find sqlite3 library]), )
+  SQLITE3_LIBS="-lsqlite3"
+  AC_DEFINE(HAVE_SQLITE3,1,"have sqlite3")
+  AC_SUBST([WITH_SQLITE3])
+])
+
+AM_CONDITIONAL([WITH_SQLITE3], [test x$enable_sqlite3 = xyes])
+AC_SUBST([SQLITE3_LIBS])
 
 AC_OUTPUT
index eb3ae928b330cdf935b5e49e0692a5dda6a2b328..5506d1d27abf877700a29d1ebcd90c699e399e0f 100644 (file)
@@ -39,8 +39,7 @@ struct ras_events {
        time_t          uptime_diff;
 
        /* For ras-record */
-       sqlite3         *db;
-       sqlite3_stmt    *stmt;
+       void            *db_priv;
 };
 
 struct pthread_data {
index f4048c69019a1e39f275335b80890da995c2fd20..752de468c1a746a687cbe5c16b346309bff80484 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include "ras-events.h"
 #include "ras-mc-handler.h"
 #include "ras-logger.h"
@@ -69,7 +70,7 @@ const char *createdb = "CREATE TABLE IF NOT EXISTS";
 const char *insertdb = "INSERT INTO";
 const char *valuesdb = " VALUES ";
 
-static int ras_mc_prepare_stmt(struct ras_events *ras)
+static int ras_mc_prepare_stmt(struct sqlite3_priv *priv)
 {
        int i, rc;
        char sql[1024];
@@ -87,26 +88,32 @@ static int ras_mc_prepare_stmt(struct ras_events *ras)
                        strcat(sql, "?)");
        }
 
-       rc = sqlite3_prepare_v2(ras->db, sql, -1, &ras->stmt, NULL);
+       rc = sqlite3_prepare_v2(priv->db, sql, -1, &priv->stmt, NULL);
        if (rc != SQLITE_OK)
                log(TERM, LOG_ERR, "Failed to prepare insert db on %s: error = %s\n",
-                      SQLITE_RAS_DB, sqlite3_errmsg(ras->db));
+                      SQLITE_RAS_DB, sqlite3_errmsg(priv->db));
 
        return rc;
 }
 
-sqlite3 *ras_mc_event_opendb(struct ras_events *ras)
+int ras_mc_event_opendb(struct ras_events *ras)
 {
        int rc, i;
        sqlite3 *db;
        char sql[1024];
+       struct sqlite3_priv *priv;
 
-       ras->stmt = NULL;
+       ras->db_priv = NULL;
+
+       priv = calloc(1, sizeof(*priv));
+       if (!priv)
+               return -1;
 
        rc = sqlite3_initialize();
        if (rc != SQLITE_OK) {
                log(TERM, LOG_ERR, "Failed to initialize sqlite: error = %d\n", rc);
-               return NULL;
+               free(priv);
+               return -1;
        }
 
        rc = sqlite3_open_v2(SQLITE_RAS_DB, &db,
@@ -114,7 +121,8 @@ sqlite3 *ras_mc_event_opendb(struct ras_events *ras)
        if (rc != SQLITE_OK) {
                log(TERM, LOG_ERR, "Failed to connect to %s: error = %d\n",
                       SQLITE_RAS_DB, rc);
-               return NULL;
+               free(priv);
+               return -1;
        }
 
        strcpy(sql, createdb);
@@ -124,44 +132,46 @@ sqlite3 *ras_mc_event_opendb(struct ras_events *ras)
        if (rc != SQLITE_OK) {
                log(TERM, LOG_ERR, "Failed to create db on %s: error = %d\n",
                       SQLITE_RAS_DB, rc);
-
-               return NULL;
+               free(priv);
+               return -1;
        }
 
-       ras->db = db;
+       priv->db = db;
+       ras->db_priv = priv;
 
-       rc = ras_mc_prepare_stmt(ras);
+       rc = ras_mc_prepare_stmt(priv);
        if (rc == SQLITE_OK)
                log(TERM, LOG_INFO, "Recording events at %s\n", SQLITE_RAS_DB, rc);
 
-       return db;
+       return 0;
 }
 
 int ras_store_mc_event(struct ras_events *ras, struct ras_mc_event *ev)
 {
        int rc;
+       struct sqlite3_priv *priv = ras->db_priv;
 
-       log(TERM, LOG_INFO, "store_event: %p\n", ras->stmt);
-       if (!ras->stmt)
+       log(TERM, LOG_INFO, "store_event: %p\n", priv->stmt);
+       if (!priv->stmt)
                return 0;
 
-       sqlite3_bind_text(ras->stmt,  1, ev->timestamp, -1, NULL);
-       sqlite3_bind_int (ras->stmt,  2, ev->error_count);
-       sqlite3_bind_text(ras->stmt,  3, ev->error_type, -1, NULL);
-       sqlite3_bind_text(ras->stmt,  4, ev->msg, -1, NULL);
-       sqlite3_bind_text(ras->stmt,  5, ev->label, -1, NULL);
-       sqlite3_bind_int (ras->stmt,  6, ev->mc_index);
-       sqlite3_bind_int (ras->stmt,  7, ev->top_layer);
-       sqlite3_bind_int (ras->stmt,  8, ev->middle_layer);
-       sqlite3_bind_int (ras->stmt,  9, ev->lower_layer);
-       sqlite3_bind_int (ras->stmt, 10, ev->address);
-       sqlite3_bind_int (ras->stmt, 11, ev->grain);
-       sqlite3_bind_int (ras->stmt, 12, ev->syndrome);
-       sqlite3_bind_text(ras->stmt, 13, ev->driver_detail, -1, NULL);
-       rc = sqlite3_step(ras->stmt);
+       sqlite3_bind_text(priv->stmt,  1, ev->timestamp, -1, NULL);
+       sqlite3_bind_int (priv->stmt,  2, ev->error_count);
+       sqlite3_bind_text(priv->stmt,  3, ev->error_type, -1, NULL);
+       sqlite3_bind_text(priv->stmt,  4, ev->msg, -1, NULL);
+       sqlite3_bind_text(priv->stmt,  5, ev->label, -1, NULL);
+       sqlite3_bind_int (priv->stmt,  6, ev->mc_index);
+       sqlite3_bind_int (priv->stmt,  7, ev->top_layer);
+       sqlite3_bind_int (priv->stmt,  8, ev->middle_layer);
+       sqlite3_bind_int (priv->stmt,  9, ev->lower_layer);
+       sqlite3_bind_int (priv->stmt, 10, ev->address);
+       sqlite3_bind_int (priv->stmt, 11, ev->grain);
+       sqlite3_bind_int (priv->stmt, 12, ev->syndrome);
+       sqlite3_bind_text(priv->stmt, 13, ev->driver_detail, -1, NULL);
+       rc = sqlite3_step(priv->stmt);
        if (rc != SQLITE_OK && rc != SQLITE_DONE)
                log(TERM, LOG_ERR, "Failed to do step on sqlite: error = %d\n", rc);
-       rc = sqlite3_finalize(ras->stmt);
+       rc = sqlite3_finalize(priv->stmt);
        if (rc != SQLITE_OK && rc != SQLITE_DONE)
                log(TERM, LOG_ERR, "Failed to do finalize insert on sqlite: error = %d\n",
                       rc);
index 0b216e8d8fea57f70325baff95384d20480987fc..6eebd65f00667e7f87b950a5df697d4b3b3453a0 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
-#include <sqlite3.h>
-
 #ifndef __RAS_RECORD_H
 #define __RAS_RECORD_H
+
+#include "config.h"
+
+struct ras_events *ras;
+
 struct ras_mc_event {
        char timestamp[64];
        int error_count;
@@ -30,8 +33,21 @@ struct ras_mc_event {
        const char *driver_detail;
 };
 
-struct ras_events *ras;
+#ifdef HAVE_SQLITE3
 
-sqlite3 *ras_mc_event_opendb(struct ras_events *ras);
+#include <sqlite3.h>
+
+struct sqlite3_priv {
+       sqlite3         *db;
+       sqlite3_stmt    *stmt;
+};
+
+int ras_mc_event_opendb(struct ras_events *ras);
 int ras_store_mc_event(struct ras_events *ras, struct ras_mc_event *ev);
-#endif
\ No newline at end of file
+
+#else
+static inline int ras_mc_event_opendb(struct ras_events *ras) { return 0; };
+static inline int ras_store_mc_event(struct ras_events *ras, struct ras_mc_event *ev) { return 0; };
+#endif
+
+#endif
index 479bc6c235fa686650382fe09d88f9844b6bd23b..c5f99bb3a287577286dbbb66178d2e1c03c98e45 100644 (file)
@@ -71,7 +71,9 @@ int main(int argc, char *argv[])
        const struct argp_option options[] = {
                {"enable",  'e', 0, 0, "enable RAS events and exit", 0},
                {"disable", 'd', 0, 0, "disable RAS events and exit", 0},
+#ifdef HAVE_SQLITE3
                {"record",  'r', 0, 0, "record events via sqlite3", 0},
+#endif
                {"foreground", 'f', 0, 0, "run foreground, not daemonize"},
 
                { 0, 0, 0, 0, 0, 0 }