X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fdata.c;h=f489367a42218e35a94bbf64afbff7d6255442fb;hb=b0e3b4920d34fcf9a70671bc1c424384bd388a2b;hp=a796b21eef37a57c4cc422836f5386f5c11c14ba;hpb=47f31649186ace5c6cfe6742647dbb710c0f58e8;p=sysdb.git diff --git a/src/core/data.c b/src/core/data.c index a796b21..f489367 100644 --- a/src/core/data.c +++ b/src/core/data.c @@ -34,6 +34,8 @@ #include "core/data.h" #include "utils/error.h" +#include + #include #include @@ -200,20 +202,17 @@ data_concat(const sdb_data_t *d1, const sdb_data_t *d2, sdb_data_t *res) else return -1; - if (s1 || s2) { - new = malloc(len1 + len2 + 1); - if (! new) - return -1; - } - else - new = NULL; + assert(s1 && s2); + + new = malloc(len1 + len2 + 1); + if (! new) + return -1; if (len1) memcpy(new, s1, len1); if (len2) memcpy(new + len1, s2, len2); - if (new) - new[len1 + len2] = '\0'; + new[len1 + len2] = '\0'; res->type = d1->type; if (res->type == SDB_TYPE_STRING) { @@ -230,6 +229,8 @@ data_concat(const sdb_data_t *d1, const sdb_data_t *d2, sdb_data_t *res) * public API */ +const sdb_data_t SDB_DATA_NULL = SDB_DATA_INIT; + int sdb_data_copy(sdb_data_t *dst, const sdb_data_t *src) { @@ -390,6 +391,8 @@ sdb_data_isnull(const sdb_data_t *datum) { if (! datum) return 1; + if (datum->type == SDB_TYPE_NULL) + return 1; if ((datum->type == SDB_TYPE_STRING) && (! datum->data.string)) return 1; if ((datum->type == SDB_TYPE_BINARY) && (! datum->data.binary.datum)) @@ -423,6 +426,10 @@ sdb_data_expr_eval(int op, const sdb_data_t *d1, const sdb_data_t *d2, { if ((! d1) || (! d2) || (! res)) return -1; + if (sdb_data_isnull(d1) || sdb_data_isnull(d2)) { + *res = SDB_DATA_NULL; + return 0; + } switch (op) { case SDB_DATA_CONCAT: return data_concat(d1, d2, res); @@ -602,9 +609,9 @@ sdb_data_parse(char *str, int type, sdb_data_t *data) return -1; if (regcomp(&tmp.data.re.regex, tmp.data.re.raw, REG_EXTENDED | REG_ICASE | REG_NOSUB)) { - free(tmp.data.re.raw); sdb_log(SDB_LOG_ERR, "core: Failed to compile regular " "expression '%s'", tmp.data.re.raw); + free(tmp.data.re.raw); return -1; } if (! data) {