create static method in BriskDB function to allow constructor fail and manage of...
[brisk.git] / web / admin.php
1 <?php
2   /*
3    *  brisk - admin.php
4    *
5    *  Copyright (C) 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 $G_base = "";
26     
27 require_once("Obj/brisk.phh");
28 require_once("Obj/dbase_pgsql.phh");
29
30 ini_set("max_execution_time",  "300");
31
32 class ImpPoints
33 {
34     var $time;
35     var $tsess;
36     var $user_sess;
37     var $isauth;
38     var $username;
39     var $useraddr;
40     var $where;
41     var $ttok;
42     var $tidx;
43     var $nplayers;
44     var $logins;
45     var $pts;
46     
47     function ImpPoints($s)
48     {
49         // error_log($s, 0);
50         $arr = explode('|', $s);
51         // error_log("TTOK: ".count($arr), 0);
52
53         if (count($arr) != 20) {
54             error_log("COUNT: ".count($arr));
55             return FALSE;
56         }
57
58  
59         $this->time      = $arr[0];
60         $this->usess     = $arr[1];
61         $this->isauth    = $arr[2];
62         $this->username  = $arr[3];
63         $this->useraddr  = $arr[4];
64         $this->where     = $arr[5];
65         $this->ttok      = $arr[6];
66         $this->tidx      = $arr[7];
67         $this->nplayers  = $arr[8];
68         
69         $this->logins = array();
70         $this->pts    = array();
71
72         for ($i = 9 ; $i < 19 ; $i+=2) {
73             $idx = ($i - 9) / 2;
74             $this->logins[$idx] = strtolower($arr[$i]);
75             $this->pts[$idx]    = $arr[$i+1];
76         }
77     }
78 }
79
80 $cont = "";
81
82 function main()
83 {
84     GLOBAL $cont, $G_dbpfx, $G_alarm_passwd, $F_pass_private, $F_ACT, $F_filename;
85
86     
87     if (FALSE && $F_pass_private != $G_alarm_passwd) {
88         $cont .= sprintf("Wrong password, operation aborted.<br>\n");
89         return;
90     }
91
92     if ($F_ACT == "append") {
93         do {
94             /*
95             if ($F_pass_private != $G_alarm_passwd) {
96                 $cont .= sprintf("Wrong password, operation aborted.<br>\n");
97                 break;
98                 }*/
99             $cont .= sprintf("FILENAME: %s<br>\n", $F_filename); 
100             if (($olddb = new LoginDBOld($F_filename)) == FALSE) {
101                 $cont .= sprintf("Loading failed.<br>\n"); 
102                 break;
103             }
104
105             if (($newdb = BriskDB::create()) == FALSE) {
106                 $cont .= sprintf("Database connection failed.<br>\n"); 
107                 break;
108             }
109             $newdb->users_load();
110             if ($newdb->addusers_from_olddb($olddb, $cont) == FALSE) {
111                 $cont .= sprintf("Insert failed.<br>\n"); 
112             }
113             $cont .= sprintf("<b>SUCCESS</b><br>Item number: %d<br>\n", $olddb->count());
114         } while (0);
115     }
116     else if ($F_ACT == "pointsimp") {
117         do {
118             if (!file_exists($F_filename)) {
119                 $cont .= sprintf("File [%s] not exists.<br>\n", $F_filename); 
120                 break;
121             }
122
123             $cont .= sprintf("FILENAME: %s<br>\n", $F_filename); 
124             
125             if (!($fp = @fopen($F_filename, "r"))) {
126                 $cont .= sprintf("Open file [%s] failed.<br>\n", $F_filename); 
127                 break;
128             }
129
130             if (($newdb = BriskDB::create()) == FALSE) {
131                 $cont .= sprintf("Database connection failed.<br>\n"); 
132                 break;
133             }
134
135             $newdb->users_load();
136             $dbconn = $newdb->getdbconn();
137             for ($pts_n = 0 ;  !feof($fp) ; $pts_n++) {
138                 $bf = fgets($fp, 4096);
139                 if ($bf == FALSE)
140                     break;
141
142                 if (($pts = new ImpPoints($bf)) == FALSE) {
143                     $cont .= sprintf("Import failed at line [%s]<br>\n", eschtml($bf));
144                     break;
145                 }
146                 if ($pts->time < 1285884000) {
147                     continue;
148                 }
149                 // else {
150                 //     $cont .= sprintf("ttok: %s<br>\n", $pts->ttok);
151                 // }
152             
153                 /*
154                  * matches management
155                  */
156                 $mtc_sql = sprintf("SELECT * FROM %sbin5_matches WHERE ttok = '%s';", $G_dbpfx, escsql($pts->ttok));
157                 if (($mtc_pg  = pg_query($dbconn->db(), $mtc_sql)) == FALSE || pg_numrows($mtc_pg) != 1) {
158                     // match not exists, insert it
159                     $mtc_sql = sprintf("INSERT INTO %sbin5_matches (ttok, tidx) VALUES ('%s', %d) RETURNING *;",
160                                        $G_dbpfx, escsql($pts->ttok), $pts->tidx);
161                     if ( ! (($mtc_pg  = pg_query($dbconn->db(), $mtc_sql)) != FALSE && 
162                             pg_affected_rows($mtc_pg) == 1) ) {
163                         $cont .= sprintf("Matches insert failed at line [%s] [%s]<br>\n", 
164                                          eschtml($bf), eschtml($mtc_sql));
165                         break;                        
166                     }
167                     
168                 }
169                 $mtc_obj = pg_fetch_object($mtc_pg,0);
170                 // $cont .= sprintf("MTC: %s<br>\n", esclfhtml(print_r($mtc_obj, TRUE)));
171                 // $cont .= sprintf("pts_n: %d  mtc_match_code: %d<br>\n", $pts_n, $mtc_obj->code);
172
173                 /*
174                  * games management
175                  */
176                 $gam_sql = sprintf("SELECT * FROM %sbin5_games WHERE mcode = %d and tstamp = to_timestamp(%d);",
177                                    $G_dbpfx, $mtc_obj->code, $pts->time);
178                 if (($gam_pg  = pg_query($dbconn->db(), $gam_sql)) == FALSE || pg_numrows($gam_pg) != 1) {
179                     // match not exists, insert it
180                     $gam_sql = sprintf("INSERT INTO %sbin5_games (mcode, tstamp) 
181                                                VALUES (%d, to_timestamp(%d)) RETURNING *;",
182                                        $G_dbpfx, $mtc_obj->code, $pts->time);
183                     if ( ! (($gam_pg  = pg_query($dbconn->db(), $gam_sql)) != FALSE && 
184                             pg_affected_rows($gam_pg) == 1) ) {
185                         $cont .= sprintf("Games insert failed at line [%s] [%s]<br>\n", 
186                                          eschtml($bf), eschtml($gam_sql));
187                         break;                        
188                     }
189                 }
190                 $gam_obj = pg_fetch_object($gam_pg,0);
191                 // $cont .= sprintf("GAM: %s<br>\n", esclfhtml(print_r($gam_obj, TRUE)));
192                 // $cont .= sprintf("pts_n: %d  mtc_match_code: %d<br>\n", $pts_n, $gam_obj->code);
193
194                 /*
195                  * points management
196                  */
197                 for ($i = 0 ; $i < 5 ; $i++) {
198                     /* get the login associated code */
199                     $usr_sql = sprintf("SELECT * FROM %susers WHERE login = '%s';",
200                                        $G_dbpfx, escsql($pts->logins[$i]));
201                     if (($usr_pg  = pg_query($dbconn->db(), $usr_sql)) == FALSE || pg_numrows($usr_pg) != 1) {
202                         $cont .= sprintf("User [%s] not found [%s]<br>\n", eschtml($pts->logins[$i]), eschtml($usr_sql));
203                         save_rej($pts->logins[$i]);
204                         continue;
205                     }
206                     $usr_obj = pg_fetch_object($usr_pg,0);
207                     
208                     /* put points */
209                     $pts_sql = sprintf("INSERT INTO %sbin5_points (gcode, ucode, pts) 
210                                                VALUES (%d, %d, %d) RETURNING *;",
211                                        $G_dbpfx, $gam_obj->code, $usr_obj->code, $pts->pts[$i]);
212                     if ( ! (($pts_pg  = pg_query($dbconn->db(), $pts_sql)) != FALSE && 
213                             pg_affected_rows($pts_pg) == 1) ) {
214                         $cont .= sprintf("Point insert failed at line [%s] [%s] idx: [%d]<br>\n", 
215                                          eschtml($bf), eschtml($gam_sql), $i);
216                         break;
217                     }
218                     
219                 }
220                 
221             }
222             fclose($fp);
223         } while (0);
224         $cont .= sprintf("FINE FILE<br>\n");
225     }
226 }
227
228 function save_rej($s)
229 {
230     if (($fp = fopen(LEGAL_PATH."/rej.txt", "a+")) == FALSE)
231         return;
232
233     fwrite($fp, sprintf("%s\n", $s));
234     fclose($fp);
235     
236 }
237
238 main();
239
240 ?>
241 <html>
242 <head>
243 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
244 </head>
245 <body>
246
247 <?php
248 echo "$cont";
249 ?>
250 <b>Append users from a file</b><br>
251 <form accept-charset="utf-8" method="post" action="<?php echo $PHP_SELF;?>">
252       <input type="hidden" name="F_ACT" value="append">
253       <table><tr><td>Admin Password:</td>
254       <td><input name="F_pass_private" type="password" value=""></td></tr>
255       <tr><td>Filename:</td>
256       <td><input type="text" name="F_filename"></td></tr>
257       <tr><td colspan=2><input type="submit" value="append users"></td></tr>
258       </table>
259 </form>
260 <hr>
261 <b>Points importer from file to db</b><br>
262 <form accept-charset="utf-8" method="post" action="<?php echo $PHP_SELF;?>">
263       <input type="hidden" name="F_ACT" value="pointsimp">
264       <table><tr><td>Admin Password:</td>
265       <td><input name="F_pass_private" type="password" value=""></td></tr>
266       <tr><td>Filename:</td>
267       <td><input type="text" name="F_filename"></td></tr>
268       <tr><td colspan=2><input type="submit" value="import points"></td></tr>
269       </table>
270 </form>
271
272
273 </body>
274 </html>