missing phpdoc declaration
[squirrelmail.git] / functions / db_prefs.php
CommitLineData
82474746 1<?php
15e6162e 2
d6c32258 3/**
35586184 4 * db_prefs.php
5 *
82d304a0 6 * Copyright (c) 1999-2004 The SquirrelMail Project Team
35586184 7 * Licensed under the GNU GPL. For full terms see the file COPYING.
8 *
9 * This contains functions for manipulating user preferences
10 * stored in a database, accessed though the Pear DB layer.
11 *
35586184 12 * Database:
13 * ---------
14 *
99a6c222 15 * The preferences table should have three columns:
16 * user char \ primary
35586184 17 * prefkey char / key
18 * prefval blob
19 *
4b7dd3d9 20 * CREATE TABLE userprefs (user CHAR(128) NOT NULL DEFAULT '',
35586184 21 * prefkey CHAR(64) NOT NULL DEFAULT '',
22 * prefval BLOB NOT NULL DEFAULT '',
23 * primary key (user,prefkey));
24 *
25 * Configuration of databasename, username and password is done
3499f99f 26 * by using conf.pl or the administrator plugin
35586184 27 *
28 * $Id$
d6c32258 29 * @package squirrelmail
35586184 30 */
31
d6c32258 32/** Unknown database */
98749983 33define('SMDB_UNKNOWN', 0);
d6c32258 34/** MySQL */
98749983 35define('SMDB_MYSQL', 1);
d6c32258 36/** PostgreSQL */
98749983 37define('SMDB_PGSQL', 2);
38
883c8f81 39require_once('DB.php');
b68edc75 40require_once(SM_PATH . 'config/config.php');
35586184 41
370059dd 42global $prefs_are_cached, $prefs_cache;
2d367c68 43
370059dd 44function cachePrefValues($username) {
45 global $prefs_are_cached, $prefs_cache;
46
47 if ($prefs_are_cached) {
48 return;
49 }
2d367c68 50
9eb0fbd4 51 sqsession_unregister('prefs_cache');
52 sqsession_unregister('prefs_are_cached');
370059dd 53
54 $db = new dbPrefs;
55 if(isset($db->error)) {
56 printf( _("Preference database error (%s). Exiting abnormally"),
57 $db->error);
58 exit;
59 }
2d367c68 60
370059dd 61 $db->fillPrefsCache($username);
62 if (isset($db->error)) {
63 printf( _("Preference database error (%s). Exiting abnormally"),
64 $db->error);
65 exit;
66 }
67
68 $prefs_are_cached = true;
69
9eb0fbd4 70 sqsession_register($prefs_cache, 'prefs_cache');
71 sqsession_register($prefs_are_cached, 'prefs_are_cached');
370059dd 72}
73
d6c32258 74/**
75 * Completely undocumented class - someone document it!
76 * @package squirrelmail
77 */
370059dd 78class dbPrefs {
370059dd 79 var $table = 'userprefs';
99a6c222 80 var $user_field = 'user';
81 var $key_field = 'prefkey';
82 var $val_field = 'prefval';
370059dd 83
84 var $dbh = NULL;
85 var $error = NULL;
98749983 86 var $db_type = SMDB_UNKNOWN;
370059dd 87
2ea6df85 88 var $default = Array('theme_default' => 0,
370059dd 89 'show_html_default' => '0');
90
91 function open() {
3499f99f 92 global $prefs_dsn, $prefs_table;
98749983 93 global $prefs_user_field, $prefs_key_field, $prefs_val_field;
3499f99f 94
370059dd 95 if(isset($this->dbh)) {
96 return true;
97 }
3499f99f 98
98749983 99 if (preg_match('/^mysql/', $prefs_dsn)) {
100 $this->db_type = SMDB_MYSQL;
101 } elseif (preg_match('/^pgsql/', $prefs_dsn)) {
102 $this->db_type = SMDB_PGSQL;
103 }
104
3499f99f 105 if (!empty($prefs_table)) {
106 $this->table = $prefs_table;
107 }
99a6c222 108 if (!empty($prefs_user_field)) {
109 $this->user_field = $prefs_user_field;
110 }
111 if (!empty($prefs_key_field)) {
112 $this->key_field = $prefs_key_field;
113 }
114 if (!empty($prefs_val_field)) {
115 $this->val_field = $prefs_val_field;
116 }
70561170 117 $dbh = DB::connect($prefs_dsn, true);
2d367c68 118
286fe80b 119 if(DB::isError($dbh)) {
2d367c68 120 $this->error = DB::errorMessage($dbh);
121 return false;
122 }
123
124 $this->dbh = $dbh;
125 return true;
370059dd 126 }
82474746 127
370059dd 128 function failQuery($res = NULL) {
2d367c68 129 if($res == NULL) {
130 printf(_("Preference database error (%s). Exiting abnormally"),
370059dd 131 $this->error);
2d367c68 132 } else {
133 printf(_("Preference database error (%s). Exiting abnormally"),
370059dd 134 DB::errorMessage($res));
2d367c68 135 }
136 exit;
370059dd 137 }
82474746 138
139
370059dd 140 function getKey($user, $key, $default = '') {
141 global $prefs_cache;
2d367c68 142
370059dd 143 cachePrefValues($user);
2d367c68 144
370059dd 145 if (isset($prefs_cache[$key])) {
146 return $prefs_cache[$key];
2d367c68 147 } else {
62337234 148 if (isset($this->default[$key])) {
149 return $this->default[$key];
150 } else {
151 return $default;
152 }
2d367c68 153 }
370059dd 154 }
2d367c68 155
370059dd 156 function deleteKey($user, $key) {
157 global $prefs_cache;
82474746 158
b279d7f4 159 if (!$this->open()) {
160 return false;
161 }
99a6c222 162 $query = sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
370059dd 163 $this->table,
99a6c222 164 $this->user_field,
370059dd 165 $this->dbh->quoteString($user),
99a6c222 166 $this->key_field,
370059dd 167 $this->dbh->quoteString($key));
82474746 168
2d367c68 169 $res = $this->dbh->simpleQuery($query);
370059dd 170 if(DB::isError($res)) {
2d367c68 171 $this->failQuery($res);
370059dd 172 }
173
174 unset($prefs_cache[$key]);
82474746 175
2d367c68 176 return true;
370059dd 177 }
82474746 178
370059dd 179 function setKey($user, $key, $value) {
b279d7f4 180 if (!$this->open()) {
181 return false;
182 }
98749983 183 if ($this->db_type == SMDB_MYSQL) {
184 $query = sprintf("REPLACE INTO %s (%s, %s, %s) ".
185 "VALUES('%s','%s','%s')",
186 $this->table,
187 $this->user_field,
188 $this->key_field,
189 $this->val_field,
190 $this->dbh->quoteString($user),
191 $this->dbh->quoteString($key),
192 $this->dbh->quoteString($value));
193
194 $res = $this->dbh->simpleQuery($query);
195 if(DB::isError($res)) {
196 $this->failQuery($res);
197 }
198 } elseif ($this->db_type == SMDB_PGSQL) {
199 $this->dbh->simpleQuery("BEGIN TRANSACTION");
200 $query = sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
201 $this->table,
202 $this->user_field,
203 $this->dbh->quoteString($user),
204 $this->key_field,
205 $this->dbh->quoteString($key));
206 $res = $this->dbh->simpleQuery($query);
207 if (DB::isError($res)) {
208 $this->dbh->simpleQuery("ROLLBACK TRANSACTION");
209 $this->failQuery($res);
210 }
211 $query = sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
212 $this->table,
213 $this->user_field,
214 $this->key_field,
215 $this->val_field,
216 $this->dbh->quoteString($user),
217 $this->dbh->quoteString($key),
218 $this->dbh->quoteString($value));
219 $res = $this->dbh->simpleQuery($query);
220 if (DB::isError($res)) {
221 $this->dbh->simpleQuery("ROLLBACK TRANSACTION");
222 $this->failQuery($res);
223 }
224 $this->dbh->simpleQuery("COMMIT TRANSACTION");
225 } else {
226 $query = sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
227 $this->table,
228 $this->user_field,
229 $this->dbh->quoteString($user),
230 $this->key_field,
231 $this->dbh->quoteString($key));
232 $res = $this->dbh->simpleQuery($query);
233 if (DB::isError($res)) {
234 $this->failQuery($res);
235 }
236 $query = sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
237 $this->table,
238 $this->user_field,
239 $this->key_field,
240 $this->val_field,
241 $this->dbh->quoteString($user),
242 $this->dbh->quoteString($key),
243 $this->dbh->quoteString($value));
244 $res = $this->dbh->simpleQuery($query);
245 if (DB::isError($res)) {
246 $this->failQuery($res);
247 }
370059dd 248 }
2d367c68 249
250 return true;
370059dd 251 }
82474746 252
370059dd 253 function fillPrefsCache($user) {
254 global $prefs_cache;
2d367c68 255
b279d7f4 256 if (!$this->open()) {
257 return;
258 }
370059dd 259
260 $prefs_cache = array();
99a6c222 261 $query = sprintf("SELECT %s as prefkey, %s as prefval FROM %s ".
262 "WHERE %s = '%s'",
263 $this->key_field,
264 $this->val_field,
370059dd 265 $this->table,
99a6c222 266 $this->user_field,
370059dd 267 $this->dbh->quoteString($user));
268 $res = $this->dbh->query($query);
269 if (DB::isError($res)) {
270 $this->failQuery($res);
271 }
272
273 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
274 $prefs_cache[$row['prefkey']] = $row['prefval'];
275 }
276 }
277
370059dd 278} /* end class dbPrefs */
82474746 279
280
370059dd 281/* returns the value for the pref $string */
282function getPref($data_dir, $username, $string, $default = '') {
283 $db = new dbPrefs;
284 if(isset($db->error)) {
2d367c68 285 printf( _("Preference database error (%s). Exiting abnormally"),
370059dd 286 $db->error);
2d367c68 287 exit;
370059dd 288 }
289
290 return $db->getKey($username, $string, $default);
291}
292
293/* Remove the pref $string */
294function removePref($data_dir, $username, $string) {
1fa62ab9 295 global $prefs_cache;
370059dd 296 $db = new dbPrefs;
297 if(isset($db->error)) {
298 $db->failQuery();
299 }
300
301 $db->deleteKey($username, $string);
88a99543 302
303 if (isset($prefs_cache[$string])) {
304 unset($prefs_cache[$string]);
305 }
306
307 sqsession_register($prefs_cache , 'prefs_cache');
370059dd 308 return;
309}
310
311/* sets the pref, $string, to $set_to */
312function setPref($data_dir, $username, $string, $set_to) {
313 global $prefs_cache;
314
4b7dd3d9 315 if (isset($prefs_cache[$string]) && ($prefs_cache[$string] == $set_to)) {
1fa62ab9 316 return;
370059dd 317 }
318
bce23c86 319 if ($set_to === '') {
370059dd 320 removePref($data_dir, $username, $string);
321 return;
322 }
323
324 $db = new dbPrefs;
325 if(isset($db->error)) {
326 $db->failQuery();
327 }
328
329 $db->setKey($username, $string, $set_to);
330 $prefs_cache[$string] = $set_to;
331 assert_options(ASSERT_ACTIVE, 1);
332 assert_options(ASSERT_BAIL, 1);
333 assert ('$set_to == $prefs_cache[$string]');
88a99543 334 sqsession_register($prefs_cache , 'prefs_cache');
370059dd 335 return;
336}
337
338/* This checks if the prefs are available */
339function checkForPrefs($data_dir, $username) {
340 $db = new dbPrefs;
341 if(isset($db->error)) {
342 $db->failQuery();
343 }
344}
345
346/* Writes the Signature */
16e5635d 347function setSig($data_dir, $username, $number, $string) {
16e5635d 348 if ($number == "g") {
349 $key = '___signature___';
350 } else {
351 $key = sprintf('___sig%s___', $number);
352 }
57f1d1c1 353 setPref($data_dir, $username, $key, $string);
370059dd 354 return;
355}
356
357/* Gets the signature */
16e5635d 358function getSig($data_dir, $username, $number) {
16e5635d 359 if ($number == "g") {
360 $key = '___signature___';
361 } else {
362 $key = sprintf('___sig%d___', $number);
363 }
57f1d1c1 364 return getPref($data_dir, $username, $key);
370059dd 365}
366
82474746 367?>