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