fix recovery of postgres connection
[brisk.git] / web / Obj / dbase_pgsql.phh
index f7cb1a9..7cd0c4b 100644 (file)
@@ -25,7 +25,7 @@
 require_once("${G_base}Obj/dbase_base.phh");
 
 $escsql_from = array( "\\",   "'"   );
-$escsql_to   = array( "\\\\", "\\'" );
+$escsql_to   = array( "\\\\", "''" );
 
 function escsql($s)
 {
@@ -62,8 +62,9 @@ class DBConn
     static function destroy()
     {
         if (DBConn::$dbcnnx != FALSE) {
+            $ret = pg_close(DBConn::$dbcnnx);
             DBConn::$dbcnnx = FALSE;
-            return (pg_close(DBConn::$dbcnnx));
+            return ($ret);
         }
         return TRUE;
     }
@@ -112,11 +113,13 @@ class BriskDB
 
     function query($sql)
     {
-        if (($res = pg_query($this->dbconn->db(), $sql)) == FALSE) {
+        if (($res = @pg_query($this->dbconn->db(), $sql)) == FALSE) {
+            error_log('pg_result_status: ' .  pg_result_status($res));
+            error_log('pg_connection_status: ' .  pg_connection_status($this->dbconn->db()));
             // try to recover the connection
             if (($this->dbconn = DBConn::recover()) == FALSE)
                 return FALSE;
-            return (pg_query($this->dbconn->db(), $sql));
+            return (@pg_query($this->dbconn->db(), $sql));
         }
 
         return ($res);
@@ -138,7 +141,7 @@ class BriskDB
         /* check the existence of the nick in the BriskDB */
         log_main("login_exists: ".$login);
 
-        $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s')",
+        $user_sql = sprintf("SELECT * FROM %susers WHERE login = '%s'",
                             $G_dbpfx, escsql($login));
         if (($user_pg = $this->query($user_sql)) != FALSE)
             if (pg_numrows($user_pg) == 1)
@@ -709,6 +712,7 @@ class BriskDB
             /*
              * matches management
              */
+            $codes_where = "";
             $mtc_sql = sprintf("UPDATE %sbin5_matches SET (mazzo_next, mult_next) = (%d, %d) WHERE ttok = '%s' RETURNING *;",
                                $G_dbpfx, $table->mazzo, $table->mult, $sql_ttok);
             if (($mtc_pg  = $this->query($mtc_sql)) == FALSE || pg_numrows($mtc_pg) != 1) {
@@ -729,12 +733,34 @@ class BriskDB
                         log_crit(sprintf("bin5_points_save: failed at insert table order [%s]", $ord_sql));
                         break;
                     }
+                    $codes_where .= sprintf("%scode = %d", ($i == 0  ? "" : " OR "), $ucodes[$i]);
                 }
                 if ($i < $n)
                     break;
+
+                $cnt_sql = sprintf("UPDATE %susers SET (match_cnt, game_cnt)
+                                        = (match_cnt+1, game_cnt+1) WHERE %s;",
+                                   $G_dbpfx, $codes_where);
+                error_log($cnt_sql);
+                if (($cnt_pg = $this->query($cnt_sql)) == FALSE || pg_affected_rows($cnt_pg) != $n) {
+                    log_crit(sprintf("bin5_points_save: failed increment match and game [%s]", $cnt_sql));
+                    break;
+                }
             }
             else {
                 $mtc_obj = pg_fetch_object($mtc_pg,0);
+
+                for ($i = 0 ; $i < $n ; $i++) {
+                    $codes_where .= sprintf("%scode = %d", ($i == 0 ? "" : " OR "), $ucodes[$i]);
+                }
+                $cnt_sql = sprintf("UPDATE %susers SET (game_cnt)
+                                        = (game_cnt+1) WHERE %s;",
+                                   $G_dbpfx, $codes_where);
+                error_log($cnt_sql);
+                if (($cnt_pg = $this->query($cnt_sql)) == FALSE || pg_affected_rows($cnt_pg) != $n) {
+                    log_crit(sprintf("bin5_points_save: failed increment game [%s]", $cnt_sql));
+                    break;
+                }
             }
 
             /*
@@ -832,6 +858,28 @@ INSERT INTO %smails (code, ucode, type, tstamp, subj, body_txt, body_htm, hash)
         return (TRUE);
     }
 
+    function usersnet_bycode($owner, $target)
+    {
+        GLOBAL $G_dbpfx;
+        $ret = FALSE;
+
+        $net_sql = sprintf("SELECT * FROM %susersnet WHERE owner = %d AND target = %d;",
+                            $G_dbpfx, $owner, $target);
+        if (($net_pg  = $this->query($net_sql)) == FALSE) {
+            return FALSE;
+        }
+        if (pg_numrows($net_pg) != 1)
+            return FALSE;
+
+        $net_obj = pg_fetch_object($net_pg, 0);
+
+        return (UsersNetItem::UsersNetItemFromRecord($net_obj));
+    }
+
+    function usersnet_default($owner, $target)
+    {
+        return (UsersNetItem::UsersNetItemDefaults($owner, $target));
+    }
 
 } // End class BriskDB