diff --git a/src/core/data.c b/src/core/data.c
index 9f2b506fbc1b76e66dd330be7879655a530871ba..44353057b5df70bcb8db19da6600166d4786500d 100644 (file)
--- a/src/core/data.c
+++ b/src/core/data.c
char d1_str[sdb_data_strlen(d1) + 1];
char d2_str[sdb_data_strlen(d2) + 1];
- if ((d1->type & SDB_TYPE_ARRAY) || (d2->type & SDB_TYPE_ARRAY)) {
- /* TODO */
- errno = ENOTSUP;
- return -1;
- }
-
if (sdb_data_isnull(d1))
d1 = NULL;
if (sdb_data_isnull(d2))
CMP_NULL(d1, d2);
- if (sdb_data_format(d1, d1_str, sizeof(d1_str), SDB_UNQUOTED) < 0)
+ if (! sdb_data_format(d1, d1_str, sizeof(d1_str), SDB_UNQUOTED))
return SDB_CMP(sizeof(d1_str), sizeof(d2_str));
- if (sdb_data_format(d2, d2_str, sizeof(d2_str), SDB_UNQUOTED) < 0)
+ if (! sdb_data_format(d2, d2_str, sizeof(d2_str), SDB_UNQUOTED))
return SDB_CMP(sizeof(d1_str), sizeof(d2_str));
return strcasecmp(d1_str, d2_str);
char **v = array->data.array.values;
tmp.data.string = v[i];
}
+ else if (type == SDB_TYPE_DATETIME) {
+ sdb_time_t *v = array->data.array.values;
+ tmp.data.datetime = v[i];
+ }
+ else if (type == SDB_TYPE_BINARY) {
+ struct {
+ size_t length;
+ unsigned char *datum;
+ } *v = array->data.array.values;
+ assert(sizeof(tmp.data.binary) == sizeof(v[i]));
+ memcpy(&tmp.data.binary, &v[i], sizeof(v[i]));
+ }
+ else if (type == SDB_TYPE_REGEX) {
+ struct {
+ char *raw;
+ regex_t regex;
+ } *v = array->data.array.values;
+ assert(sizeof(tmp.data.re) == sizeof(v[i]));
+ memcpy(&tmp.data.re, &v[i], sizeof(v[i]));
+ }
else {
- /* TODO */
- errno = ENOTSUP;
+ errno = EINVAL;
return -1;
}
return 0;
} /* sdb_data_strlen */
-int
+size_t
sdb_data_format(const sdb_data_t *datum, char *buf, size_t buflen, int quoted)
{
char tmp[sdb_data_strlen(datum) + 1];
char *data = NULL;
bool is_null = 0;
- int ret = -1;
+ size_t ret = 0;
size_t i, pos;
- if ((! datum) || (! buf) || (! buflen))
- return -1;
+ if (! datum)
+ return 0;
if (datum->type == SDB_TYPE_NULL) {
strncpy(buf, "NULL", buflen);
@@ -1005,37 +1018,41 @@ sdb_data_format(const sdb_data_t *datum, char *buf, size_t buflen, int quoted)
}
else if (datum->type & SDB_TYPE_ARRAY) {
ret = 1;
- buf[0] = '[';
+ if (buflen > 0)
+ buf[0] = '[';
for (i = 0; i < datum->data.array.length; ++i) {
sdb_data_t v = SDB_DATA_INIT;
- int n;
- if ((size_t)ret >= buflen - 1)
- break;
+ size_t n;
if (ret > 1) {
- buf[ret] = ',';
- buf[ret + 1] = ' ';
+ if (buflen > ret + 1) {
+ buf[ret] = ',';
+ buf[ret + 1] = ' ';
+ }
ret += 2;
}
sdb_data_array_get(datum, i, &v);
- n = sdb_data_format(&v, buf + ret, buflen - ret, quoted);
+ if (buflen > ret)
+ n = sdb_data_format(&v, buf + ret, buflen - ret, quoted);
+ else
+ n = sdb_data_format(&v, NULL, 0, quoted);
if (n > 0)
ret += n;
else
break;
}
- if ((size_t)ret < buflen - 1) {
+ if (buflen > ret + 1) {
buf[ret] = ']';
buf[ret + 1] = '\0';
- ++ret;
}
+ ++ret;
}
if (is_null) {
/* never quote NULL */
strncpy(buf, "NULL", buflen);
- ret = (int)SDB_MIN(buflen, 4);
+ ret = 4;
}
else if (data) {
if (quoted == SDB_UNQUOTED)
@@ -1045,7 +1062,8 @@ sdb_data_format(const sdb_data_t *datum, char *buf, size_t buflen, int quoted)
else
ret = snprintf(buf, buflen, "\"%s\"", data);
}
- buf[buflen - 1] = '\0';
+ if (buflen > 0)
+ buf[buflen - 1] = '\0';
return ret;
} /* sdb_data_format */