Source for file db_prefs.php

Documentation is available at db_prefs.php

  1. <?php
  2.  
  3. /**
  4.  * db_prefs.php
  5.  *
  6.  * This contains functions for manipulating user preferences
  7.  * stored in a database, accessed though the Pear DB layer
  8.  * or PDO, the latter taking precedence if available.
  9.  *
  10.  * Database:
  11.  *
  12.  * The preferences table should have three columns:
  13.  *    user       char  \  primary
  14.  *    prefkey    char  /  key
  15.  *    prefval    blob
  16.  *
  17.  *   CREATE TABLE userprefs (user CHAR(128) NOT NULL DEFAULT '',
  18.  *                           prefkey CHAR(64) NOT NULL DEFAULT '',
  19.  *                           prefval BLOB NOT NULL DEFAULT '',
  20.  *                           primary key (user,prefkey));
  21.  *
  22.  * Configuration of databasename, username and password is done
  23.  * by using conf.pl or the administrator plugin
  24.  *
  25.  * Three settings that control PDO behavior can be specified in
  26.  * config/config_local.php if needed:
  27.  *    boolean $disable_pdo SquirrelMail uses PDO by default to access the
  28.  *                         user preferences and address book databases, but
  29.  *                         setting this to TRUE will cause SquirrelMail to
  30.  *                         fall back to using Pear DB instead.
  31.  *    boolean $pdo_show_sql_errors When database errors are encountered,
  32.  *                                 setting this to TRUE causes the actual
  33.  *                                 database error to be displayed, otherwise
  34.  *                                 generic errors are displayed, preventing
  35.  *                                 internal database information from being
  36.  *                                 exposed. This should be enabled only for
  37.  *                                 debugging purposes.
  38.  *    string $pdo_identifier_quote_char By default, SquirrelMail will quote
  39.  *                                      table and field names in database
  40.  *                                      queries with what it thinks is the
  41.  *                                      appropriate quote character for the
  42.  *                                      database type being used (backtick
  43.  *                                      for MySQL (and thus MariaDB), double
  44.  *                                      quotes for all others), but you can
  45.  *                                      override the character used by
  46.  *                                      putting it here, or tell SquirrelMail
  47.  *                                      NOT to quote identifiers by setting
  48.  *                                      this to "none"
  49.  *
  50.  * @copyright 1999-2016 The SquirrelMail Project Team
  51.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  52.  * @version $Id: db_prefs.php 14604 2016-10-29 21:56:48Z pdontthink $
  53.  * @package squirrelmail
  54.  * @subpackage prefs
  55.  * @since 1.1.3
  56.  */
  57.  
  58. /** Unknown database */
  59. define('SMDB_UNKNOWN'0);
  60. /** MySQL */
  61. define('SMDB_MYSQL'1);
  62. /** PostgreSQL */
  63. define('SMDB_PGSQL'2);
  64.  
  65. global $disable_pdo$use_pdo;
  66. if (empty($disable_pdo&& class_exists('PDO'))
  67.     $use_pdo TRUE;
  68. else
  69.     $use_pdo FALSE;
  70.  
  71. if (!$use_pdo && !include_once('DB.php')) {
  72.     // same error also in abook_database.php
  73.     require_once(SM_PATH 'functions/display_messages.php');
  74.     $error  _("Could not find or include PHP PDO or PEAR database functions required for the database backend.""<br />\n";
  75.     if (!empty($disable_pdo))
  76.         $error .= _("You have set \$disable_pdo - please try removing that.""<br />\n";
  77.     $error .= sprintf(_("PDO should come preinstalled with PHP version 5.1 or higher. Otherwise, is PEAR installed, and is the include path set correctly to find %s?")'<tt>DB.php</tt>'"<br />\n";
  78.     $error .= _("Please contact your system administrator and report this error.");
  79.     error_box($error$color);
  80.     exit;
  81. }
  82.  
  83. global $prefs_are_cached$prefs_cache;
  84.  
  85. /**
  86.  * @ignore
  87.  */
  88. function cachePrefValues($username{
  89.     global $prefs_are_cached$prefs_cache;
  90.  
  91.     sqgetGlobalVar('prefs_are_cached'$prefs_are_cachedSQ_SESSION );
  92.     if ($prefs_are_cached{
  93.         sqgetGlobalVar('prefs_cache'$prefs_cacheSQ_SESSION );
  94.         return;
  95.     }
  96.  
  97.     sqsession_unregister('prefs_cache');
  98.     sqsession_unregister('prefs_are_cached');
  99.  
  100.     $db new dbPrefs;
  101.     if(isset($db->error)) {
  102.         printf_("Preference database error (%s). Exiting abnormally"),
  103.               $db->error);
  104.         exit;
  105.     }
  106.  
  107.     $db->fillPrefsCache($username);
  108.     if (isset($db->error)) {
  109.         printf_("Preference database error (%s). Exiting abnormally"),
  110.               $db->error);
  111.         exit;
  112.     }
  113.  
  114.     $prefs_are_cached true;
  115.  
  116.     sqsession_register($prefs_cache'prefs_cache');
  117.     sqsession_register($prefs_are_cached'prefs_are_cached');
  118. }
  119.  
  120. /**
  121.  * Completely undocumented class - someone document it!
  122.  * @package squirrelmail
  123.  */
  124. class dbPrefs {
  125.     var $table = 'userprefs';
  126.     var $user_field = 'user';
  127.     var $key_field = 'prefkey';
  128.     var $val_field = 'prefval';
  129.  
  130.     var $dbh   = NULL;
  131.     var $error = NULL;
  132.     var $db_type = SMDB_UNKNOWN;
  133.  
  134.     var $identifier_quote_char = '';
  135.  
  136.     var $default = Array('theme_default' => 0,
  137.                          'include_self_reply_all' => 0,
  138.                          'do_not_reply_to_self' => 1,
  139.                          'show_html_default' => '0');
  140.  
  141.     /**
  142.      * initialize the default preferences array.
  143.      *
  144.      */
  145.     function dbPrefs({
  146.         // Try and read the default preferences file.
  147.         $default_pref SM_PATH 'data/default_pref';
  148.         if (@file_exists($default_pref)) {
  149.             if ($file @fopen($default_pref'r')) {
  150.                 while (!feof($file)) {
  151.                     $pref fgets($file1024);
  152.                     $i strpos($pref'=');
  153.                     if ($i 0{
  154.                         $this->default[trim(substr($pref0$i))trim(substr($pref$i 1));
  155.                     }
  156.                 }
  157.                 fclose($file);
  158.             }
  159.         }
  160.     }
  161.  
  162.     function open({
  163.         global $prefs_dsn$prefs_table$use_pdo$pdo_identifier_quote_char;
  164.         global $prefs_user_field$prefs_key_field$prefs_val_field;
  165.  
  166.         if(isset($this->dbh)) {
  167.             return true;
  168.         }
  169.  
  170.         if (strpos($prefs_dsn'mysql'=== 0{
  171.             $this->db_type = SMDB_MYSQL;
  172.         else if (strpos($prefs_dsn'pgsql'=== 0{
  173.             $this->db_type = SMDB_PGSQL;
  174.         }
  175.  
  176.         // figure out identifier quoting (only used for PDO, though we could change that)
  177.         if (empty($pdo_identifier_quote_char)) {
  178.             if ($this->db_type == SMDB_MYSQL)
  179.                 $this->identifier_quote_char = '`';
  180.             else
  181.                 $this->identifier_quote_char = '"';
  182.         else if ($pdo_identifier_quote_char === 'none')
  183.             $this->identifier_quote_char = '';
  184.         else
  185.             $this->identifier_quote_char = $pdo_identifier_quote_char;
  186.  
  187.         if (!empty($prefs_table)) {
  188.             $this->table = $prefs_table;
  189.         }
  190.         if (!empty($prefs_user_field)) {
  191.             $this->user_field = $prefs_user_field;
  192.         }
  193.  
  194.         // the default user field is "user", which in PostgreSQL
  195.         // is an identifier and causes errors if not escaped
  196.         //
  197.         if ($this->db_type == SMDB_PGSQL{
  198.            $this->user_field = '"' $this->user_field . '"';
  199.         }
  200.  
  201.         if (!empty($prefs_key_field)) {
  202.             $this->key_field = $prefs_key_field;
  203.         }
  204.         if (!empty($prefs_val_field)) {
  205.             $this->val_field = $prefs_val_field;
  206.         }
  207.  
  208.         // connect, create database connection object
  209.         //
  210.         if ($use_pdo{
  211.             // parse and convert DSN to PDO style
  212.             // Pear's full DSN syntax is one of the following:
  213.             //    phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value
  214.             //    phptype(syntax)://user:pass@protocol(proto_opts)/database
  215.             //
  216.             // $matches will contain:
  217.             // 1: database type
  218.             // 2: username
  219.             // 3: password
  220.             // 4: hostname (and possible port number) OR protocol (and possible protocol options)
  221.             // 5: database name (and possible options)
  222.             // 6: port number (moved from match number 4)
  223.             // 7: options (moved from match number 5)
  224.             // 8: protocol (instead of hostname)
  225.             // 9: protocol options (moved from match number 4/8)
  226. //TODO: do we care about supporting cases where no password is given? (this is a legal DSN, but causes an error below)
  227.             if (!preg_match('|^(.+)://(.+):(.+)@(.+)/(.+)$|i'$prefs_dsn$matches)) {
  228.                 $this->error = _("Could not parse prefs DSN");
  229.                 return false;
  230.             }
  231.             $matches[6NULL;
  232.             $matches[7NULL;
  233.             $matches[8NULL;
  234.             $matches[9NULL;
  235.             if (preg_match('|^(.+):(\d+)$|'$matches[4]$host_port_matches)) {
  236.                 $matches[4$host_port_matches[1];
  237.                 $matches[6$host_port_matches[2];
  238.             }
  239.             if (preg_match('|^(.+?)\((.+)\)$|'$matches[4]$protocol_matches)) {
  240.                 $matches[8$protocol_matches[1];
  241.                 $matches[9$protocol_matches[2];
  242.                 $matches[4NULL;
  243.                 $matches[6NULL;
  244.             }
  245. //TODO: currently we just ignore options specified on the end of the DSN
  246.             if (preg_match('|^(.+?)\?(.+)$|'$matches[5]$database_name_options_matches)) {
  247.                 $matches[5$database_name_options_matches[1];
  248.                 $matches[7$database_name_options_matches[2];
  249.             }
  250.             if ($matches[8=== 'unix' && !empty($matches[9]))
  251.                 $pdo_prefs_dsn $matches[1':unix_socket=' $matches[9';dbname=' $matches[5];
  252.             else
  253.                 $pdo_prefs_dsn $matches[1':host=' $matches[4(!empty($matches[6]';port=' $matches[6''';dbname=' $matches[5];
  254.             try {
  255.                 $dbh new PDO($pdo_prefs_dsn$matches[2]$matches[3]);
  256.             catch (Exception $e{
  257.                 $this->error = $e->getMessage();
  258.                 return false;
  259.             }
  260.         else {
  261.             $dbh DB::connect($prefs_dsntrue);
  262.  
  263.             if(DB::isError($dbh)) {
  264.                 $this->error = DB::errorMessage($dbh);
  265.                 return false;
  266.             }
  267.         }
  268.  
  269.         $this->dbh = $dbh;
  270.         return true;
  271.     }
  272.  
  273.     function failQuery($res NULL{
  274.         global $use_pdo;
  275.         if($res == NULL{
  276.             printf(_("Preference database error (%s). Exiting abnormally"),
  277.                   $this->error);
  278.         else {
  279.             printf(_("Preference database error (%s). Exiting abnormally"),
  280.                   ($use_pdo implode(' - '$res->errorInfo()) DB::errorMessage($res)));
  281.         }
  282.         exit;
  283.     }
  284.  
  285.  
  286.     function getKey($user$key$default ''{
  287.         global $prefs_cache;
  288.  
  289.         $result NULL;
  290.         $result do_hook_function('get_pref_override'array($user$key$default));
  291. // FIXME: ideally, we'd have a better way to determine if the return value from the hook above should be respected, even if it is NULL, but this is as good as it gets for now... previously the test was more weak: if (!$result)
  292.         if (is_null($result)) {
  293.             cachePrefValues($user);
  294.  
  295.             if (isset($prefs_cache[$key])) {
  296.                 $result $prefs_cache[$key];
  297.             else {
  298. //FIXME: is there justification for having these TWO hooks so close together?  who uses these?
  299.                 $result do_hook_function('get_pref'array($user$key));
  300. //FIXME: testing below for !$result means that a plugin cannot fetch its own pref value of 0, '0', '', FALSE, or anything else that evaluates to boolean FALSE.
  301.                 if (!$result{
  302.                     if (isset($this->default[$key])) {
  303.                         $result $this->default[$key];
  304.                     else {
  305.                         $result $default;
  306.                     }
  307.                 }
  308.             }
  309.         }
  310.         return $result;
  311.     }
  312.  
  313.     function deleteKey($user$key{
  314.         global $prefs_cache$use_pdo$pdo_show_sql_errors;
  315.  
  316.         if (!$this->open()) {
  317.             return false;
  318.         }
  319.         if ($use_pdo{
  320.             if (!($sth $this->dbh->prepare('DELETE FROM ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' WHERE ' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ' = ? AND ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ' = ?'))) {
  321.                 if ($pdo_show_sql_errors)
  322.                     $this->error = implode(' - '$this->dbh->errorInfo());
  323.                 else
  324.                     $this->error = _("Could not prepare query");
  325.                 $this->failQuery();
  326.             }
  327.             if (!($res $sth->execute(array($user$key)))) {
  328.                 if ($pdo_show_sql_errors)
  329.                     $this->error = implode(' - '$sth->errorInfo());
  330.                 else
  331.                     $this->error = _("Could not execute query");
  332.                 $this->failQuery();
  333.             }
  334.         else {
  335.             $query sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
  336.                              $this->table,
  337.                              $this->user_field,
  338.                              $this->dbh->quoteString($user),
  339.                              $this->key_field,
  340.                              $this->dbh->quoteString($key));
  341.  
  342.             $res $this->dbh->simpleQuery($query);
  343.             if(DB::isError($res)) {
  344.                 $this->failQuery($res);
  345.             }
  346.         }
  347.  
  348.         unset($prefs_cache[$key]);
  349.  
  350.         return true;
  351.     }
  352.  
  353.     function setKey($user$key$value{
  354.         global $use_pdo$pdo_show_sql_errors;
  355.         if (!$this->open()) {
  356.             return false;
  357.         }
  358.         if ($this->db_type == SMDB_MYSQL{
  359.             if ($use_pdo{
  360.                 if (!($sth $this->dbh->prepare('REPLACE INTO ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' (' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->val_field . $this->identifier_quote_char . ') VALUES (?, ?, ?)'))) {
  361.                     if ($pdo_show_sql_errors)
  362.                         $this->error = implode(' - '$this->dbh->errorInfo());
  363.                     else
  364.                         $this->error = _("Could not prepare query");
  365.                     $this->failQuery();
  366.                 }
  367.                 if (!($res $sth->execute(array($user$key$value)))) {
  368.                     if ($pdo_show_sql_errors)
  369.                         $this->error = implode(' - '$sth->errorInfo());
  370.                     else
  371.                         $this->error = _("Could not execute query");
  372.                     $this->failQuery();
  373.                 }
  374.             else {
  375.                 $query sprintf("REPLACE INTO %s (%s, %s, %s) ".
  376.                                  "VALUES('%s','%s','%s')",
  377.                                  $this->table,
  378.                                  $this->user_field,
  379.                                  $this->key_field,
  380.                                  $this->val_field,
  381.                                  $this->dbh->quoteString($user),
  382.                                  $this->dbh->quoteString($key),
  383.                                  $this->dbh->quoteString($value));
  384.  
  385.                 $res $this->dbh->simpleQuery($query);
  386.                 if(DB::isError($res)) {
  387.                     $this->failQuery($res);
  388.                 }
  389.             }
  390.         elseif ($this->db_type == SMDB_PGSQL{
  391.             if ($use_pdo{
  392.                 if ($this->dbh->exec('BEGIN TRANSACTION'=== FALSE{
  393.                     if ($pdo_show_sql_errors)
  394.                         $this->error = implode(' - '$this->dbh->errorInfo());
  395.                     else
  396.                         $this->error = _("Could not execute query");
  397.                     $this->failQuery();
  398.                 }
  399.                 if (!($sth $this->dbh->prepare('DELETE FROM ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' WHERE ' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ' = ? AND ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ' = ?'))) {
  400.                     if ($pdo_show_sql_errors)
  401.                         $this->error = implode(' - '$this->dbh->errorInfo());
  402.                     else
  403.                         $this->error = _("Could not prepare query");
  404.                     $this->failQuery();
  405.                 }
  406.                 if (!($res $sth->execute(array($user$key)))) {
  407.                     if ($pdo_show_sql_errors)
  408.                         $this->error = implode(' - '$sth->errorInfo());
  409.                     else
  410.                         $this->error = _("Could not execute query");
  411.                     $this->dbh->exec('ROLLBACK TRANSACTION');
  412.                     $this->failQuery();
  413.                 }
  414.                 if (!($sth $this->dbh->prepare('INSERT INTO ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' (' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->val_field . $this->identifier_quote_char . ') VALUES (?, ?, ?)'))) {
  415.                     if ($pdo_show_sql_errors)
  416.                         $this->error = implode(' - '$this->dbh->errorInfo());
  417.                     else
  418.                         $this->error = _("Could not prepare query");
  419.                     $this->failQuery();
  420.                 }
  421.                 if (!($res $sth->execute(array($user$key$value)))) {
  422.                     if ($pdo_show_sql_errors)
  423.                         $this->error = implode(' - '$sth->errorInfo());
  424.                     else
  425.                         $this->error = _("Could not execute query");
  426.                     $this->dbh->exec('ROLLBACK TRANSACTION');
  427.                     $this->failQuery();
  428.                 }
  429.                 if ($this->dbh->exec('COMMIT TRANSACTION'=== FALSE{
  430.                     if ($pdo_show_sql_errors)
  431.                         $this->error = implode(' - '$this->dbh->errorInfo());
  432.                     else
  433.                         $this->error = _("Could not execute query");
  434.                     $this->failQuery();
  435.                 }
  436.             else {
  437.                 $this->dbh->simpleQuery("BEGIN TRANSACTION");
  438.                 $query sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
  439.                                  $this->table,
  440.                                  $this->user_field,
  441.                                  $this->dbh->quoteString($user),
  442.                                  $this->key_field,
  443.                                  $this->dbh->quoteString($key));
  444.                 $res $this->dbh->simpleQuery($query);
  445.                 if (DB::isError($res)) {
  446.                     $this->dbh->simpleQuery("ROLLBACK TRANSACTION");
  447.                     $this->failQuery($res);
  448.                 }
  449.                 $query sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
  450.                                  $this->table,
  451.                                  $this->user_field,
  452.                                  $this->key_field,
  453.                                  $this->val_field,
  454.                                  $this->dbh->quoteString($user),
  455.                                  $this->dbh->quoteString($key),
  456.                                  $this->dbh->quoteString($value));
  457.                 $res $this->dbh->simpleQuery($query);
  458.                 if (DB::isError($res)) {
  459.                     $this->dbh->simpleQuery("ROLLBACK TRANSACTION");
  460.                     $this->failQuery($res);
  461.                 }
  462.                 $this->dbh->simpleQuery("COMMIT TRANSACTION");
  463.             }
  464.         else {
  465.             if ($use_pdo{
  466.                 if (!($sth $this->dbh->prepare('DELETE FROM ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' WHERE ' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ' = ? AND ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ' = ?'))) {
  467.                     if ($pdo_show_sql_errors)
  468.                         $this->error = implode(' - '$this->dbh->errorInfo());
  469.                     else
  470.                         $this->error = _("Could not prepare query");
  471.                     $this->failQuery();
  472.                 }
  473.                 if (!($res $sth->execute(array($user$key)))) {
  474.                     if ($pdo_show_sql_errors)
  475.                         $this->error = implode(' - '$sth->errorInfo());
  476.                     else
  477.                         $this->error = _("Could not execute query");
  478.                     $this->failQuery();
  479.                 }
  480.                 if (!($sth $this->dbh->prepare('INSERT INTO ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' (' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ', ' $this->identifier_quote_char . $this->val_field . $this->identifier_quote_char . ') VALUES (?, ?, ?)'))) {
  481.                     if ($pdo_show_sql_errors)
  482.                         $this->error = implode(' - '$this->dbh->errorInfo());
  483.                     else
  484.                         $this->error = _("Could not prepare query");
  485.                     $this->failQuery();
  486.                 }
  487.                 if (!($res $sth->execute(array($user$key$value)))) {
  488.                     if ($pdo_show_sql_errors)
  489.                         $this->error = implode(' - '$sth->errorInfo());
  490.                     else
  491.                         $this->error = _("Could not execute query");
  492.                     $this->failQuery();
  493.                 }
  494.             else {
  495.                 $query sprintf("DELETE FROM %s WHERE %s='%s' AND %s='%s'",
  496.                                  $this->table,
  497.                                  $this->user_field,
  498.                                  $this->dbh->quoteString($user),
  499.                                  $this->key_field,
  500.                                  $this->dbh->quoteString($key));
  501.                 $res $this->dbh->simpleQuery($query);
  502.                 if (DB::isError($res)) {
  503.                     $this->failQuery($res);
  504.                 }
  505.                 $query sprintf("INSERT INTO %s (%s, %s, %s) VALUES ('%s', '%s', '%s')",
  506.                                  $this->table,
  507.                                  $this->user_field,
  508.                                  $this->key_field,
  509.                                  $this->val_field,
  510.                                  $this->dbh->quoteString($user),
  511.                                  $this->dbh->quoteString($key),
  512.                                  $this->dbh->quoteString($value));
  513.                 $res $this->dbh->simpleQuery($query);
  514.                 if (DB::isError($res)) {
  515.                     $this->failQuery($res);
  516.                 }
  517.             }
  518.         }
  519.  
  520.         return true;
  521.     }
  522.  
  523.     function fillPrefsCache($user{
  524.         global $prefs_cache$use_pdo$pdo_show_sql_errors;
  525.  
  526.         if (!$this->open()) {
  527.             return;
  528.         }
  529.  
  530.         $prefs_cache array();
  531.         if ($use_pdo{
  532.             if (!($sth $this->dbh->prepare('SELECT ' $this->identifier_quote_char . $this->key_field . $this->identifier_quote_char . ' AS prefkey, ' $this->identifier_quote_char . $this->val_field . $this->identifier_quote_char . ' AS prefval FROM ' $this->identifier_quote_char . $this->table . $this->identifier_quote_char . ' WHERE ' $this->identifier_quote_char . $this->user_field . $this->identifier_quote_char . ' = ?'))) {
  533.                 if ($pdo_show_sql_errors)
  534.                     $this->error = implode(' - '$this->dbh->errorInfo());
  535.                 else
  536.                     $this->error = _("Could not prepare query");
  537.                 $this->failQuery();
  538.             }
  539.             if (!($res $sth->execute(array($user)))) {
  540.                 if ($pdo_show_sql_errors)
  541.                     $this->error = implode(' - '$sth->errorInfo());
  542.                 else
  543.                     $this->error = _("Could not execute query");
  544.                 $this->failQuery();
  545.             }
  546.  
  547.             while ($row $sth->fetch(PDO::FETCH_ASSOC)) {
  548.                 $prefs_cache[$row['prefkey']] $row['prefval'];
  549.             }
  550.         else {
  551.             $query sprintf("SELECT %s as prefkey, %s as prefval FROM %s ".
  552.                              "WHERE %s = '%s'",
  553.                              $this->key_field,
  554.                              $this->val_field,
  555.                              $this->table,
  556.                              $this->user_field,
  557.                              $this->dbh->quoteString($user));
  558.             $res $this->dbh->query($query);
  559.             if (DB::isError($res)) {
  560.                 $this->failQuery($res);
  561.             }
  562.  
  563.             while ($row $res->fetchRow(DB_FETCHMODE_ASSOC)) {
  564.                 $prefs_cache[$row['prefkey']] $row['prefval'];
  565.             }
  566.         }
  567.     }
  568.  
  569. /* end class dbPrefs */
  570.  
  571.  
  572. /**
  573.  * returns the value for the pref $string
  574.  * @ignore
  575.  */
  576. function getPref($data_dir$username$string$default ''{
  577.     $db new dbPrefs;
  578.     if(isset($db->error)) {
  579.         printf_("Preference database error (%s). Exiting abnormally"),
  580.               $db->error);
  581.         exit;
  582.     }
  583.  
  584.     return $db->getKey($username$string$default);
  585. }
  586.  
  587. /**
  588.  * Remove the pref $string
  589.  * @ignore
  590.  */
  591. function removePref($data_dir$username$string{
  592.     global $prefs_cache;
  593.     $db new dbPrefs;
  594.     if(isset($db->error)) {
  595.         $db->failQuery();
  596.     }
  597.  
  598.     $db->deleteKey($username$string);
  599.  
  600.     if (isset($prefs_cache[$string])) {
  601.         unset($prefs_cache[$string]);
  602.     }
  603.  
  604.     sqsession_register($prefs_cache 'prefs_cache');
  605.     return;
  606. }
  607.  
  608. /**
  609.  * sets the pref, $string, to $set_to
  610.  * @ignore
  611.  */
  612. function setPref($data_dir$username$string$set_to{
  613.     global $prefs_cache;
  614.  
  615.     if (isset($prefs_cache[$string]&& ($prefs_cache[$string== $set_to)) {
  616.         return;
  617.     }
  618.  
  619.     if ($set_to === ''{
  620.         removePref($data_dir$username$string);
  621.         return;
  622.     }
  623.  
  624.     $db new dbPrefs;
  625.     if(isset($db->error)) {
  626.         $db->failQuery();
  627.     }
  628.  
  629.     $db->setKey($username$string$set_to);
  630.     $prefs_cache[$string$set_to;
  631.     assert_options(ASSERT_ACTIVE1);
  632.     assert_options(ASSERT_BAIL1);
  633.     assert ('$set_to == $prefs_cache[$string]');
  634.     sqsession_register($prefs_cache 'prefs_cache');
  635.     return;
  636. }
  637.  
  638. /**
  639.  * This checks if the prefs are available
  640.  * @ignore
  641.  */
  642. function checkForPrefs($data_dir$username{
  643.     $db new dbPrefs;
  644.     if(isset($db->error)) {
  645.         $db->failQuery();
  646.     }
  647. }
  648.  
  649. /**
  650.  * Writes the Signature
  651.  * @ignore
  652.  */
  653. function setSig($data_dir$username$number$string{
  654.     if ($number == "g"{
  655.         $key '___signature___';
  656.     else {
  657.         $key sprintf('___sig%s___'$number);
  658.     }
  659.     setPref($data_dir$username$key$string);
  660.     return;
  661. }
  662.  
  663. /**
  664.  * Gets the signature
  665.  * @ignore
  666.  */
  667. function getSig($data_dir$username$number{
  668.     if ($number == "g"{
  669.         $key '___signature___';
  670.     else {
  671.         $key sprintf('___sig%d___'$number);
  672.     }
  673.     return getPref($data_dir$username$key);
  674. }

Documentation generated on Fri, 02 Dec 2016 04:26:53 +0100 by phpDocumentor 1.4.3