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