summaryrefslogtreecommitdiffstats
path: root/output/sqlite3
diff options
context:
space:
mode:
Diffstat (limited to 'output/sqlite3')
-rw-r--r--output/sqlite3/Makefile.am7
-rw-r--r--output/sqlite3/ulogd_output_SQLITE3.c97
2 files changed, 53 insertions, 51 deletions
diff --git a/output/sqlite3/Makefile.am b/output/sqlite3/Makefile.am
index 62af267..72fd1a6 100644
--- a/output/sqlite3/Makefile.am
+++ b/output/sqlite3/Makefile.am
@@ -1,12 +1,9 @@
-AM_CPPFLAGS = -I$(top_srcdir)/include ${libsqlite3_CFLAGS}
-AM_CFLAGS = ${regular_CFLAGS}
+include $(top_srcdir)/Make_global.am
-if HAVE_SQLITE3
+AM_CPPFLAGS += ${libsqlite3_CFLAGS}
pkglib_LTLIBRARIES = ulogd_output_SQLITE3.la
ulogd_output_SQLITE3_la_SOURCES = ulogd_output_SQLITE3.c ../../util/db.c
ulogd_output_SQLITE3_la_LIBADD = ${libsqlite3_LIBS}
ulogd_output_SQLITE3_la_LDFLAGS = -avoid-version -module
-
-endif
diff --git a/output/sqlite3/ulogd_output_SQLITE3.c b/output/sqlite3/ulogd_output_SQLITE3.c
index 20ceb3b..6aeb7a3 100644
--- a/output/sqlite3/ulogd_output_SQLITE3.c
+++ b/output/sqlite3/ulogd_output_SQLITE3.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
+#include <netinet/in.h>
#include <ulogd/ulogd.h>
#include <ulogd/conffile.h>
#include <sqlite3.h>
@@ -48,7 +49,7 @@
struct field {
TAILQ_ENTRY(field) link;
- char name[ULOGD_MAX_KEYLEN];
+ char name[ULOGD_MAX_KEYLEN + 1];
struct ulogd_key *key;
};
@@ -104,11 +105,14 @@ add_row(struct ulogd_pluginstance *pi)
ret = sqlite3_finalize(priv->p_stmt);
priv->p_stmt = NULL;
- if (ret == SQLITE_SCHEMA)
- sqlite3_createstmt(pi);
- else {
+ if (ret != SQLITE_SCHEMA) {
ulogd_log(ULOGD_ERROR, "SQLITE3: step: %s\n",
- sqlite3_errmsg(priv->dbh));
+ sqlite3_errmsg(priv->dbh));
+ goto err_reset;
+ }
+ if (sqlite3_createstmt(pi) < 0) {
+ ulogd_log(ULOGD_ERROR,
+ "SQLITE3: Could not create statement.\n");
goto err_reset;
}
}
@@ -142,6 +146,10 @@ sqlite3_interp(struct ulogd_pluginstance *pi)
}
switch (f->key->type) {
+ case ULOGD_RET_BOOL:
+ ret = sqlite3_bind_int(priv->p_stmt, i, k_ret->u.value.b);
+ break;
+
case ULOGD_RET_INT8:
ret = sqlite3_bind_int(priv->p_stmt, i, k_ret->u.value.i8);
break;
@@ -155,7 +163,7 @@ sqlite3_interp(struct ulogd_pluginstance *pi)
break;
case ULOGD_RET_INT64:
- ret = sqlite3_bind_int(priv->p_stmt, i, k_ret->u.value.i64);
+ ret = sqlite3_bind_int64(priv->p_stmt, i, k_ret->u.value.i64);
break;
case ULOGD_RET_UINT8:
@@ -171,17 +179,20 @@ sqlite3_interp(struct ulogd_pluginstance *pi)
break;
case ULOGD_RET_IPADDR:
- case ULOGD_RET_UINT64:
- ret = sqlite3_bind_int64(priv->p_stmt, i, k_ret->u.value.ui64);
+ if (k_ret->len == sizeof(struct in_addr))
+ ret = sqlite3_bind_int(priv->p_stmt, i,
+ k_ret->u.value.ui32);
+ else
+ ret = sqlite3_bind_null(priv->p_stmt, i);
break;
- case ULOGD_RET_BOOL:
- ret = sqlite3_bind_int(priv->p_stmt, i, k_ret->u.value.b);
+ case ULOGD_RET_UINT64:
+ ret = sqlite3_bind_int64(priv->p_stmt, i, k_ret->u.value.ui64);
break;
case ULOGD_RET_STRING:
ret = sqlite3_bind_text(priv->p_stmt, i, k_ret->u.value.ptr,
- strlen(k_ret->u.value.ptr), SQLITE_STATIC);
+ strlen(k_ret->u.value.ptr), SQLITE_STATIC);
break;
default:
@@ -214,10 +225,8 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
{
struct sqlite3_priv *priv = (void *)pi->private;
struct field *f;
- char buf[ULOGD_MAX_KEYLEN];
- char *underscore;
- char *stmt_pos;
int i, cols = 0;
+ char *stmt_pos;
if (priv->stmt != NULL)
free(priv->stmt);
@@ -226,31 +235,21 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
ulogd_log(ULOGD_ERROR, "SQLITE3: out of memory\n");
return -1;
}
+ stmt_pos = priv->stmt;
- sprintf(priv->stmt, "insert into %s (", table_ce(pi));
- stmt_pos = priv->stmt + strlen(priv->stmt);
+ stmt_pos += sprintf(stmt_pos, "insert into %s (", table_ce(pi));
tailq_for_each(f, priv->fields, link) {
- strncpy(buf, f->name, ULOGD_MAX_KEYLEN);
-
- while ((underscore = strchr(buf, '.')))
- *underscore = '_';
-
- sprintf(stmt_pos, "%s,", buf);
- stmt_pos = priv->stmt + strlen(priv->stmt);
-
+ stmt_pos += sprintf(stmt_pos, "%s,", f->name);
cols++;
}
*(stmt_pos - 1) = ')';
- sprintf(stmt_pos, " values (");
- stmt_pos = priv->stmt + strlen(priv->stmt);
+ stmt_pos += sprintf(stmt_pos, " values (");
- for (i = 0; i < cols - 1; i++) {
- sprintf(stmt_pos,"?,");
- stmt_pos += 2;
- }
+ for (i = 0; i < cols - 1; i++)
+ stmt_pos += sprintf(stmt_pos, "?,");
sprintf(stmt_pos, "?)");
ulogd_log(ULOGD_DEBUG, "%s: stmt='%s'\n", pi->id, priv->stmt);
@@ -260,8 +259,8 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
sqlite3_prepare(priv->dbh, priv->stmt, -1, &priv->p_stmt, 0);
if (priv->p_stmt == NULL) {
ulogd_log(ULOGD_ERROR, "SQLITE3: prepare: %s\n",
- sqlite3_errmsg(priv->dbh));
- return 1;
+ sqlite3_errmsg(priv->dbh));
+ return -1;
}
DEBUGP("statement prepared.\n");
@@ -273,10 +272,15 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi)
static struct ulogd_key *
ulogd_find_key(struct ulogd_pluginstance *pi, const char *name)
{
+ char buf[ULOGD_MAX_KEYLEN + 1] = "";
unsigned int i;
+ /* replace all underscores with dots */
+ for (i = 0; i < sizeof(buf) - 1 && name[i]; ++i)
+ buf[i] = name[i] != '_' ? name[i] : '.';
+
for (i = 0; i < pi->input.num_keys; i++) {
- if (strcmp(pi->input.keys[i].name, name) == 0)
+ if (strcmp(pi->input.keys[i].name, buf) == 0)
return &pi->input.keys[i];
}
@@ -305,9 +309,6 @@ static int
sqlite3_init_db(struct ulogd_pluginstance *pi)
{
struct sqlite3_priv *priv = (void *)pi->private;
- char buf[ULOGD_MAX_KEYLEN];
- char *underscore;
- struct field *f;
sqlite3_stmt *schema_stmt;
int col, num_cols;
@@ -327,23 +328,24 @@ sqlite3_init_db(struct ulogd_pluginstance *pi)
}
for (col = 0; col < num_cols; col++) {
- strncpy(buf, sqlite3_column_name(schema_stmt, col), ULOGD_MAX_KEYLEN);
-
- /* replace all underscores with dots */
- while ((underscore = strchr(buf, '_')) != NULL)
- *underscore = '.';
-
- DEBUGP("field '%s' found\n", buf);
+ struct field *f;
/* prepend it to the linked list */
if ((f = calloc(1, sizeof(struct field))) == NULL) {
ulogd_log(ULOGD_ERROR, "SQLITE3: out of memory\n");
return -1;
}
- strncpy(f->name, buf, ULOGD_MAX_KEYLEN);
+ snprintf(f->name, sizeof(f->name),
+ "%s", sqlite3_column_name(schema_stmt, col));
+
+ DEBUGP("field '%s' found\n", f->name);
- if ((f->key = ulogd_find_key(pi, buf)) == NULL)
+ if ((f->key = ulogd_find_key(pi, f->name)) == NULL) {
+ ulogd_log(ULOGD_ERROR,
+ "SQLITE3: unknown input key: %s\n", f->name);
+ free(f);
return -1;
+ }
TAILQ_INSERT_TAIL(&priv->fields, f, link);
}
@@ -394,7 +396,10 @@ sqlite3_start(struct ulogd_pluginstance *pi)
}
/* create and prepare the actual insert statement */
- sqlite3_createstmt(pi);
+ if (sqlite3_createstmt(pi) < 0) {
+ ulogd_log(ULOGD_ERROR, "SQLITE3: Could not create statement.\n");
+ return -1;
+ }
return 0;
}