X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Fdata.c;h=9f2b506fbc1b76e66dd330be7879655a530871ba;hp=2665165a0970e98075a702bbea020e3803e35cab;hb=7ee46a4a7e492518a56df4a8ae3f1bd88adf88b8;hpb=bd9863d23596c42cbd1b5d7a63425fce90420c3a diff --git a/src/core/data.c b/src/core/data.c index 2665165..9f2b506 100644 --- a/src/core/data.c +++ b/src/core/data.c @@ -166,6 +166,34 @@ free_array_values(sdb_data_t *datum) 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 @@ -843,7 +871,11 @@ sdb_data_strlen(const sdb_data_t *datum) 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; } @@ -899,7 +931,11 @@ sdb_data_format(const sdb_data_t *datum, char *buf, size_t buflen, int quoted) 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); @@ -1028,16 +1069,20 @@ sdb_data_parse(char *str, int type, sdb_data_t *data) 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);