CLEANUP: better debugging option for DB querries
[e-DoKo.git] / include / db.php
1 <?php
2 /* make sure that we are not called from outside the scripts,
3  * use a variable defined in config.php to check this
4  */
5 if(!isset($HOST))
6   exit;
7
8 /*
9  * open database
10  */
11
12 function DB_open()
13 {
14   global $DB,$DB_user,$DB_host,$DB_database,$DB_password;
15   $DB = @mysql_connect($DB_host,$DB_user, $DB_password);
16   if ( $DB )
17     {
18       mysql_select_db($DB_database) or die('Could not select database');
19     }
20   else
21     return -1;
22
23   return 0;
24 }
25
26 function DB_close()
27 {
28   global $DB;
29   mysql_close($DB);
30   return;
31 }
32
33 function DB_quote_smart($value)
34 {
35     /* Stripslashes */
36     if (get_magic_quotes_gpc()) {
37         $value = stripslashes($value);
38     }
39     /* Quote if not a number or a numeric string */
40     if (!is_numeric($value)) {
41         $value = "'" . mysql_real_escape_string($value) . "'";
42     }
43     return $value;
44 }
45
46 function DB_test()
47 {
48   $result = DB_query("SELECT * FROM User");
49   while($r = DB_fetch_array($result))
50     {
51       foreach($r as $thing)
52         echo "  $thing ";
53       echo "<br />\n";
54     }
55   return;
56 }
57
58 /* use Mysql in the background */
59 function DB_query($query)
60 {
61   /* debug/optimize the database
62   $time = microtime();
63   $return = mysql_query($query);
64   $time = $time - microtime();
65
66   if($time > 0.05) // this way we can find only the long ones
67   {
68     $logfile=fopen('/tmp/DBlog.log','a+');
69     fwrite($logfile,"EXPLAIN $query ;\n");
70     fwrite($logfile,"time of above query: $time\n");
71     fclose($logfile);
72   };
73
74   return $return;
75   */
76
77   return mysql_query($query);
78 }
79
80 function DB_fetch_array($result)
81 {
82   return mysql_fetch_array($result,MYSQL_NUM);
83 }
84
85 function DB_insert_id()
86 {
87   return mysql_insert_id();
88 }
89
90 function DB_num_rows($result)
91 {
92   return mysql_num_rows($result);
93 }
94 /* end Mysql functions */
95
96 function DB_query_array($query)
97 {
98   $result = DB_query($query);
99   $return = DB_fetch_array($result);
100
101   return $return;
102 }
103
104 function DB_query_array_all($query)
105 {
106   $result = array();
107
108   $queryresult  = DB_query($query);
109   while($row = DB_fetch_array($queryresult))
110     $result[] = $row;
111
112   return $result;
113 }
114
115 function DB_get_passwd_by_name($name)
116 {
117   $r = DB_query_array("SELECT password FROM User WHERE fullname=".DB_quote_smart($name)."");
118
119   if($r)
120     return $r[0];
121   else
122     return "";
123 }
124
125 function DB_get_passwd_by_userid($id)
126 {
127   $r = DB_query_array("SELECT password FROM User WHERE id=".DB_quote_smart($id)."");
128
129   if($r)
130     return $r[0];
131   else
132     return "";
133 }
134
135 function DB_check_recovery_passwords($password,$email)
136 {
137   $r = DB_query_array("SELECT User.id FROM User".
138                       " LEFT JOIN Recovery ON User.id=Recovery.user_id".
139                       " WHERE email=".DB_quote_smart($email).
140                       " AND Recovery.password=".DB_quote_smart($password).
141                       " AND DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= Recovery.create_date");
142   if($r)
143     return 1;
144   else
145     return 0;
146 }
147
148 function DB_get_handid($type,$var1='',$var2='')
149 {
150   switch($type)
151     {
152     case 'hash':
153       $r = DB_query_array("SELECT id FROM Hand WHERE hash=".DB_quote_smart($var1));
154       break;
155     case 'gameid-position':
156       $r = DB_query_array("SELECT id FROM Hand WHERE game_id=".
157                           DB_quote_smart($var1)." AND position=".
158                           DB_quote_smart($var2));
159       break;
160     case 'gameid-userid':
161       $r = DB_query_array("SELECT id FROM Hand WHERE game_id=".
162                           DB_quote_smart($var1)." AND user_id=".
163                           DB_quote_smart($var2));
164       break;
165     }
166
167   if($r)
168     return $r[0];
169   else
170     return 0;
171 }
172
173 function DB_get_pos_by_hash($hash)
174 {
175   $r= DB_query_array("SELECT position FROM Hand WHERE hash=".DB_quote_smart($hash));
176
177   if($r)
178     return $r[0];
179   else
180     return 0;
181 }
182
183 function DB_get_status_by_hash($hash)
184 {
185   $r= DB_query_array("SELECT status FROM Hand WHERE hash=".DB_quote_smart($hash));
186
187   if($r)
188     return $r[0];
189   else
190     return 0;
191 }
192
193 function DB_set_game_status_by_gameid($id,$status)
194 {
195   DB_query("UPDATE Game SET status='".$status."' WHERE id=".DB_quote_smart($id));
196   return;
197 }
198
199 function DB_set_sickness_by_gameid($id,$status)
200 {
201   DB_query("UPDATE Game SET sickness='".$status."' WHERE id=".DB_quote_smart($id));
202   return;
203 }
204 function DB_get_sickness_by_gameid($id)
205 {
206   $r = DB_query_array("SELECT sickness FROM Game WHERE id=".DB_quote_smart($id));
207
208   if($r)
209     return $r[0];
210   else
211     return NULL;
212 }
213
214 function DB_get_game_status_by_gameid($id)
215 {
216   $r = DB_query_array("SELECT status FROM Game WHERE id=".DB_quote_smart($id));
217
218   if($r)
219     return $r[0];
220   else
221     return NULL;
222 }
223
224 function DB_set_hand_status_by_hash($hash,$status)
225 {
226   DB_query("UPDATE Hand SET status='".$status."' WHERE hash=".DB_quote_smart($hash));
227   return;
228 }
229
230 function DB_get_hand_status_by_userid_and_gameid($uid,$gid)
231 {
232   $r = DB_query_array("SELECT status FROM Hand WHERE user_id=".DB_quote_smart($uid).
233                       " AND game_id=".DB_quote_smart($gid));
234   if($r)
235     return $r[0];
236   else
237     return 0;
238 }
239
240 function DB_get_sickness_by_userid_and_gameid($uid,$gid)
241 {
242   $r = DB_query_array("SELECT sickness FROM Hand WHERE user_id=".DB_quote_smart($uid).
243                       " AND game_id=".DB_quote_smart($gid));
244   if($r)
245     return $r[0];
246   else
247     return 0;
248 }
249
250 function DB_get_sickness_by_pos_and_gameid($pos,$gid)
251 {
252   $r = DB_query_array("SELECT sickness FROM Hand WHERE position=".DB_quote_smart($pos).
253                       " AND game_id=".DB_quote_smart($gid));
254   if($r)
255     return $r[0];
256   else
257     return 0;
258 }
259
260 function DB_get_gameid_by_hash($hash)
261 {
262   $r = DB_query_array("SELECT game_id FROM Hand WHERE hash=".DB_quote_smart($hash));
263
264   if($r)
265     return $r[0];
266   else
267     return 0;
268 }
269
270 function DB_get_hand($me)
271 {
272   $cards = array();
273
274   $handid = DB_get_handid('hash',$me);
275
276   $result = DB_query("SELECT card_id FROM Hand_Card WHERE hand_id=".DB_quote_smart($handid)." and played='false' ");
277   while($r = DB_fetch_array($result))
278     $cards[]=$r[0];
279
280   return $cards;
281 }
282
283 function DB_get_all_hand($me)
284 {
285   $cards = array();
286
287   $handid = DB_get_handid('hash',$me);
288
289   $result = DB_query("SELECT card_id FROM Hand_Card WHERE hand_id=".DB_quote_smart($handid));
290   while($r = DB_fetch_array($result))
291     $cards[]=$r[0];
292
293   return $cards;
294 }
295
296 function DB_get_cards_by_trick($id)
297 {
298   $cards = array();
299   $i     = 1;
300
301   $result = DB_query("SELECT card_id,position FROM Play LEFT JOIN Hand_Card ON Hand_Card.id=Play.hand_card_id ".
302                      "LEFT JOIN Hand ON Hand.id=Hand_Card.hand_id ".
303                      "WHERE trick_id=".
304                      DB_quote_smart($id)." ORDER BY sequence ASC");
305   while($r = DB_fetch_array($result))
306     {
307       $cards[$i]=array("card"=>$r[0],"pos"=>$r[1]);
308       $i++;
309     }
310
311   return $cards;
312 }
313
314
315 function DB_set_solo_by_hash($hash,$solo)
316 {
317   DB_query("UPDATE Hand SET solo=".DB_quote_smart($solo)." WHERE hash=".DB_quote_smart($hash));
318   return;
319 }
320
321 function DB_set_solo_by_gameid($id,$solo)
322 {
323   DB_query("UPDATE Game SET solo=".DB_quote_smart($solo)." WHERE id=".DB_quote_smart($id));
324   return;
325 }
326
327 function DB_set_sickness_by_hash($hash,$sickness)
328 {
329   DB_query("UPDATE Hand SET sickness=".DB_quote_smart($sickness)." WHERE hash=".DB_quote_smart($hash));
330   return;
331 }
332
333 function DB_get_current_trickid($gameid)
334 {
335   $trickid  = NULL;
336   $sequence = NULL;
337   $number   = 0;
338
339   $result = DB_query("SELECT Trick.id,MAX(Play.sequence) FROM Play ".
340                      "LEFT JOIN Trick ON Play.trick_id=Trick.id ".
341                      "WHERE Trick.game_id=".DB_quote_smart($gameid)." ".
342                      "GROUP BY Trick.id");
343   while( $r = DB_fetch_array($result) )
344     {
345       $trickid  = $r[0];
346       $sequence = $r[1];
347       $number++;
348     };
349
350   if(!$sequence || $sequence==4)
351     {
352       DB_query("INSERT INTO Trick VALUES (NULL,NULL,NULL, ".DB_quote_smart($gameid).",NULL)");
353       $trickid  = DB_insert_id();
354       $sequence = 1;
355       $number++;
356     }
357   else
358     {
359       $sequence++;
360     }
361
362   return array($trickid,$sequence,$number);
363 }
364
365 function DB_get_max_trickid($gameid)
366 {
367   $r = DB_query_array("SELECT MAX(id) FROM Trick WHERE game_id=".DB_quote_smart($gameid));
368
369   return ($r?$r[0]:NULL);
370 }
371
372 function DB_play_card($trickid,$handcardid,$sequence)
373 {
374   DB_query("INSERT INTO Play VALUES(NULL,NULL,NULL,".DB_quote_smart($trickid).
375            ",".DB_quote_smart($handcardid).",".DB_quote_smart($sequence).")");
376
377   $playid = DB_insert_id();
378   return $playid;
379 }
380
381 function DB_get_all_names_by_gameid($id)
382 {
383   $names = array();
384
385   $result = DB_query("SELECT fullname FROM Hand LEFT JOIN User ON Hand.user_id=User.id WHERE game_id=".
386                      DB_quote_smart($id)." ORDER BY position ASC");
387   while($r = DB_fetch_array($result))
388     $names[] = $r[0];
389
390   return $names;
391 }
392
393 function DB_get_all_userid_by_gameid($id)
394 {
395   $names = array();
396
397   $result = DB_query("SELECT user_id FROM Hand WHERE game_id=".
398                      DB_quote_smart($id)." ORDER BY position ");
399   while($r = DB_fetch_array($result))
400     $names[] = $r[0];
401
402   return $names;
403 }
404
405 function DB_get_hash_from_game_and_pos($id,$pos)
406 {
407   $r = DB_query_array("SELECT hash FROM Hand WHERE game_id=".DB_quote_smart($id)." and position=".DB_quote_smart($pos));
408
409   if($r)
410     return $r[0];
411   else
412     return "";
413 }
414
415 function DB_get_hash_from_gameid_and_userid($id,$user)
416 {
417   $r = DB_query_array("SELECT hash FROM Hand WHERE game_id=".DB_quote_smart($id)." and user_id=".DB_quote_smart($user));
418
419   if($r)
420     return $r[0];
421   else
422     return "";
423 }
424
425 function DB_get_all_names()
426 {
427   $names  = array();
428
429   $result = DB_query("SELECT fullname FROM User");
430
431   while($r = DB_fetch_array($result))
432     $names[] = $r[0];
433
434   return $names;
435 }
436
437 function DB_get_all_user_names_open_for_games()
438 {
439   $names  = array();
440
441   DB_query("DROP   TEMPORARY TABLE IF EXISTS Usertmp;");
442   DB_query("CREATE TEMPORARY TABLE Usertmp SELECT id,fullname FROM User;");
443   DB_query("DELETE FROM Usertmp WHERE id IN (SELECT user_id FROM User_Prefs WHERE pref_key='open for games' and value='no')");
444
445   $result = DB_query("SELECT fullname FROM Usertmp");
446   DB_query("DROP   TEMPORARY TABLE IF EXISTS Usertmp;");
447
448   while($r = DB_fetch_array($result))
449     $names[] = $r[0];
450
451   return $names;
452 }
453
454 function DB_get_names_of_last_logins($N)
455 {
456   $names  = array();
457
458   $result = DB_query("SELECT fullname FROM User ORDER BY last_login DESC LIMIT $N");
459   while($r = DB_fetch_array($result))
460     $names[] = $r[0];
461
462   return $names;
463 }
464
465 function DB_get_names_of_new_logins($N)
466 {
467   $names  = array();
468
469   $result = DB_query("SELECT fullname FROM User ORDER BY create_date DESC, id DESC LIMIT $N");
470   while($r = DB_fetch_array($result))
471     $names[] = $r[0];
472
473   return $names;
474 }
475
476 function DB_update_game_timestamp($gameid)
477 {
478   DB_query("UPDATE Game SET mod_date = CURRENT_TIMESTAMP WHERE id=".DB_quote_smart($gameid));
479   return;
480 }
481
482
483 function DB_update_user_timestamp($userid)
484 {
485   DB_query("UPDATE User SET last_login = CURRENT_TIMESTAMP WHERE id=".DB_quote_smart($userid));
486   return;
487 }
488
489 function DB_get_user_timestamp($userid)
490 {
491   $r = DB_query_array("SELECT last_login FROM User WHERE id=".DB_quote_smart($userid));
492
493   if($r)
494     return $r[0];
495   else
496     return NULL;
497 }
498 function DB_get_user_timezone($userid)
499 {
500   $r = DB_query_array("SELECT timezone FROM User WHERE id=".DB_quote_smart($userid));
501
502   if($r)
503     return $r[0];
504   else
505     return "Europe/London";
506 }
507
508 function DB_insert_comment($comment,$playid,$userid)
509 {
510   DB_query("INSERT INTO Comment VALUES (NULL,NULL,NULL,$userid,$playid, ".DB_quote_smart($comment).")");
511
512   return;
513 }
514
515 function DB_insert_note($comment,$gameid,$userid)
516 {
517   DB_query("INSERT INTO Notes VALUES (NULL,NULL,NULL,$userid,$gameid, ".DB_quote_smart($comment).")");
518
519   return;
520 }
521
522 function DB_get_notes_by_userid_and_gameid($userid,$gameid)
523 {
524   $notes = array();
525
526   $result = DB_query("SELECT comment FROM Notes WHERE user_id=".DB_quote_smart($userid) .
527                      " AND game_id=".DB_quote_smart($gameid));
528
529   while($r = DB_fetch_array($result))
530     $notes[] = $r[0];
531
532   return $notes;
533 }
534
535
536 function DB_get_gametype_by_gameid($id)
537 {
538   $r = DB_query_array("SELECT type FROM Game WHERE id=".DB_quote_smart($id));
539
540   if($r)
541     return $r[0]."";
542   else
543     return "";
544 }
545
546 function DB_set_gametype_by_gameid($id,$p)
547 {
548   DB_query("UPDATE Game SET type='".$p."' WHERE id=".DB_quote_smart($id));
549   return;
550 }
551
552 function DB_get_solo_by_gameid($id)
553 {
554   $r = DB_query_array("SELECT solo FROM Game WHERE id=".DB_quote_smart($id));
555
556   if($r)
557     return $r[0]."";
558   else
559     return "";
560 }
561
562
563 function DB_get_startplayer_by_gameid($id)
564 {
565   $r = DB_query_array("SELECT startplayer FROM Game WHERE id=".DB_quote_smart($id));
566
567   if($r)
568     return $r[0];
569   else
570     return 0;
571 }
572
573 function DB_set_startplayer_by_gameid($id,$p)
574 {
575   DB_query("UPDATE Game SET startplayer='".$p."' WHERE id=".DB_quote_smart($id));
576   return;
577 }
578
579 function DB_get_player_by_gameid($id)
580 {
581   $r = DB_query_array("SELECT player FROM Game WHERE id=".DB_quote_smart($id));
582
583   if($r)
584     return $r[0];
585   else
586     return 0;
587 }
588 function DB_set_player_by_gameid($id,$p)
589 {
590   DB_query("UPDATE Game SET player='".DB_quote_smart($p)."' WHERE id=".DB_quote_smart($id));
591   return;
592 }
593
594
595
596 function DB_get_ruleset_by_gameid($id)
597 {
598   $r = DB_query_array("SELECT ruleset FROM Game WHERE id=".DB_quote_smart($id));
599
600   if($r)
601     return $r[0];
602   else
603     return NULL;
604 }
605
606 function DB_get_session_by_gameid($id)
607 {
608   $r = DB_query_array("SELECT session FROM Game WHERE id=".DB_quote_smart($id));
609
610   if($r)
611     return $r[0];
612   else
613     return NULL;
614 }
615
616 function DB_get_max_session()
617 {
618   $r = DB_query_array("SELECT MAX(session) FROM Game");
619
620   if($r)
621     return $r[0];
622   else
623     return 0;
624 }
625
626 function DB_get_hashes_by_session($session,$user)
627 {
628   $r = array();
629
630   $result = DB_query("SELECT Hand.hash FROM Hand".
631                      " LEFT JOIN Game ON Game.id=Hand.game_id ".
632                      " WHERE Game.session=".DB_quote_smart($session).
633                      " AND Hand.user_id=".DB_quote_smart($user).
634                      " ORDER BY Game.create_date ASC");
635   while($t = DB_fetch_array($result))
636     $r[] = $t[0];
637
638   return $r;
639 }
640
641 function DB_get_ruleset($dullen,$schweinchen,$call)
642 {
643   $r = array();
644
645   $result = DB_query("SELECT id FROM Rulesets WHERE".
646                      " dullen=".DB_quote_smart($dullen)." AND ".
647                      " Rulesets.call=".DB_quote_smart($call)." AND ".
648                      " schweinchen=".DB_quote_smart($schweinchen));
649   if($result)
650     $r    = DB_fetch_array($result);
651
652   if($r)
653     return $r[0]; /* found ruleset */
654   else
655     {
656       /* create new one */
657       $result = DB_query("INSERT INTO Rulesets VALUES (NULL, NULL, ".
658                          DB_quote_smart($dullen).",".
659                          DB_quote_smart($schweinchen).",".
660                          DB_quote_smart($call).
661                          ", NULL)");
662       if($result)
663         return DB_insert_id();
664     };
665
666   return -1; /* something went wrong */
667 }
668
669 function DB_get_party_by_hash($hash)
670 {
671   $r = DB_query_array("SELECT party FROM Hand WHERE hash=".DB_quote_smart($hash));
672
673   if($r)
674     return $r[0];
675   else
676     return NULL;
677 }
678
679 function DB_get_party_by_gameid_and_userid($gameid,$userid)
680 {
681   $r = DB_query_array("SELECT party FROM Hand".
682                       " WHERE game_id=".DB_quote_smart($gameid).
683                       "  AND user_id=".DB_quote_smart($userid));
684   if($r)
685     return $r[0];
686   else
687     return NULL;
688 }
689
690 function DB_set_party_by_hash($hash,$party)
691 {
692   DB_query("UPDATE Hand SET party=".DB_quote_smart($party)." WHERE hash=".DB_quote_smart($hash));
693   return;
694 }
695
696 function DB_get_PREF($myid)
697 {
698   /* set defaults */
699   $PREF['cardset']              = 'english';
700   $PREF['email']                = 'emailnonaddict';
701   $PREF['autosetup']            = 'no';
702   $PREF['sorting']              = 'high-low';
703   $PREF['open_for_games']       = 'yes';
704   $PREF['vacation_start']       =  NULL;
705   $PREF['vacation_stop']        =  NULL;
706   $PREF['vacation_comment']     =  '';
707
708   /* get all preferences */
709   $r = DB_query('SELECT pref_key, value FROM User_Prefs'.
710                       " WHERE user_id='$myid' " );
711   while($pref = DB_fetch_array($r) )
712     {
713       switch($pref[0])
714         {
715         case 'cardset':
716           /* licence only valid until then */
717           if($pref[1]=="altenburg" && (time()-strtotime( "2009-12-31 23:59:59")<0) )
718             $PREF["cardset"]="altenburg";
719           break;
720
721         case 'email':
722           if($pref[1]=="emailaddict")
723             $PREF["email"]="emailaddict";
724           break;
725
726         case 'autosetup':
727           if($pref[1]=='yes')
728             $PREF['autosetup']='yes';
729           break;
730
731         case 'sorting':
732           if($pref[1])
733             $PREF['sorting'] = $pref[1];
734           break;
735
736         case 'open for games':
737           if($pref[1])
738             $PREF['open_for_games'] = $pref[1];
739           break;
740
741         case 'vacation start':
742           if($pref[1])
743             $PREF['vacation_start'] = $pref[1];
744           break;
745
746         case 'vacation stop':
747           if($pref[1])
748             $PREF['vacation_stop'] = $pref[1];
749           break;
750
751         case 'vacation comment':
752           if($pref[1])
753             $PREF['vacation_comment'] = $pref[1];
754           break;
755         }
756     }
757   return $PREF;
758 }
759
760 function DB_get_RULES($gameid)
761 {
762   $r = DB_query_array("SELECT * FROM Rulesets".
763                       " LEFT JOIN Game ON Game.ruleset=Rulesets.id ".
764                       " WHERE Game.id='$gameid'" );
765
766   $RULES["dullen"]      = $r[2];
767   $RULES["schweinchen"] = $r[3];
768   $RULES["call"]        = $r[4];
769
770   return $RULES;
771 }
772
773 function DB_get_email_pref_by_hash($hash)
774 {
775   $r = DB_query_array("SELECT value FROM Hand".
776                       " LEFT JOIN User_Prefs ON Hand.user_id=User_Prefs.user_id".
777                       " WHERE hash='$hash' AND pref_key='email'" );
778   if($r)
779     {
780       if($r[0]=="emailaddict")
781         return "emailaddict";
782       else
783         return "emailnonaddict";
784     }
785   else
786     return "emailnonaddict";
787 }
788
789 function DB_get_email_pref_by_uid($uid)
790 {
791   $r = DB_query_array("SELECT value FROM User_Prefs ".
792                       " WHERE user_id='$uid' AND pref_key='email'" );
793   if($r)
794     {
795       if($r[0]=="emailaddict")
796         return "emailaddict";
797       else
798         return "emailnonaddict";
799     }
800   else
801     return "emailnonaddict";
802 }
803
804 function DB_get_unused_randomnumbers($userstr)
805 {
806   /* optimized version of this query using temporary tables (perhaps we should use a procedure here?).
807      First we create a copy of the Game table using just the gameid and the cards.
808      Then in a second round we delete all the gameids of games where our players are in.
809      At the end we return only the first entry in the temporary table.
810   */
811   DB_query("DROP   TEMPORARY TABLE IF EXISTS gametmp;");
812   DB_query("CREATE TEMPORARY TABLE gametmp SELECT id,randomnumbers FROM Game;");
813   DB_query("DELETE FROM gametmp WHERE randomnumbers IN (SELECT randomnumbers FROM Hand LEFT JOIN Game ON Game.id=game_id WHERE user_id IN (".$userstr."));");
814
815   $r = DB_query_array("SELECT randomnumbers FROM gametmp LIMIT 1;");
816   DB_query("DROP   TEMPORARY TABLE IF EXISTS gametmp;");
817
818   if($r)
819     return $r[0];
820   else
821     return "";
822 }
823
824 function DB_get_number_of_passwords_recovery($user)
825 {
826   $r = DB_query_array("SELECT COUNT(*) FROM Recovery ".
827                       "  WHERE user_id=$user ".
828                       "  AND DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= create_date".
829                       "  GROUP BY user_id " );
830   if($r)
831     return $r[0];
832   else
833     return 0;
834 }
835
836 function DB_set_recovery_password($user,$newpw)
837 {
838   DB_query("INSERT INTO Recovery VALUES(NULL,".DB_quote_smart($user).
839            ",".DB_quote_smart($newpw).",NULL)");
840   return;
841 }
842
843 function DB_get_card_name($card)
844 {
845   if($card==0)
846     return 'backside';
847
848   $r = DB_query_array("SELECT strength,suite FROM Card WHERE id='$card'");
849
850   if($r)
851     return $r[0]." of ".$r[1];
852   else
853     return "Error during get_card_name ".$card;
854 }
855
856 function DB_get_current_playid($gameid)
857 {
858   $trick = DB_get_max_trickid($gameid);
859
860   if(!$trick) return NULL;
861
862   $r = DB_query_array("SELECT id FROM Play WHERE trick_id='$trick' ORDER BY create_date DESC LIMIT 1");
863
864   if($r)
865     return $r[0];
866
867   return "";
868 }
869
870 function DB_get_call_by_hash($hash)
871 {
872   $r = DB_query_array("SELECT point_call FROM Hand WHERE hash='$hash'");
873
874   if($r)
875     return $r[0];
876
877   return NULL;
878 }
879
880 function DB_get_partner_call_by_hash($hash)
881 {
882   $partner = DB_get_partner_hash_by_hash($hash);
883
884   if($partner)
885     {
886       $r = DB_query_array("SELECT point_call FROM Hand WHERE hash='$partner'");
887
888       if($r)
889         return $r[0];
890     }
891
892   return NULL;
893 }
894
895 function DB_get_partner_hash_by_hash($hash)
896 {
897   $gameid = DB_get_gameid_by_hash($hash);
898   $party  = DB_get_party_by_hash($hash);
899
900   $r = DB_query_array("SELECT hash FROM Hand WHERE game_id='$gameid' AND party='$party' AND hash<>'$hash'");
901
902   if($r)
903     return $r[0];
904
905   return NULL;
906 }
907
908 function DB_format_gameid($gameid)
909 {
910   /* get session and create date */
911   $r = DB_query_array("SELECT session, create_date FROM Game WHERE id='$gameid' ");
912   $session = $r[0];
913   $date    = $r[1];
914
915   /* get number of game */
916   $r = DB_query_array("SELECT SUM(TIME_TO_SEC(TIMEDIFF(create_date, '$date'))<=0) ".
917                       " FROM Game".
918                       " WHERE session='$session' ");
919   return $session.'.'.$r[0];
920 }
921
922 function DB_get_reminder($user,$gameid)
923 {
924   $r = DB_query_array("SELECT COUNT(*) FROM Reminder ".
925                       "  WHERE user_id=$user ".
926                       "  AND game_id=$gameid ".
927                       "  AND DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= create_date".
928                       "  GROUP BY user_id " );
929   if($r)
930     return $r[0];
931   else
932     return 0;
933 }
934
935 function DB_set_reminder($user,$gameid)
936 {
937   DB_query("INSERT INTO Reminder ".
938            "  VALUES(NULL, ".DB_quote_smart($user).", ".DB_quote_smart($gameid).
939            ", NULL) ");
940   return 0;
941 }
942
943 function DB_is_session_active($session)
944 {
945   $r = DB_query_array("SELECT COUNT(*) FROM Game ".
946                       "  WHERE session=$session ".
947                       "  AND status IN ('pre','play') ");
948   if($r)
949     return $r[0];
950   else
951     return -1;
952 }
953
954 function DB_get_score_by_gameid($gameid)
955 {
956   /* returns the points of a game from the point of the re parth (<0 if they lost) */
957   $queryresult = DB_query("SELECT COUNT(*),party FROM Score ".
958                           "  WHERE game_id=$gameid ".
959                           "  GROUP BY party ");
960   $re     = 0;
961   $contra = 0;
962
963   while($r = DB_fetch_array($queryresult) )
964     {
965       if($r[1] == "re")
966         $re += $r[0];
967       else if ($r[1] == "contra")
968         $contra += $r[0];
969     };
970
971   return ($re - $contra);
972 }
973
974 function DB_get_gameids_of_finished_games_by_session($session)
975 {
976   $ids = array ();
977
978   if($session==0) /* return all games */
979     $queryresult = DB_query("SELECT id FROM Game ".
980                             " WHERE status='gameover' ".
981                             " ORDER BY create_date ASC");
982   else   /* return games in a session */
983     $queryresult = DB_query("SELECT id FROM Game ".
984                             "  WHERE session=$session ".
985                             "   AND status='gameover' ".
986                             " ORDER BY create_date ASC");
987
988   $i=0;
989   while($r = DB_fetch_array($queryresult) )
990     {
991       $ids[$i] = $r[0];
992       $i++;
993     }
994
995   return $ids;
996 }
997
998 function DB_get_card_value_by_cardid($id)
999 {
1000   $r = DB_query_array("SELECT points FROM Card ".
1001                       "  WHERE id=$id ");
1002
1003   if($r)
1004     return $r[0];
1005   else
1006     return NULL;
1007 }
1008
1009 function DB_get_userid($type,$var1="",$var2="")
1010 {
1011   /* get the userid of a user
1012    * this can be done several ways, which are all handled below
1013    * if a email/password combination is given and it doesn't work, we also
1014    * need to check the recovery table for additional passwords
1015    */
1016
1017   $r = NULL;
1018
1019   switch($type)
1020     {
1021     case 'name':
1022       $result = DB_query("SELECT id FROM User WHERE fullname=".DB_quote_smart($var1));
1023       break;
1024     case 'hash':
1025       $result = DB_query("SELECT user_id FROM Hand WHERE hash=".DB_quote_smart($var1));
1026       break;
1027     case 'password':
1028       $result = DB_query("SELECT id FROM User WHERE password=".DB_quote_smart($var1));
1029       break;
1030     case 'email':
1031       $result = DB_query("SELECT id FROM User WHERE email=".DB_quote_smart($var1));
1032       break;
1033     case 'email-password':
1034       $result = DB_query("SELECT id FROM User WHERE email=".DB_quote_smart($var1)." AND password=".DB_quote_smart($var2));
1035       $r = DB_fetch_array($result);
1036       /* test if a recovery password has been set */
1037       if(!$r)
1038         {
1039           echo "testing alternative password";
1040           $result = DB_query("SELECT User.id FROM User".
1041                              " LEFT JOIN Recovery ON User.id=Recovery.user_id".
1042                              " WHERE email=".DB_quote_smart($var1).
1043                              " AND Recovery.password=".DB_quote_smart($var2).
1044                              " AND DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= Recovery.create_date");
1045         }
1046       break;
1047     case 'gameid-position':
1048       $result = DB_query("SELECT user_id FROM Hand WHERE game_id=".
1049                          DB_quote_smart($var1)." AND position=".
1050                          DB_quote_smart($var2));
1051       break;
1052     }
1053
1054   if(!$r)
1055     $r = DB_fetch_array($result);
1056
1057   if($r)
1058     return $r[0];
1059   else
1060     return 0;
1061 }
1062
1063 function DB_get_email($type,$var1='',$var2='')
1064 {
1065   /* return the email of a user
1066    * this is used for sending out emails, but also for
1067    * testing the login for example
1068    */
1069   switch($type)
1070     {
1071     case 'name':
1072       $result = DB_query("SELECT email FROM User WHERE fullname=".DB_quote_smart($var1)."");
1073       break;
1074     case 'userid':
1075       $result = DB_query("SELECT email FROM User WHERE id=".DB_quote_smart($var1)."");
1076       break;
1077     case 'hash':
1078       $result = DB_query("SELECT User.email FROM User ".
1079                          "LEFT JOIN Hand ON Hand.user_id=User.id ".
1080                          "WHERE Hand.hash=".DB_quote_smart($var1)."");
1081       break;
1082     case 'position-gameid':
1083       $result = DB_query("SELECT email FROM User ".
1084                          "LEFT JOIN Hand ON User.id=Hand.user_id ".
1085                          "LEFT JOIN Game ON Game.id=Hand.game_id ".
1086                          "WHERE Game.id=".DB_quote_smart($var2)." ".
1087                          "AND Hand.position=".DB_quote_smart($var1)."");
1088       break;
1089     }
1090
1091   $r = DB_fetch_array($result);
1092
1093   if($r)
1094     return $r[0];
1095   else
1096     return "";
1097 }
1098
1099 function DB_get_name($type,$var1='')
1100 {
1101   /* get the full name of a user
1102    * a user can be uniquely identified several ways
1103    */
1104   switch($type)
1105     {
1106     case 'hash':
1107       $r = DB_query_array("SELECT fullname FROM Hand LEFT JOIN User ON Hand.user_id=User.id WHERE hash=".DB_quote_smart($var1));
1108       break;
1109     case 'email':
1110       $r = DB_query_array("SELECT fullname FROM User WHERE email=".DB_quote_smart($var1));
1111       break;
1112     case 'userid':
1113       $r = DB_query_array("SELECT fullname FROM User  WHERE id=".DB_quote_smart($var1));
1114     }
1115
1116   if($r)
1117     return $r[0];
1118   else
1119     return "";
1120 }
1121
1122 function DB_add_exchanged_card($card,$old_hand_id,$new_hand_id)
1123 {
1124   DB_query("INSERT INTO Card_Exchange VALUES (NULL,$new_hand_id,$old_hand_id,$card)");
1125   return;
1126 }
1127
1128 function DB_get_exchanged_cards($hash)
1129 {
1130   $cards = array();
1131
1132   $handid = DB_get_handid('hash',$hash);
1133
1134   $result = DB_query("SELECT card_id FROM Card_Exchange WHERE orig_hand_id=".DB_quote_smart($handid));
1135   while($r = DB_fetch_array($result))
1136     $cards[]=$r[0];
1137
1138   return $cards;
1139 }
1140
1141 function DB_played_by_others($gameid)
1142 {
1143   $gameids = array();
1144   $result = DB_query("SELECT id FROM Game WHERE randomnumbers=(SELECT randomnumbers FROM Game WHERE id=$gameid) AND status='gameover'");
1145   while($r = DB_fetch_array($result))
1146     if($r[0]!=$gameid)
1147       $gameids[]=$r[0];
1148   return $gameids;
1149 }
1150 ?>