Browse Source

lib/srdb1: helper function to reallocate the index for result rows

- useful for db connectors that don't know in advance the number of rows in result
Daniel-Constantin Mierla 11 năm trước cách đây
mục cha
commit
fea60616b9
2 tập tin đã thay đổi với 41 bổ sung0 xóa
  1. 33 0
      lib/srdb1/db_res.c
  2. 8 0
      lib/srdb1/db_res.h

+ 33 - 0
lib/srdb1/db_res.c

@@ -186,3 +186,36 @@ int db_allocate_rows(db1_res_t* _res)
 	
 	return 0;
 }
+
+/**
+ * Reallocate memory for rows.
+ * \param _res result set
+ * \param _nsize new number of rows in result set
+ * \return zero on success, negative on errors
+ */
+int db_reallocate_rows(db1_res_t* _res, int _nsize)
+{
+	int len;
+	int osize;
+	db_row_t *orows;
+
+	orows = RES_ROWS(_res);
+	osize = RES_ROW_N(_res);
+
+	RES_ROW_N(_res) = _nsize;
+	len = sizeof(db_row_t) * RES_ROW_N(_res);
+	RES_ROWS(_res) = (struct db_row*)pkg_malloc(len);
+	if (!RES_ROWS(_res)) {
+		LM_ERR("no private memory left\n");
+		return -1;
+	}
+	LM_DBG("allocate %d bytes for rows at %p\n", len, RES_ROWS(_res));
+	memset(RES_ROWS(_res), 0, len);
+
+	if(orows==NULL)
+		return 0;
+	memcpy(RES_ROWS(_res), orows,
+			((osize<_nsize)?osize:_nsize)*sizeof(db_row_t));
+	pkg_free(orows);
+	return 0;
+}

+ 8 - 0
lib/srdb1/db_res.h

@@ -131,4 +131,12 @@ int db_allocate_columns(db1_res_t* _r, const unsigned int cols);
  */
 int db_allocate_rows(db1_res_t* _res);
 
+/**
+ * Reallocate memory for rows.
+ * \param _res result set
+ * \param _nsize new number of rows in result set
+ * \return zero on success, negative on errors
+ */
+int db_reallocate_rows(db1_res_t* _res, int _nsize);
+
 #endif /* DB1_RES_H */