Module: sip-router
Branch: master
Commit: b200828b1fc13e44a098be6f26294c842444c1f6
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b200828b1fc13e44a098be6f26294c842444c1f6

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date:   Tue Jan 11 23:08:25 2011 +0100

db_postgres: reconnect support for DB API v1

- attept to reconnect to postgres server upon bad connection (e.g.,
  connection lost)
- number of retries can be set via command line parameter, reusing
  exisiting one from DB API v2

---

 modules/db_postgres/km_dbase.c |   35 +++++++++++++++++++++++------------
 1 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/modules/db_postgres/km_dbase.c b/modules/db_postgres/km_dbase.c
index 953a33e..649c945 100644
--- a/modules/db_postgres/km_dbase.c
+++ b/modules/db_postgres/km_dbase.c
@@ -78,6 +78,7 @@
 #include "km_pg_con.h"
 #include "km_val.h"
 #include "km_res.h"
+#include "pg_mod.h"
 
 static void db_postgres_free_query(const db1_con_t* _con);
 
@@ -113,6 +114,8 @@ void db_postgres_close(db1_con_t* _h)
  */
 static int db_postgres_submit_query(const db1_con_t* _con, const str* _s)
 {
+       int i;
+
        if(! _con || !_s || !_s->s)
        {
                LM_ERR("invalid parameter value\n");
@@ -141,19 +144,27 @@ static int db_postgres_submit_query(const db1_con_t* 
_con, const str* _s)
                        return -1;
        }
 
-       /* free any previous query that is laying about */
-       db_postgres_free_query(_con);
-
-       /* exec the query */
-       if (PQsendQuery(CON_CONNECTION(_con), _s->s)) {
-               LM_DBG("%p PQsendQuery(%.*s)\n", _con, _s->len, _s->s);
-       } else {
-               LM_ERR("%p PQsendQuery Error: %s Query: %.*s\n", _con,
-               PQerrorMessage(CON_CONNECTION(_con)), _s->len, _s->s);
-               return -1;
+       for(i = 0; i <= pg_retries; i++) {
+               /* free any previous query that is laying about */
+               db_postgres_free_query(_con);
+               /* exec the query */
+               if (PQsendQuery(CON_CONNECTION(_con), _s->s)) {
+                       LM_DBG("sending query ok: %p - [%.*s]\n",
+                                       _con, _s->len, _s->s);
+                       return 0;
+               }
+               LM_WARN("sending postgres command failed, connection status %d,"
+                               " error [%s]\n", PQstatus(CON_CONNECTION(_con)),
+                               PQerrorMessage(CON_CONNECTION(_con)));
+               if(PQstatus(CON_CONNECTION(_con))!=CONNECTION_OK)
+               {
+                       LM_DBG("reseting the connection to postgress server\n");
+                       PQreset(CON_CONNECTION(_con));
+               }
        }
-
-       return 0;
+       LM_ERR("%p PQsendQuery Error: %s Query: %.*s\n", _con,
+       PQerrorMessage(CON_CONNECTION(_con)), _s->len, _s->s);
+       return -1;
 }
 
 


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to