diff --git a/src/core/data.c b/src/core/data.c
index 54b6d282e6640d755e38457e4dbd497bb995fd32..bf1f55ec8a1f053c2fce945e3ba161b1ea16eeaa 100644 (file)
--- a/src/core/data.c
+++ b/src/core/data.c
#include <inttypes.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
}
} /* sdb_data_free_datum */
+size_t
+sdb_data_strlen(sdb_data_t *datum)
+{
+ if (! datum)
+ return 0;
+
+ switch (datum->type) {
+ case SDB_TYPE_INTEGER:
+ /* log(64) */
+ return 20;
+ case SDB_TYPE_DECIMAL:
+ /* XXX: -0xN.NNNNNNp+NNN */
+ return 42;
+ case SDB_TYPE_STRING:
+ if (! datum->data.string)
+ return 6; /* "NULL" */
+ /* in the worst case, each character needs to be escaped */
+ return 2 * strlen(datum->data.string) + 2;
+ case SDB_TYPE_DATETIME:
+ /* "YYYY-MM-DD HH:MM:SS +zzzz" */
+ return 27;
+ case SDB_TYPE_BINARY:
+ /* "\xNN" */
+ return 4 * datum->data.binary.length + 2;
+ }
+ return 0;
+} /* sdb_data_strlen */
+
int
-sdb_data_format(sdb_data_t *datum, sdb_strbuf_t *buf)
+sdb_data_format(sdb_data_t *datum, char *buf, size_t buflen)
{
+ int ret = -1;
+
if ((! datum) || (! buf))
return -1;
switch (datum->type) {
case SDB_TYPE_INTEGER:
- sdb_strbuf_append(buf, "%"PRIi64, datum->data.integer);
+ ret = snprintf(buf, buflen, "%"PRIi64, datum->data.integer);
break;
case SDB_TYPE_DECIMAL:
- sdb_strbuf_append(buf, "%a", datum->data.decimal);
+ ret = snprintf(buf, buflen, "%a", datum->data.decimal);
break;
case SDB_TYPE_STRING:
- if (! datum->data.string) {
- sdb_strbuf_append(buf, "\"NULL\"");
- return 0;
- }
- {
+ if (! datum->data.string)
+ ret = snprintf(buf, buflen, "\"NULL\"");
+ else {
char tmp[2 * strlen(datum->data.string) + 1];
size_t i, pos;
++pos;
}
tmp[pos] = '\0';
- sdb_strbuf_append(buf, "\"%s\"", tmp);
+ ret = snprintf(buf, buflen, "\"%s\"", tmp);
}
break;
case SDB_TYPE_DATETIME:
datum->data.datetime))
return -1;
tmp[sizeof(tmp) - 1] = '\0';
- sdb_strbuf_append(buf, "\"%s\"", tmp);
+ ret = snprintf(buf, buflen, "\"%s\"", tmp);
}
break;
case SDB_TYPE_BINARY:
++pos;
}
tmp[pos] = '\0';
- sdb_strbuf_append(buf, "\"%s\"", tmp);
+ ret = snprintf(buf, buflen, "\"%s\"", tmp);
}
break;
- default:
- return -1;
}
- return 0;
+ buf[buflen - 1] = '\0';
+ return ret;
} /* sdb_data_format */
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */