diff --git a/src/core/data.c b/src/core/data.c
index 1bb5400028223c89eca2f9a10e7ee3e81cc5cb03..81b511b6c48fda961b51e9d770f13da415cabfac 100644 (file)
--- a/src/core/data.c
+++ b/src/core/data.c
sdb_strbuf_append(buf, "%a", datum->data.decimal);
break;
case SDB_TYPE_STRING:
+ if (! datum->data.string) {
+ sdb_strbuf_append(buf, "\"NULL\"");
+ return 0;
+ }
/* TODO: escape special characters */
sdb_strbuf_append(buf, "\"%s\"", datum->data.string);
break;
datum->data.datetime))
return -1;
tmp[sizeof(tmp) - 1] = '\0';
- sdb_strbuf_append(buf, "%s", tmp);
+ sdb_strbuf_append(buf, "\"%s\"", tmp);
}
break;
case SDB_TYPE_BINARY:
{
- size_t i;
- /* TODO: improve this! */
- sdb_strbuf_append(buf, "%s", "\"");
- for (i = 0; i < datum->data.binary.length; ++i)
- sdb_strbuf_append(buf, "\\%x",
- (int)datum->data.binary.datum[i]);
- sdb_strbuf_append(buf, "%s", "\"");
+ char tmp[4 * datum->data.binary.length + 1];
+ size_t i, pos;
+
+ pos = 0;
+ for (i = 0; i < datum->data.binary.length; ++i) {
+ int byte = (int)datum->data.binary.datum[i];
+ char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+ tmp[pos] = '\\';
+ tmp[pos + 1] = 'x';
+ pos += 2;
+
+ if (byte > 0xf) {
+ tmp[pos] = hex[byte >> 4];
+ ++pos;
+ }
+ tmp[pos] = hex[byte & 0xf];
+ ++pos;
+ }
+ tmp[pos] = '\0';
+ sdb_strbuf_append(buf, "\"%s\"", tmp);
}
break;
default: