8dbdfb6e70fd7d29012e23bd7b759f75beafd68c
[brisk.git] / web / Obj / dbase_pgsql.phh
1 <?php
2   /*
3    *  brisk - dbase_pgsql.phh
4    *
5    *  Copyright (C) 2006-2011 Matteo Nastasi
6    *                          mailto: nastasi@alternativeoutput.it 
7    *                                  matteo.nastasi@milug.org
8    *                          web: http://www.alternativeoutput.it
9    *
10    * This program is free software; you can redistribute it and/or modify
11    * it under the terms of the GNU General Public License as published by
12    * the Free Software Foundation; either version 2 of the License, or
13    * (at your option) any later version.
14    *
15    * This program is distributed in the hope that it will be useful, but
16    * WITHOUT ANY WARRANTY; without even the implied warranty of
17    * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18    * General Public License for more details. You should have received a
19    * copy of the GNU General Public License along with this program; if
20    * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21    * Suite 330, Boston, MA 02111-1307, USA.
22    *
23    */
24
25 require_once("${G_base}Obj/dbase_base.phh");
26
27 $escsql_from = array( "\\",   "'"   );
28 $escsql_to   = array( "\\\\", "\\'" );
29
30 function escsql($s)
31 {
32     GLOBAL $escsql_from, $escsql_to;
33
34     return str_replace($escsql_from, $escsql_to, $s);
35 }
36
37 class DBConn 
38 {
39     static $dbcnnx = FALSE;
40     var $db = FALSE;
41     
42     function DBConn()
43     {
44         $this->db = DBConn::$dbcnnx;        
45     }
46
47     static function create()
48     {
49         GLOBAL $G_dbauth;
50         
51         if (DBConn::$dbcnnx == FALSE) {
52             if (!(DBConn::$dbcnnx = @pg_connect ($G_dbauth))) {
53                 return (FALSE);
54             }
55         }
56
57         $out = new DBConn();
58         
59         return $out;
60     }
61     function db()
62     {
63         return ($this->db);
64     }
65 }
66
67 class BriskDB
68 {
69     var $dbconn;
70     var $item;
71     var $item_n;
72     
73     function BriskDB($dbconn)
74     {
75         $this->dbconn = $dbconn;
76     }
77
78     static function create()
79     {
80         GLOBAL $DOCUMENT_ROOT, $G_dbpfx;
81
82         $ret = FALSE;
83
84         log_main("BriskDB create:start");
85         
86         do {
87             if (($dbconn = DBConn::create()) == FALSE) 
88                 break;
89             
90             $ret = new BriskDB($dbconn);
91         } while (0);
92         
93         return ($ret);
94     }
95
96     function users_load()
97     {
98     }
99     
100     function login_exists($login)
101     {
102         GLOBAL $G_dbpfx;
103
104         /* check the existence of the nick in the BriskDB */
105         log_main("login_exists: ".$login);
106         
107         $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s') AND (type & CAST (X'%08x' as integer)) = 0;",
108                             $G_dbpfx, escsql($login), USER_FLAG_TY_DISABLE);
109         if (($user_pg  = pg_query($this->dbconn->db(), $user_sql)) != FALSE)
110             if (pg_numrows($user_pg) == 1)
111                 return TRUE;
112         
113         return FALSE;
114     }
115
116     function getrecord_bylogin($login) {
117         GLOBAL $G_dbpfx;
118
119         $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s') AND (type & CAST (X'%08x' as integer)) = 0;",  $G_dbpfx, escsql($login), USER_FLAG_TY_DISABLE);
120         if (($user_pg  = pg_query($this->dbconn->db(), $user_sql)) == FALSE)
121             return FALSE;
122         
123         if (pg_numrows($user_pg) != 1)
124             return FALSE;
125         
126         $user_obj = pg_fetch_object($user_pg, 0);
127
128         return ($user_obj);
129     }
130
131
132     
133     function login_verify($login, $pass)
134     {
135         GLOBAL $G_dbpfx;
136         
137         $ret = FALSE;
138         
139         log_main("login_verify: ".$login);
140         
141         
142         //O /* check the existence of the nick in the BriskDB */
143         //O for ($i = 0 ; $i < $this->item_n ; $i++) {
144         //O log_main("login_verify: BEGIN");
145         
146         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE) {
147             return FALSE;
148         }
149
150         log_main("login[".$user_obj->code."]: ".$user_obj->login);
151         
152         /* if it exists check for a valid challenge */
153         if (($a_sem = Challenges::lock_data()) != FALSE) { 
154             if (($chals = &Challenges::load_data()) != FALSE) {
155                 for ($e = 0 ; $e < $chals->item_n ; $e++) {
156                     log_main("challenge[".$e."]: ".$chals->item[$e]->login);
157                     if (strcmp($login, $chals->item[$e]->login) == 0) {
158                         log_main("login_verify [".$pass."] with [".md5($chals->item[$e]->token.$user_obj->pass)."]");
159                         
160                         if (strcmp($pass, md5($chals->item[$e]->token.$user_obj->pass)) == 0) {
161                             log_main("login_verify SUCCESS for ".$login);
162                             
163                             $chals->rem($login);
164                             $ret = LoginDBItem::LoginDBItemFromRecord($user_obj);
165                             break;
166                         }
167                     }
168                 } // end for ($e = 0 ...
169             }
170             
171             if ($chals->ismod()) {
172                 Challenges::save_data(&$chals);
173             }
174             
175             Challenges::unlock_data($a_sem);
176         }
177         //O break;
178         // O } //  if (strcasecmp($this->item[$i]->login, ...
179         //O }
180     
181         return ($ret);
182     }
183
184     function getitem_bylogin($login, &$id) {
185         $ret = FALSE;
186         $id = -1;
187         
188         log_main("getitem_bylogin: ".$login);
189         
190         if (($user_obj = $this->getrecord_bylogin($login)) == FALSE)
191             return $ret;
192
193         $id = $user_obj->code;
194         return (LoginDBItem::LoginDBItemFromRecord($user_obj));
195     }
196     
197     // TODO FOR DB
198     function getmail($login)
199     {
200         log_main("getmail");
201
202         if (($ret = $this->getrecord_bylogin($login)) == FALSE)
203             return FALSE;
204         
205         return ($ret->email);
206     }
207
208     function addusers_from_olddb($olddb, &$cont)
209     {
210         GLOBAL $G_dbpfx;
211
212         for ($i = 0 ; $i < $olddb->count() ; $i++) {
213             $user_sql = sprintf("INSERT INTO %susers ( login, pass, email, type) VALUES ('%s', '%s', '%s', %d);",
214                                 $G_dbpfx, escsql(strtolower($olddb->item[$i]->login)), escsql($olddb->item[$i]->pass),
215                                 escsql($olddb->item[$i]->email), $olddb->item[$i]->type & USER_FLAG_TY_ALL); 
216             
217             // if ( ! (($user_pg = pg_exec($dbconn,$order_add_sql)) != FALSE && pg_affected_rows($order_pg) == 1) ) {
218
219             if ( ! (($user_pg  = pg_query($this->dbconn->db(), $user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) {
220                 $cont .= sprintf("ERROR IN LINE: %s\n", eschtml($user_sql));
221
222                 return FALSE;
223             }
224         }
225         return TRUE;
226     }
227
228     function getdbconn()
229     {
230         return ($this->dbconn);
231     }
232
233     //   ttok   text UNIQUE,      
234     //   tidx   
235     function bin5_points_save($date, $ttok, $tidx, $ucodes, $pts)
236     {
237         GLOBAL $G_dbpfx;
238
239         $is_trans = FALSE;
240         $ret = FALSE;
241
242         $n = count($ucodes);
243         /* check the existence of the nick in the BriskDB */
244         log_main("bin5_points_save: ");
245         
246         do {
247             if (pg_query($this->dbconn->db(), "BEGIN") == FALSE) {
248                 break;
249             }
250             $is_trans = TRUE;
251
252             /*
253              * matches management
254              */
255             $mtc_sql = sprintf("SELECT * FROM %sbin5_matches WHERE ttok = '%s';", $G_dbpfx, escsql($ttok));
256             if (($mtc_pg  = pg_query($this->dbconn->db(), $mtc_sql)) == FALSE || pg_numrows($mtc_pg) != 1) {
257                 // match not exists, insert it
258                 $mtc_sql = sprintf("INSERT INTO %sbin5_matches (ttok, tidx) VALUES ('%s', %d) RETURNING *;",
259                                    $G_dbpfx, escsql($ttok), $tidx);
260                 if ( ! (($mtc_pg  = pg_query($this->dbconn->db(), $mtc_sql)) != FALSE && 
261                         pg_affected_rows($mtc_pg) == 1) ) {
262                     log_crit(sprintf("bin5_points_save: failed at insert match [%s]", $mtc_sql));
263                     break;
264                 }
265             }
266             $mtc_obj = pg_fetch_object($mtc_pg,0);
267
268             /*
269              * games management
270              */
271             $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp) 
272                                                VALUES (%d, to_timestamp(%d)) RETURNING *;",
273                                $G_dbpfx, $mtc_obj->code, $date);
274             if ( ! (($gam_pg  = pg_query($this->dbconn->db(), $gam_sql)) != FALSE && 
275                     pg_affected_rows($gam_pg) == 1) ) {
276                 log_crit(sprintf("bin5_points_save: failed at insert game [%s]", $gam_sql));
277                 break;                        
278             }
279         
280             $gam_obj = pg_fetch_object($gam_pg,0);
281
282             /*
283              * points management
284              */
285             for ($i = 0 ; $i < $n ; $i++) {
286                 /* put points */
287                 $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts) 
288                                                VALUES (%d, %d, %d);",
289                                    $G_dbpfx, $gam_obj->code, $ucodes[$i], $pts[$i]);
290                 if ( ! (($pts_pg  = pg_query($this->dbconn->db(), $pts_sql)) != FALSE && 
291                         pg_affected_rows($pts_pg) == 1) ) {
292                     log_crit(sprintf("bin5_points_save: failed at insert point [%s]", $pts_sql));
293                     break;                        
294                 }
295             }
296
297             if ($i < $n)
298                 break;
299             
300             if (pg_query($this->dbconn->db(), "COMMIT") == FALSE) {
301                 break;
302             }
303              
304             $is_trans = FALSE;
305
306             $ret =  TRUE;
307         } while (0);
308         
309         if ($is_trans)
310             pg_query($this->dbconn-db(), "ROLLBACK");
311         
312         return $ret;
313     }
314
315 } // End class BriskDB
316
317 class LoginDBOld 
318 {
319     var $item;
320     var $item_n;
321
322     function LoginDBOld($filename)
323     {
324         GLOBAL $DOCUMENT_ROOT;
325         log_main("LoginDBOld create:start");
326
327         if (file_exists("$DOCUMENT_ROOT/Etc/".$filename)) {
328             require("$DOCUMENT_ROOT/Etc/".$filename);
329         }
330         else {
331             return (FALSE);
332         }
333         $this->item_n = count($this->item);
334         log_main("LoginDBOld create:end");
335     }
336
337     function count()
338     {
339         return ($this->item_n);
340     }
341
342 } // End class LoginDBOld
343
344 ?>