summaryrefslogtreecommitdiffstats
path: root/util/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/db.c')
-rw-r--r--util/db.c66
1 files changed, 41 insertions, 25 deletions
diff --git a/util/db.c b/util/db.c
index c9aec41..749a45f 100644
--- a/util/db.c
+++ b/util/db.c
@@ -67,7 +67,6 @@ static int sql_createstmt(struct ulogd_pluginstance *upi)
unsigned int i;
char *table = table_ce(upi->config_kset).u.string;
char *procedure = procedure_ce(upi->config_kset).u.string;
- char *stmt_val = NULL;
if (mi->stmt)
free(mi->stmt);
@@ -96,30 +95,33 @@ static int sql_createstmt(struct ulogd_pluginstance *upi)
if (strncasecmp(procedure,"INSERT", strlen("INSERT")) == 0 &&
(procedure[strlen("INSERT")] == '\0' ||
procedure[strlen("INSERT")] == ' ')) {
- char buf[ULOGD_MAX_KEYLEN];
- char *underscore;
+ char *stmt_val = mi->stmt;
if(procedure[6] == '\0') {
/* procedure == "INSERT" */
if (mi->schema)
- sprintf(mi->stmt, "insert into %s.%s (", mi->schema, table);
+ stmt_val += sprintf(stmt_val,
+ "insert into %s.%s (",
+ mi->schema, table);
else
- sprintf(mi->stmt, "insert into %s (", table);
- }
- else
- sprintf(mi->stmt, "%s (", procedure);
-
- stmt_val = mi->stmt + strlen(mi->stmt);
+ stmt_val += sprintf(stmt_val,
+ "insert into %s (", table);
+ } else
+ stmt_val += sprintf(stmt_val, "%s (", procedure);
for (i = 0; i < upi->input.num_keys; i++) {
+ char *underscore;
+
if (upi->input.keys[i].flags & ULOGD_KEYF_INACTIVE)
continue;
- strncpy(buf, upi->input.keys[i].name, ULOGD_MAX_KEYLEN);
- while ((underscore = strchr(buf, '.')))
+ underscore = stmt_val;
+
+ stmt_val += sprintf(stmt_val, "%s,",
+ upi->input.keys[i].name);
+
+ while ((underscore = strchr(underscore, '.')))
*underscore = '_';
- sprintf(stmt_val, "%s,", buf);
- stmt_val = mi->stmt + strlen(mi->stmt);
}
*(stmt_val - 1) = ')';
@@ -226,9 +228,8 @@ int ulogd_db_start(struct ulogd_pluginstance *upi)
di->ring.size, di->ring.length);
/* init start of query for each element */
for(i = 0; i < di->ring.size; i++) {
- strncpy(di->ring.ring + di->ring.length * i + 1,
- di->stmt,
- strlen(di->stmt));
+ strcpy(di->ring.ring + di->ring.length * i + 1,
+ di->stmt);
}
/* init cond & mutex */
ret = pthread_cond_init(&di->ring.cond, NULL);
@@ -343,6 +344,9 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start)
}
switch (res->type) {
+ case ULOGD_RET_BOOL:
+ sprintf(stmt_ins, "'%d',", res->u.value.b);
+ break;
case ULOGD_RET_INT8:
sprintf(stmt_ins, "%d,", res->u.value.i8);
break;
@@ -362,16 +366,24 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start)
sprintf(stmt_ins, "%u,", res->u.value.ui16);
break;
case ULOGD_RET_IPADDR:
- /* fallthrough when logging IP as uint32_t */
+ if (res->len == sizeof(struct in_addr))
+ sprintf(stmt_ins, "%u,", res->u.value.ui32);
+ else {
+ struct in6_addr ipv6;
+ char addrbuf[2 + sizeof(ipv6) * 2 + 1];
+
+ memcpy(ipv6.s6_addr, res->u.value.ui128,
+ sizeof(ipv6.s6_addr));
+ format_ipv6(addrbuf, sizeof(addrbuf), &ipv6);
+ sprintf(stmt_ins, "%s,", addrbuf);
+ }
+ break;
case ULOGD_RET_UINT32:
sprintf(stmt_ins, "%u,", res->u.value.ui32);
break;
case ULOGD_RET_UINT64:
sprintf(stmt_ins, "%" PRIu64 ",", res->u.value.ui64);
break;
- case ULOGD_RET_BOOL:
- sprintf(stmt_ins, "'%d',", res->u.value.b);
- break;
case ULOGD_RET_STRING:
*(stmt_ins++) = '\'';
if (res->u.value.ptr) {
@@ -388,6 +400,7 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start)
case ULOGD_RET_RAW:
ulogd_log(ULOGD_NOTICE,
"Unsupported RAW type is unsupported in SQL output");
+ break;
default:
ulogd_log(ULOGD_NOTICE,
"unknown type %d for %s\n",
@@ -402,14 +415,17 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start)
static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, unsigned int len)
{
struct db_instance *di = (struct db_instance *) &upi->private;
+ unsigned int query_size;
struct db_stmt *query;
/* check if we are using backlog */
if (di->backlog_memcap == 0)
return 0;
+ query_size = sizeof(*query) + len + 1;
+
/* check len against backlog */
- if (len + di->backlog_memusage > di->backlog_memcap) {
+ if (query_size + di->backlog_memcap - di->backlog_memusage) {
if (di->backlog_full == 0)
ulogd_log(ULOGD_ERROR,
"Backlog is full starting to reject events.\n");
@@ -417,7 +433,7 @@ static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, un
return -1;
}
- query = malloc(sizeof(struct db_stmt));
+ query = malloc(sizeof(*query));
if (query == NULL)
return -1;
@@ -429,7 +445,7 @@ static int __add_to_backlog(struct ulogd_pluginstance *upi, const char *stmt, un
return -1;
}
- di->backlog_memusage += len + sizeof(struct db_stmt);
+ di->backlog_memusage += query_size;
di->backlog_full = 0;
llist_add_tail(&query->list, &di->backlog);
@@ -487,7 +503,7 @@ static int __treat_backlog(struct ulogd_pluginstance *upi)
di->driver->close_db(upi);
return _init_reconnect(upi);
} else {
- di->backlog_memusage -= query->len + sizeof(struct db_stmt);
+ di->backlog_memusage -= sizeof(*query) + query->len + 1;
llist_del(&query->list);
free(query->stmt);
free(query);