[sr-dev] git:5.0:16a54ceb: htable: handle blob/text columns when loading from database

Daniel-Constantin Mierla miconda at gmail.com
Tue Apr 4 13:56:39 CEST 2017


Module: kamailio
Branch: 5.0
Commit: 16a54ceb0b5443aebe8d6e6a87838847343b7f54
URL: https://github.com/kamailio/kamailio/commit/16a54ceb0b5443aebe8d6e6a87838847343b7f54

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2017-04-04T13:53:31+02:00

htable: handle blob/text columns when loading from database

- reported by Patrick Ginhoux

(cherry picked from commit 24e729698017b5d898a92cdf7acb024e44252b84)

---

Modified: src/modules/htable/ht_db.c

---

Diff:  https://github.com/kamailio/kamailio/commit/16a54ceb0b5443aebe8d6e6a87838847343b7f54.diff
Patch: https://github.com/kamailio/kamailio/commit/16a54ceb0b5443aebe8d6e6a87838847343b7f54.patch

---

diff --git a/src/modules/htable/ht_db.c b/src/modules/htable/ht_db.c
index 6ce3fc9..83a9f01 100644
--- a/src/modules/htable/ht_db.c
+++ b/src/modules/htable/ht_db.c
@@ -114,7 +114,8 @@ static char ht_name_buf[HT_NAME_BUF_SIZE];
 static int ht_pack_values(ht_t *ht, db1_res_t* db_res,
 		int row, int cols, str *hvalue)
 {
-	static char vbuf[4096];
+#define HTABLE_PACK_BUF_SIZE	4096
+	static char vbuf[HTABLE_PACK_BUF_SIZE];
 	int c;
 	int len;
 	char *p;
@@ -128,6 +129,8 @@ static int ht_pack_values(ht_t *ht, db1_res_t* db_res,
 			len += strlen(RES_ROWS(db_res)[row].values[c].val.string_val);
 		} else if(RES_ROWS(db_res)[row].values[c].type == DB1_STR) {
 			len += RES_ROWS(db_res)[row].values[c].val.str_val.len;
+		} else if(RES_ROWS(db_res)[row].values[c].type == DB1_BLOB) {
+			len += RES_ROWS(db_res)[row].values[c].val.blob_val.len;
 		} else if(RES_ROWS(db_res)[row].values[c].type == DB1_INT) {
 			len += 12;
 		} else {
@@ -135,8 +138,9 @@ static int ht_pack_values(ht_t *ht, db1_res_t* db_res,
 			return -1;
 		}
 	}
-	if(len + c>=4096) {
-		LM_ERR("too large values (need %d)\n", len+c);
+	if(len + c>=HTABLE_PACK_BUF_SIZE) {
+		LM_ERR("too large values (need %d, have %d)\n", len+c,
+				HTABLE_PACK_BUF_SIZE);
 		return -1;
 	}
 	p = vbuf;
@@ -151,6 +155,10 @@ static int ht_pack_values(ht_t *ht, db1_res_t* db_res,
 			strncpy(p, RES_ROWS(db_res)[row].values[c].val.str_val.s,
 				RES_ROWS(db_res)[row].values[c].val.str_val.len);
 			p += RES_ROWS(db_res)[row].values[c].val.str_val.len;
+		} else if(RES_ROWS(db_res)[row].values[c].type == DB1_BLOB) {
+			memcpy(p, RES_ROWS(db_res)[row].values[c].val.blob_val.s,
+				RES_ROWS(db_res)[row].values[c].val.blob_val.len);
+			p += RES_ROWS(db_res)[row].values[c].val.blob_val.len;
 		} else if(RES_ROWS(db_res)[row].values[c].type == DB1_INT) {
 			iv.s = sint2str(RES_ROWS(db_res)[row].values[c].val.int_val, &iv.len);
 			strncpy(p, iv.s, iv.len);
@@ -280,6 +288,14 @@ int ht_db_load_table(ht_t *ht, str *dbtable, int mode)
 				}
 				kname.len = (RES_ROWS(db_res)[i].values[0].val.str_val.len);
 				break;
+			case DB1_BLOB:
+				kname.s = (RES_ROWS(db_res)[i].values[0].val.blob_val.s);
+				if(kname.s==NULL) {
+					LM_ERR("null key in row %d\n", i);
+					goto error;
+				}
+				kname.len = (RES_ROWS(db_res)[i].values[0].val.blob_val.len);
+				break;
 			case DB1_STRING:
 				kname.s = (char*)(RES_ROWS(db_res)[i].values[0].val.string_val);
 				if(kname.s==NULL) {
@@ -392,6 +408,14 @@ int ht_db_load_table(ht_t *ht, str *dbtable, int mode)
 							}
 							str2sint(&kvalue, &val.n);
 							break;
+						case DB1_BLOB:
+							kvalue = RES_ROWS(db_res)[i].values[3].val.blob_val;
+							if(kvalue.s==NULL) {
+								LM_ERR("null value in row %d\n", i);
+								goto error;
+							}
+							str2sint(&kvalue, &val.n);
+							break;
 						case DB1_STRING:
 							kvalue.s = (char*)(RES_ROWS(db_res)[i].values[3].val.string_val);
 							if(kvalue.s==NULL) {
@@ -423,6 +447,14 @@ int ht_db_load_table(ht_t *ht, str *dbtable, int mode)
 							}
 							val.s = kvalue;
 							break;
+						case DB1_BLOB:
+							kvalue = RES_ROWS(db_res)[i].values[3].val.blob_val;
+							if(kvalue.s==NULL) {
+								LM_ERR("null value in row %d\n", i);
+								goto error;
+							}
+							val.s = kvalue;
+							break;
 						case DB1_STRING:
 							kvalue.s = (char*)(RES_ROWS(db_res)[i].values[3].val.string_val);
 							if(kvalue.s==NULL) {




More information about the sr-dev mailing list