Browse Source

ckdb - txt_to_ctv for comma separated time

master
kanoi 11 years ago
parent
commit
d3e7db51bc
  1. 32
      src/ckdb.c

32
src/ckdb.c

@ -109,6 +109,7 @@ enum data_type {
TYPE_BIGINT,
TYPE_INT,
TYPE_TV,
TYPE_CTV,
TYPE_BLOB,
TYPE_DOUBLE
};
@ -117,6 +118,7 @@ enum data_type {
#define TXT_TO_BIGINT(__nam, __fld, __data) txt_to_bigint(__nam, __fld, &(__data), sizeof(__data))
#define TXT_TO_INT(__nam, __fld, __data) txt_to_int(__nam, __fld, &(__data), sizeof(__data))
#define TXT_TO_TV(__nam, __fld, __data) txt_to_tv(__nam, __fld, &(__data), sizeof(__data))
#define TXT_TO_CTV(__nam, __fld, __data) txt_to_ctv(__nam, __fld, &(__data), sizeof(__data))
#define TXT_TO_BLOB(__nam, __fld, __data) txt_to_blob(__nam, __fld, __data)
#define TXT_TO_DOUBLE(__nam, __fld, __data) txt_to_double(__nam, __fld, &(__data), sizeof(__data))
@ -1024,6 +1026,27 @@ static void txt_to_data(enum data_type typ, char *nam, char *fld, void *data, si
((tv_t *)data)->tv_usec = uS;
}
break;
case TYPE_CTV:
if (siz != sizeof(tv_t)) {
quithere(1, "Field %s timeval incorrect structure size %d - should be %d",
nam, (int)siz, (int)sizeof(tv_t));
}
long sec, usec;
int c;
((tv_t *)data)->tv_sec = 0L;
((tv_t *)data)->tv_usec = 0L;
c = sscanf(fld, "%ld,%ld", &sec, &usec);
// For converting msg fields - so not fatal if it's no good
if (c > 0) {
((tv_t *)data)->tv_sec = (time_t)sec;
if (c > 1)
((tv_t *)data)->tv_usec = usec;
if (((tv_t *)data)->tv_sec >= COMPARE_EXPIRY) {
((tv_t *)data)->tv_sec = default_expiry.tv_sec;
((tv_t *)data)->tv_usec = default_expiry.tv_usec;
}
}
break;
case TYPE_BLOB:
tmp = strdup(fld);
if (!tmp)
@ -1064,6 +1087,12 @@ static void txt_to_tv(char *nam, char *fld, tv_t *data, size_t siz)
txt_to_data(TYPE_TV, nam, fld, (void *)data, siz);
}
// Convert msg S,nS to tv_t
static void txt_to_ctv(char *nam, char *fld, tv_t *data, size_t siz)
{
txt_to_data(TYPE_CTV, nam, fld, (void *)data, siz);
}
static void txt_to_blob(char *nam, char *fld, char *data)
{
txt_to_data(TYPE_BLOB, nam, fld, (void *)(&data), 0);
@ -1113,6 +1142,7 @@ static char *data_to_buf(enum data_type typ, void *data, char *buf, size_t siz)
snprintf(buf, siz, "%"PRId32, *((uint32_t *)data));
break;
case TYPE_TV:
case TYPE_CTV:
buf2 = malloc(siz);
if (!buf2)
quithere(1, "OOM (%d)", (int)siz);
@ -3250,7 +3280,7 @@ static char *cmd_poolstats(char *cmd, __maybe_unused char *id, tv_t *now, char *
i_createdate = require_name("createdate", 1, NULL, reply, siz);
if (!i_createdate)
return strdup(reply);
TXT_TO_TV("createdate", DATA_TRANSFER(i_createdate)->data, createdate);
TXT_TO_CTV("createdate", DATA_TRANSFER(i_createdate)->data, createdate);
if (tvdiff(&createdate, &(row.createdate)) > STATS_PER)
store = true;
else

Loading…
Cancel
Save