diff options
Diffstat (limited to 'output/sqlite3')
-rw-r--r-- | output/sqlite3/Makefile.am | 7 | ||||
-rw-r--r-- | output/sqlite3/ulogd_output_SQLITE3.c | 97 |
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; } |