diff --git a/src/core/data.c b/src/core/data.c
index 2665165a0970e98075a702bbea020e3803e35cab..9f2b506fbc1b76e66dd330be7879655a530871ba 100644 (file)
--- a/src/core/data.c
+++ b/src/core/data.c
v[i] = NULL;
}
}
+ else if (type == SDB_TYPE_BINARY) {
+ struct {
+ size_t length;
+ unsigned char *datum;
+ } *v = datum->data.array.values;
+ size_t i;
+
+ for (i = 0; i < datum->data.array.length; ++i) {
+ if (v[i].datum)
+ free(v[i].datum);
+ v[i].datum = NULL;
+ }
+ }
+ else if (type == SDB_TYPE_REGEX) {
+ struct {
+ char *raw;
+ regex_t regex;
+ } *v = datum->data.array.values;
+ size_t i;
+
+ for (i = 0; i < datum->data.array.length; ++i) {
+ if (v[i].raw) {
+ free(v[i].raw);
+ regfree(&v[i].regex);
+ }
+ v[i].raw = NULL;
+ }
+ }
} /* free_array_values */
/* compare two arrays element-by-element returning how the first non-equal
if (! datum)
return 0;
- if (datum->type == SDB_TYPE_INTEGER) {
+ if (sdb_data_isnull(datum)) {
+ /* NULL */
+ return 4;
+ }
+ else if (datum->type == SDB_TYPE_INTEGER) {
/* log(64) */
return 20;
}
if ((! datum) || (! buf) || (! buflen))
return -1;
- if (datum->type == SDB_TYPE_INTEGER) {
+ if (datum->type == SDB_TYPE_NULL) {
+ strncpy(buf, "NULL", buflen);
+ ret = 4;
+ }
+ else if (datum->type == SDB_TYPE_INTEGER) {
ret = snprintf(buf, buflen, "%"PRIi64, datum->data.integer);
}
else if (datum->type == SDB_TYPE_DECIMAL) {
@@ -1014,12 +1050,17 @@ sdb_data_format(const sdb_data_t *datum, char *buf, size_t buflen, int quoted)
} /* sdb_data_format */
int
-sdb_data_parse(char *str, int type, sdb_data_t *data)
+sdb_data_parse(const char *str, int type, sdb_data_t *data)
{
sdb_data_t tmp;
char *endptr = NULL;
+ if (! str) {
+ errno = EINVAL;
+ return -1;
+ }
+
errno = 0;
if (type == SDB_TYPE_INTEGER) {
tmp.data.integer = strtoll(str, &endptr, 0);
tmp.data.decimal = strtod(str, &endptr);
}
else if (type == SDB_TYPE_STRING) {
- tmp.data.string = str;
+ tmp.data.string = strdup(str);
+ if (! tmp.data.string)
+ return -1;
}
else if (type == SDB_TYPE_DATETIME) {
double datetime = strtod(str, &endptr);
tmp.data.datetime = DOUBLE_TO_SDB_TIME(datetime);
}
else if (type == SDB_TYPE_BINARY) {
- /* we don't support any binary information containing 0-bytes */
+ /* we don't support any binary information containing 0-bytes here */
+ tmp.data.binary.datum = (unsigned char *)strdup(str);
+ if (! tmp.data.binary.datum)
+ return -1;
tmp.data.binary.length = strlen(str);
- tmp.data.binary.datum = (unsigned char *)str;
}
else if (type == SDB_TYPE_REGEX) {
tmp.data.re.raw = strdup(str);