source: github/program/include/rcube_mdb2.inc @ d7cb774

HEADcourier-fixdev-browser-capabilitiespdorelease-0.6release-0.7release-0.8
Last change on this file since d7cb774 was d7cb774, checked in by svncommit <devs@…>, 8 years ago

more pear/mdb2 integration

  • Property mode set to 100755
File size: 7.7 KB
Line 
1<?php
2
3/*
4 +-----------------------------------------------------------------------+
5 | program/include/rcube_db.inc                                          |
6 |                                                                       |
7 | This file is part of the RoundCube Webmail client                     |
8 | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
9 | Licensed under the GNU GPL                                            |
10 |                                                                       |
11 | PURPOSE:                                                              |
12 |   PEAR:DB wrapper class that implements PEAR DB functions             |
13 |   See http://pear.php.net/package/DB                                  |
14 |                                                                       |
15 +-----------------------------------------------------------------------+
16 | Author: David Saez Padros <david@ols.es>                              |
17 +-----------------------------------------------------------------------+
18
19 $Id$
20
21*/
22
23require_once('MDB2.php');
24
25class rcube_db
26{
27    var $db_dsnw;               // DSN for write operations
28    var $db_dsnr;               // DSN for read operations
29    var $db_connected=false;    // Already connected ?
30    var $db_mode='';            // Connection mode
31    var $db_handle=0;           // Connection handle
32
33    var $a_query_results = array('dummy');
34    var $last_res_id = 0;
35
36    // PHP 5 constructor
37    function __construct($db_dsnw,$db_dsnr='')
38    {
39        if ($db_dsnr=='') $db_dsnr=$db_dsnw;
40       
41        $this->db_dsnw = $db_dsnw;
42        $this->db_dsnr = $db_dsnr;
43       
44        $dsn_array = MDB2::parseDSN($db_dsnw);
45        $this->db_provider = $dsn_array['phptype'];
46    }
47
48    // PHP 4 compatibility
49    function rcube_db($db_dsnw,$db_dsnr='')
50    {
51        $this->__construct($db_dsnw,$db_dsnr);
52    }
53
54    // Connect to specific database
55    function dsn_connect($dsn)
56    {
57        // Use persistent connections if available
58        $dbh = MDB2::factory($dsn, array('persistent' => $true));
59       
60        if (PEAR::isError($dbh))
61            raise_error(array('code' => 500,
62                        'type' => 'db',
63                        'line' => __LINE__,
64                        'file' => __FILE__,
65                        'message' => $dbh->getMessage()), TRUE, FALSE);
66
67        else if ($this->db_provider=='sqlite')
68        {
69            $dsn_array = MDB2::parseDSN($dsn);
70            if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
71                $this->_sqlite_create_database($dbh, $this->sqlite_initials);
72        }
73       
74        return $dbh;
75    }
76
77    // Connect to appropiate databse   
78    function db_connect ($mode)
79    {
80        $this->db_mode = $mode;
81
82        // Already connected
83        if ($this->db_connected)
84            {
85            // no replication, current connection is ok
86            if ($this->db_dsnw==$this->db_dsnr) return;
87           
88            // connected to master, current connection is ok
89            if ($this->db_mode=='w') return;
90
91            // Same mode, current connection is ok
92            if ($this->db_mode==$mode) return;
93            }
94           
95        if ($mode=='r')
96            $dsn=$this->db_dsnr;
97        else
98            $dsn=$this->db_dsnw;
99
100        $this->db_handle = $this->dsn_connect($dsn);
101        $this->db_connected = true;
102    }
103
104    // Query database
105   
106    function query()
107    {
108                $params = func_get_args();
109                $query = array_shift($params);
110               
111                return $this->_query($query, 0, 0, $params);
112    }
113   
114        function limitquery()
115    {
116                $params = func_get_args();
117                $query = array_shift($params);
118                $offset = array_shift($params);
119                $numrows = array_shift($params);
120               
121                return $this->_query($query, $offset, $numrows, $params);
122    }
123   
124    function _query($query, $offset, $numrows, $params)
125    {
126        // Read or write ?
127        if (strtolower(trim(substr($query,0,6)))=='select')
128            $mode='r';
129        else
130            $mode='w';
131       
132        $this->db_connect($mode);
133
134        if ($this->db_provider == 'sqlite')
135            $query = $this->_sqlite_prepare_query($query);
136           
137        $this->db_handle->row_offset = $offset;
138                $this->db_handle->row_limit = $numrows;
139               
140        $result = $this->db_handle->query($query);
141       
142        if (PEAR::isError($result))
143            raise_error(array('code' => 500,
144                              'type' => 'db',
145                              'line' => __LINE__,
146                              'file' => __FILE__,
147                              'message' => $result->getMessage()), TRUE, FALSE);
148       
149        return $this->_add_result($result, $query);
150    }
151
152    function num_rows($res_id=NULL)
153    {
154        if (!$this->db_handle)
155            return FALSE;
156
157        $result = $this->_get_result($res_id);
158   
159        if ($result)   
160              return $result->numRows();
161        else
162              return FALSE;
163    }
164
165    function affected_rows($res_id=NULL)
166    {
167        if (!$this->db_handle)
168            return FALSE;
169   
170        return $this->db_handle->affectedRows();
171    }
172
173    function insert_id($sequence = '')
174    {
175        if (!$this->db_handle || $this->db_mode=='r')
176            return FALSE;
177
178        return $this->db_handle->lastInsertID();
179    }
180
181
182    function fetch_assoc($res_id=NULL)
183    {
184        $result = $this->_get_result($res_id);
185
186        if (PEAR::isError($result))
187        {
188            raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
189                         'message' => $this->db_link->getMessage()), TRUE, FALSE);
190            return FALSE;
191        }
192                         
193        return $result->fetchRow(MDB2_FETCHMODE_ASSOC);
194    }
195
196        function quoteIdentifier ( $str )
197        {
198                if (!$this->db_handle)
199                        $this->db_connect('r');
200                       
201                return $this->db_handle->quoteIdentifier($str);
202        }
203       
204        function unixtimestamp($field)
205        {
206                switch($this->db_provider)
207                        {
208                        case 'pgsql':
209                                return "EXTRACT (EPOCH FROM $field)";
210                                break;
211                        default:
212                                return "UNIX_TIMESTAMP($field)";
213                        }
214        }
215       
216    function _add_result($res, $query)
217    {
218        // sql error occured
219        if (PEAR::isError($res))
220        {
221            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);
222             return FALSE;
223        }
224        else
225        {
226            $res_id = sizeof($this->a_query_results);
227            $this->a_query_results[$res_id] = $res;
228            $this->last_res_id = $res_id;
229            return $res_id;
230        }
231    }
232
233
234    function _get_result($res_id)
235    {
236        if ($res_id==NULL)
237            $res_id = $this->last_res_id;
238   
239        if ($res_id && isset($this->a_query_results[$res_id]))
240            return $this->a_query_results[$res_id];
241        else
242        return FALSE;
243    }
244
245
246    // create a sqlite database from a file
247    function _sqlite_create_database($dbh, $fileName)
248    {
249        if (empty($fileName) || !is_string($fileName))
250            return ;
251
252        $data = '';
253        if ($fd = fopen($fileName, 'r'))
254          {
255          $data = fread($fd, filesize($fileName));
256          fclose($fd);
257          }
258
259        if (strlen($data))
260          sqlite_exec($dbh->connection, $data);
261    }
262
263    // transform a query so that it is sqlite2 compliant
264    function _sqlite_prepare_query($query)
265    {
266        if (!is_string($query))
267            return ($query);
268
269        $search = array('/NOW\(\)/',
270                        '/`/');
271        $replace = array("datetime('now')",
272                         '"');
273        $query = preg_replace($search, $replace, $query);
274
275        return ($query);
276    }
277   
278}
279
280?>
Note: See TracBrowser for help on using the repository browser.