Prechádzať zdrojové kódy

lib/srdb1: Fixed problem with the new bitwise and DB operation

- In MySQL you can do "select * from table where value&mask;" but that
  is not actually correct SQL and fails on other DBs (specifically
  PostgreSQL).  The correct SQL is
  "select * from table where value&mask=mask;"
pd 14 rokov pred
rodič
commit
da4e2976f0
1 zmenil súbory, kde vykonal 25 pridanie a 11 odobranie
  1. 25 11
      lib/srdb1/db_ut.c

+ 25 - 11
lib/srdb1/db_ut.c

@@ -334,21 +334,35 @@ int db_print_where(const db1_con_t* _c, char* _b, const int _l, const db_key_t*
 	}
 	}
 
 
 	for(i = 0; i < _n; i++) {
 	for(i = 0; i < _n; i++) {
-		if (_o) {
-			ret = snprintf(_b + len, _l - len, "%.*s%s", _k[i]->len, _k[i]->s, _o[i]);
+		if (_o && strncmp(_o[i], OP_BITWISE_AND, 1) == 0) {
+			char tmp_buf[16];
+			int tmp_len = 15;
+			memset(tmp_buf, '0', 16);
+			if ((*val2str)(_c, &(_v[i]), tmp_buf, &tmp_len) < 0) {
+				LM_ERR("Error while converting value to string\n");
+				return -1;
+			}
+			ret = snprintf(_b + len, _l - len, "%.*s&%.*s=%.*s", _k[i]->len, _k[i]->s, tmp_len, tmp_buf, tmp_len, tmp_buf);
 			if (ret < 0 || ret >= (_l - len)) goto error;
 			if (ret < 0 || ret >= (_l - len)) goto error;
 			len += ret;
 			len += ret;
 		} else {
 		} else {
-			ret = snprintf(_b + len, _l - len, "%.*s=", _k[i]->len, _k[i]->s);
-			if (ret < 0 || ret >= (_l - len)) goto error;
-			len += ret;
-		}
-		l = _l - len;
-		if ( (*val2str)(_c, &(_v[i]), _b + len, &l) < 0) {
-			LM_ERR("Error while converting value to string\n");
-			return -1;
+			if (_o) {
+				ret = snprintf(_b + len, _l - len, "%.*s%s", _k[i]->len, _k[i]->s, _o[i]);
+				if (ret < 0 || ret >= (_l - len)) goto error;
+				len += ret;
+			} else {
+				ret = snprintf(_b + len, _l - len, "%.*s=", _k[i]->len, _k[i]->s);
+				if (ret < 0 || ret >= (_l - len)) goto error;
+				len += ret;
+			}
+			l = _l - len;
+			if ( (*val2str)(_c, &(_v[i]), _b + len, &l) < 0) {
+				LM_ERR("Error while converting value to string\n");
+				return -1;
+			}
+			len += l;
 		}
 		}
-		len += l;
+
 		if (i != (_n - 1)) {
 		if (i != (_n - 1)) {
 			ret = snprintf(_b + len, _l - len, " AND ");
 			ret = snprintf(_b + len, _l - len, " AND ");
 			if (ret < 0 || ret >= (_l - len)) goto error;
 			if (ret < 0 || ret >= (_l - len)) goto error;