thomascube
2005-12-03 1cded85790206afe084e1baff371c543711b2b18
program/include/rcube_db.inc
@@ -33,10 +33,12 @@
    var $a_query_results = array('dummy');
    var $last_res_id = 0;
    // PHP 5 constructor
    function __construct($db_dsnw,$db_dsnr='')
    {
        if ($db_dsnr=='') $db_dsnr=$db_dsnw;
    if ($db_dsnr=='')
      $db_dsnr=$db_dsnw;
        
        $this->db_dsnw = $db_dsnw;
        $this->db_dsnr = $db_dsnr;
@@ -45,17 +47,19 @@
        $this->db_provider = $dsn_array['phptype'];        
    }
    // PHP 4 compatibility
    function rcube_db($db_dsnw,$db_dsnr='')
    {
        $this->__construct($db_dsnw,$db_dsnr);
    }
    // Connect to specific database 
    function dsn_connect($dsn)
    {
        // Use persistent connections if available
        $dbh = DB::connect($dsn, array('persistent' => $true));
    $dbh = DB::connect($dsn, array('persistent' => TRUE));
        
        if (DB::isError($dbh))
            raise_error(array('code' => 500,
@@ -74,6 +78,7 @@
        return $dbh;
    }
    // Connect to appropiate databse    
    function db_connect ($mode)
    {
@@ -83,13 +88,16 @@
        if ($this->db_connected)
            {
            // no replication, current connection is ok
            if ($this->db_dsnw==$this->db_dsnr) return;
      if ($this->db_dsnw==$this->db_dsnr)
        return;
            
            // connected to master, current connection is ok
            if ($this->db_mode=='w') return;
      if ($this->db_mode=='w')
        return;
            // Same mode, current connection is ok
            if ($this->db_mode==$mode) return;
      if ($this->db_mode==$mode)
        return;
            }
            
        if ($mode=='r')
@@ -101,8 +109,8 @@
        $this->db_connected = true;
    }
    // Query database
    
  // Query database
    function query()
    {
      $params = func_get_args();
@@ -111,6 +119,8 @@
      return $this->_query($query, 0, 0, $params);
    }
   
  // Query with limits
   function limitquery()
    {
      $params = func_get_args();
@@ -120,6 +130,7 @@
      
      return $this->_query($query, $offset, $numrows, $params);
    }
    
    function _query($query, $offset, $numrows, $params)
    {
@@ -132,40 +143,29 @@
        $this->db_connect($mode);
        if ($this->db_provider == 'sqlite')
            $query = $this->_sqlite_prepare_query($query);
      $this->_sqlite_prepare();
        
        if ($numrows || $offset)
         {
         $result = $this->db_handle->limitQuery($query,$offset,$numrows,$params);
         }
        else    
         $result = $this->db_handle->query($query, $params);
        if (DB::isError($result))
         {
            raise_error(array('code' => 500,
                              'type' => 'db',
                              'line' => __LINE__,
                              'file' => __FILE__,
                              'message' => $result->getMessage().'; QUERY: '.$query), TRUE, FALSE);
             return false;
    // add result, even if it's an error
    return $this->_add_result($result);
            }
        return $this->_add_result($result, $query);
    }
    
    function num_rows($res_id=NULL)
    {
        if (!$this->db_handle)
            return FALSE;
        $result = $this->_get_result($res_id);
        if ($result)
    if ($result = $this->_get_result($res_id))
              return $result->numRows();
        else
              return FALSE;
    }
    function affected_rows($res_id=NULL)
    {
@@ -174,6 +174,7 @@
    
        return $this->db_handle->affectedRows();
    }
    function insert_id($sequence = '')
    {
@@ -185,10 +186,10 @@
            case 'pgsql':
                // PostgreSQL uses sequences
                $result =& $this->db_handle->getOne("SELECT CURRVAL('$sequence')");    
                if (DB::isError($result)) {
        if (DB::isError($result))
                    raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 
                    'message' => $result->getMessage()), TRUE, TRUE);
                }
                            'message' => $result->getMessage()), TRUE, FALSE);
                return $result;
                
            case 'mysql': // This is unfortuneate
@@ -238,6 +239,7 @@
      return $this->db_handle->quoteIdentifier($str);
   }
   
   function quote_identifier($str)
   {
      return $this->quoteIdentifier($str);
@@ -251,17 +253,35 @@
         case 'pgsql':
            return "EXTRACT (EPOCH FROM $field)";
            break;
         default:
            return "UNIX_TIMESTAMP($field)";
         }
   }
   
    function _add_result($res, $query)
  function fromunixtime($timestamp)
    {
    switch($this->db_provider)
      {
      case 'mysqli':
      case 'mysql':
      case 'sqlite':
        return "FROM_UNIXTIME($timestamp)";
      default:
        return date("'Y-m-d H:i:s'", $timestamp);
      }
    }
  function _add_result($res)
    {
        // sql error occured
        if (DB::isError($res))
        {
            raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $query), 0, 1024)), TRUE, FALSE);
      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
                        'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 1024)), TRUE, FALSE);
             return FALSE;
        }
        else
@@ -303,11 +323,24 @@
          sqlite_exec($dbh->connection, $data);
    }
  function _sqlite_prepare()
    {
    include_once('include/rcube_sqlite.inc');
    // we emulate via callback some missing MySQL function
    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");
    }
/*
    // transform a query so that it is sqlite2 compliant
    function _sqlite_prepare_query($query)
    {
        if (!is_string($query))
            return ($query);
            
        $search = array('/NOW\(\)/i', '/`/');
        $replace = array("datetime('now')", '"');
@@ -315,7 +348,7 @@
        return ($query);
    }
}
*/
  }  // end class rcube_db
?>