Procházet zdrojové kódy

- added support for fetch_result() in DB API
- drivers supporting fetch_result() will advertise DB_CAP_FETCH as capability
- added support for fetch_result() in mysql module
- usrloc modules uses fetch_result() if available when loads location records
- this removes the issue with loading huge numbers of location records which
required increase of PGK memory size and recompilation of OpenSER
- from the tests, with 1MB memory (default) the out of memory occured
approximately around row 4300
- usrloc has a new parameter 'fetch_rows' for tunning the number of the rows
to be fetched at once, default is 2000


git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@1012 689a6050-402a-0410-94f2-e92a70836424

Daniel-Constantin Mierla před 19 roky
rodič
revize
8351011745
4 změnil soubory, kde provedl 31 přidání a 14 odebrání
  1. 8 2
      lib/srdb1/db.c
  2. 17 11
      lib/srdb1/db.h
  3. 1 0
      lib/srdb1/db_cap.h
  4. 5 1
      lib/srdb1/db_res.h

+ 8 - 2
lib/srdb1/db.c

@@ -100,6 +100,12 @@ int bind_dbmod(char* mod, db_func_t* mydbf)
 		dbf.cap |= DB_CAP_QUERY;
 	}
 
+	dbf.fetch_result = (db_fetch_result_f)find_mod_export(tmp,
+			"db_fetch_result", 2, 0);
+	if (dbf.fetch_result) {
+		dbf.cap |= DB_CAP_FETCH;
+	}
+
 	dbf.raw_query = (db_raw_query_f)find_mod_export(tmp, "db_raw_query", 2, 0);
 	if (dbf.raw_query) {
 		dbf.cap |= DB_CAP_RAW_QUERY;
@@ -152,8 +158,8 @@ int table_version(db_func_t* dbf, db_con_t* connection, const str* table)
 {
 	db_key_t key[1], col[1];
 	db_val_t val[1];
-	db_res_t* res;
-	db_val_t* ver;
+	db_res_t* res = 0;
+	db_val_t* ver = 0;
 	int ret;
 
 	if (!dbf||!connection || !table) {

+ 17 - 11
lib/srdb1/db.h

@@ -82,6 +82,11 @@ typedef int (*db_query_f) (db_con_t* _h, db_key_t* _k,
 			   db_key_t* _c, int _n, int _nc,
 			   db_key_t _o, db_res_t** _r);
 
+/*
+ * Fetch number of rows from result !
+ */
+typedef int (*db_fetch_result_f) (db_con_t* _h, db_res_t** _r, int _n);
+
 
 /*
  * Raw SQL query, database specific !
@@ -139,17 +144,18 @@ typedef int (*db_replace_f) (db_con_t* handle, db_key_t* keys, db_val_t* vals, i
 
 
 typedef struct db_func {
-	unsigned int     cap;          /* Capability vector of the database transport */
-	db_use_table_f   use_table;    /* Specify table name */
-	db_init_f        init;         /* Initialize database connection */
-	db_close_f       close;        /* Close database connection */
-	db_query_f       query;        /* query a table */
-	db_raw_query_f   raw_query;    /* Raw query - SQL */
-	db_free_result_f free_result;  /* Free a query result */
-	db_insert_f      insert;       /* Insert into table */
-	db_delete_f      delete;       /* Delete from table */ 
-	db_update_f      update;       /* Update table */
-	db_replace_f     replace;      /* Replace row in a table */
+	unsigned int     cap;           /* Capability vector of the database transport */
+	db_use_table_f    use_table;     /* Specify table name */
+	db_init_f         init;          /* Initialize database connection */
+	db_close_f        close;         /* Close database connection */
+	db_query_f        query;         /* query a table */
+	db_fetch_result_f fetch_result; /* fetch result */
+	db_raw_query_f    raw_query;     /* Raw query - SQL */
+	db_free_result_f  free_result;   /* Free a query result */
+	db_insert_f       insert;        /* Insert into table */
+	db_delete_f       delete;        /* Delete from table */ 
+	db_update_f       update;        /* Update table */
+	db_replace_f      replace;       /* Replace row in a table */
 } db_func_t;
 
 

+ 1 - 0
lib/srdb1/db_cap.h

@@ -34,6 +34,7 @@ typedef enum db_cap {
 	DB_CAP_DELETE =    1 << 3,  /* Database driver can delete data from database */
 	DB_CAP_UPDATE =    1 << 4,  /* Database driver can update data in the database */
 	DB_CAP_REPLACE =   1 << 5,  /* Replace (also known as INSERT OR UPDATE) support */
+	DB_CAP_FETCH   =   1 << 6,  /* Fetch result support */
 } db_cap_t;
 
 

+ 5 - 1
lib/srdb1/db_res.h

@@ -37,7 +37,9 @@ typedef struct db_res {
 		int n;             /* Number of columns */
 	} col;
 	struct db_row* rows;       /* Rows */
-	int n;                     /* Number of rows */
+	int n;                     /* Number of rows in current fetch */
+	int res_rows;              /* Number of total rows in query */
+	int last_row;              /* Last row */
 } db_res_t;
 
 
@@ -46,6 +48,8 @@ typedef struct db_res {
 #define RES_COL_N(re) ((re)->col.n)
 #define RES_ROWS(re)  ((re)->rows)
 #define RES_ROW_N(re) ((re)->n)
+#define RES_LAST_ROW(re)  ((re)->last_row)
+#define RES_NUM_ROWS(re) ((re)->res_rows)
 
 
 #endif /* DB_RES_H */