6 * Copyright (c) 1999-2002 The SquirrelMail Project Team
7 * Licensed under the GNU GPL. For full terms see the file COPYING.
9 * This contains functions for manipulating user preferences
10 * stored in a database, accessed though the Pear DB layer.
12 * To use this instead of the regular prefs.php, create a
13 * database as described below, and replace prefs.php
19 * The preferences table should have three columns:
24 * CREATE TABLE userprefs (user CHAR(128) NOT NULL DEFAULT '',
25 * prefkey CHAR(64) NOT NULL DEFAULT '',
26 * prefval BLOB NOT NULL DEFAULT '',
27 * primary key (user,prefkey));
29 * Configuration of databasename, username and password is done
30 * by using conf.pl or the administrator plugin
35 define('SMDB_UNKNOWN', 0);
36 define('SMDB_MYSQL', 1);
37 define('SMDB_PGSQL', 2);
39 require_once('DB.php');
40 require_once('../config/config.php');
42 global $prefs_are_cached, $prefs_cache;
44 function cachePrefValues($username) {
45 global $prefs_are_cached, $prefs_cache;
47 if ($prefs_are_cached) {
51 session_unregister('prefs_cache');
52 session_unregister('prefs_are_cached');
55 if(isset($db->error
)) {
56 printf( _("Preference database error (%s). Exiting abnormally"),
61 $db->fillPrefsCache($username);
62 if (isset($db->error
)) {
63 printf( _("Preference database error (%s). Exiting abnormally"),
68 $prefs_are_cached = true;
70 session_register('prefs_cache');
71 session_register('prefs_are_cached');
75 var $table = 'userprefs';
76 var $user_field = 'user';
77 var $key_field = 'prefkey';
78 var $val_field = 'prefval';
82 var $db_type = SMDB_UNKNOWN
;
84 var $default = Array('chosen_theme' => '../themes/default_theme.php',
85 'show_html_default' => '0');
88 global $prefs_dsn, $prefs_table;
89 global $prefs_user_field, $prefs_key_field, $prefs_val_field;
91 if(isset($this->dbh
)) {
95 if (preg_match('/^mysql/', $prefs_dsn)) {
96 $this->db_type
= SMDB_MYSQL
;
97 } elseif (preg_match('/^pgsql/', $prefs_dsn)) {
98 $this->db_type
= SMDB_PGSQL
;
101 if (!empty($prefs_table)) {
102 $this->table
= $prefs_table;
104 if (!empty($prefs_user_field)) {
105 $this->user_field
= $prefs_user_field;
107 if (!empty($prefs_key_field)) {
108 $this->key_field
= $prefs_key_field;
110 if (!empty($prefs_val_field)) {
111 $this->val_field
= $prefs_val_field;
113 $dbh = DB
::connect($prefs_dsn, true);
115 if(DB
::isError($dbh) || DB
::isWarning($dbh)) {
116 $this->error
= DB
::errorMessage($dbh);
124 function failQuery($res = NULL) {
126 printf(_("Preference database error (%s). Exiting abnormally"),
129 printf(_("Preference database error (%s). Exiting abnormally"),
130 DB
::errorMessage($res));
136 function getKey($user, $key, $default = '') {
139 cachePrefValues($user);
141 if (isset($prefs_cache[$key])) {
142 return $prefs_cache[$key];
144 if (isset($this->default[$key])) {
145 return $this->default[$key];
152 function deleteKey($user, $key) {
155 if (!$this->open()) {
158 $query = sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
161 $this->dbh
->quoteString($user),
163 $this->dbh
->quoteString($key));
165 $res = $this->dbh
->simpleQuery($query);
166 if(DB
::isError($res)) {
167 $this->failQuery($res);
170 unset($prefs_cache[$key]);
172 if(substr($key, 0, 9) == 'highlight') {
173 $this->renumberHighlightList($user);
179 function setKey($user, $key, $value) {
180 if (!$this->open()) {
183 if ($this->db_type
== SMDB_MYSQL
) {
184 $query = sprintf("REPLACE INTO %s (%s, %s, %s) ".
185 "VALUES('%s','%s','%s')",
190 $this->dbh
->quoteString($user),
191 $this->dbh
->quoteString($key),
192 $this->dbh
->quoteString($value));
194 $res = $this->dbh
->simpleQuery($query);
195 if(DB
::isError($res)) {
196 $this->failQuery($res);
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'",
203 $this->dbh
->quoteString($user),
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);
211 $query = sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
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);
224 $this->dbh
->simpleQuery("COMMIT TRANSACTION");
226 $query = sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
229 $this->dbh
->quoteString($user),
231 $this->dbh
->quoteString($key));
232 $res = $this->dbh
->simpleQuery($query);
233 if (DB
::isError($res)) {
234 $this->failQuery($res);
236 $query = sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
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);
253 function fillPrefsCache($user) {
256 if (!$this->open()) {
260 $prefs_cache = array();
261 $query = sprintf("SELECT %s as prefkey, %s as prefval FROM %s ".
267 $this->dbh
->quoteString($user));
268 $res = $this->dbh
->query($query);
269 if (DB
::isError($res)) {
270 $this->failQuery($res);
273 while ($row = $res->fetchRow(DB_FETCHMODE_ASSOC
)) {
274 $prefs_cache[$row['prefkey']] = $row['prefval'];
279 * When a highlight option is deleted the preferences module
280 * must renumber the list. This should be done somewhere else,
281 * but it is not, so....
283 function renumberHighlightList($user) {
284 if (!$this->open()) {
287 $query = sprintf("SELECT %s, %s as prefkey, %s as prefval FROM %s WHERE %s='%s' ".
288 "AND %s LIKE 'highlight%%' ORDER BY %s",
294 $this->dbh
->quoteString($user),
298 $res = $this->dbh
->query($query);
299 if(DB
::isError($res)) {
300 $this->failQuery($res);
303 /* Store old data in array */
305 while($row = $res->fetchRow(DB_FETCHMODE_ASSOC
)) {
309 /* Renumber keys of old data */
311 for($i = 0; $i < count($rows) ; $i++
) {
312 $oldkey = $rows[$i]['prefkey'];
313 $newkey = substr($oldkey, 0, 9) . $hilinum;
316 if($oldkey != $newkey) {
317 $query = sprintf("UPDATE %s SET %s='%s' ".
318 "WHERE %s ='%s' AND %s='%s'",
321 $this->dbh
->quoteString($newkey),
323 $this->dbh
->quoteString($user),
325 $this->dbh
->quoteString($oldkey));
327 $res = $this->dbh
->simpleQuery($query);
328 if(DB
::isError($res)) {
329 $this->failQuery($res);
337 } /* end class dbPrefs */
340 /* returns the value for the pref $string */
341 function getPref($data_dir, $username, $string, $default = '') {
343 if(isset($db->error
)) {
344 printf( _("Preference database error (%s). Exiting abnormally"),
349 return $db->getKey($username, $string, $default);
352 /* Remove the pref $string */
353 function removePref($data_dir, $username, $string) {
355 if(isset($db->error
)) {
359 $db->deleteKey($username, $string);
363 /* sets the pref, $string, to $set_to */
364 function setPref($data_dir, $username, $string, $set_to) {
367 if (isset($prefs_cache[$string]) && ($prefs_cache[$string] == $set_to)) {
372 removePref($data_dir, $username, $string);
377 if(isset($db->error
)) {
381 $db->setKey($username, $string, $set_to);
382 $prefs_cache[$string] = $set_to;
383 assert_options(ASSERT_ACTIVE
, 1);
384 assert_options(ASSERT_BAIL
, 1);
385 assert ('$set_to == $prefs_cache[$string]');
390 /* This checks if the prefs are available */
391 function checkForPrefs($data_dir, $username) {
393 if(isset($db->error
)) {
398 /* Writes the Signature */
399 function setSig($data_dir, $username, $number, $string) {
400 if ($number == "g") {
401 $key = '___signature___';
403 $key = sprintf('___sig%s___', $number);
405 setPref($data_dir, $username, $key, $string);
409 /* Gets the signature */
410 function getSig($data_dir, $username, $number) {
411 if ($number == "g") {
412 $key = '___signature___';
414 $key = sprintf('___sig%d___', $number);
416 return getPref($data_dir, $username, $key);