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

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

MDB2 integration

  • Property mode set to 100755
File size: 7.1 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 (read operations)
105   
106    function query($query)
107    {
108        // Read or write ?
109        if (strtolower(trim(substr($query,0,6)))=='select')
110            $mode='r';
111        else
112            $mode='w';
113       
114        $this->db_connect($mode);
115
116        if ($this->db_provider == 'sqlite')
117            $query = $this->_sqlite_prepare_query($query);
118           
119        $result = $this->db_handle->query($query);
120       
121        if (PEAR::isError($result))
122            raise_error(array('code' => 500,
123                              'type' => 'db',
124                              'line' => __LINE__,
125                              'file' => __FILE__,
126                              'message' => $result->getMessage()), TRUE, FALSE);
127       
128        return $this->_add_result($result, $query);
129    }
130
131    function db_execute ($query)
132    {
133        $this->db_connect('w');
134
135        if ($this->db_provider == 'sqlite')
136            $query = $this->_sqlite_prepare_query($query);
137
138        $result = $this->db_handle->query($query);
139
140    }
141   
142    function num_rows($res_id=NULL)
143    {
144        if (!$this->db_handle)
145            return FALSE;
146
147        $result = $this->_get_result($res_id);
148   
149        if ($result)   
150              return $result->numRows();
151        else
152              return FALSE;
153    }
154
155    function affected_rows($res_id=NULL)
156    {
157        if (!$this->db_handle)
158            return FALSE;
159   
160        return $this->db_handle->affectedRows();
161    }
162
163    function insert_id($sequence = '')
164    {
165        if (!$this->db_handle || $this->db_mode=='r')
166            return FALSE;
167
168        return $this->db_handle->lastInsertID();
169    }
170
171
172    function fetch_assoc($res_id=NULL)
173    {
174        $result = $this->_get_result($res_id);
175
176        if (PEAR::isError($result))
177        {
178            raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
179                         'message' => $this->db_link->getMessage()), TRUE, FALSE);
180            return FALSE;
181        }
182                         
183        return $result->fetchRow(MDB2_FETCHMODE_ASSOC);
184    }
185
186    function _add_result($res, $query)
187    {
188        // sql error occured
189        if (PEAR::isError($res))
190        {
191            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);
192             return FALSE;
193        }
194        else
195        {
196            $res_id = sizeof($this->a_query_results);
197            $this->a_query_results[$res_id] = $res;
198            $this->last_res_id = $res_id;
199            return $res_id;
200        }
201    }
202
203
204    function _get_result($res_id)
205    {
206        if ($res_id==NULL)
207            $res_id = $this->last_res_id;
208   
209        if ($res_id && isset($this->a_query_results[$res_id]))
210            return $this->a_query_results[$res_id];
211        else
212        return FALSE;
213    }
214
215
216    // create a sqlite database from a file
217    function _sqlite_create_database($dbh, $fileName)
218    {
219        if (empty($fileName) || !is_string($fileName))
220            return ;
221
222        $data = '';
223        if ($fd = fopen($fileName, 'r'))
224          {
225          $data = fread($fd, filesize($fileName));
226          fclose($fd);
227          }
228
229        if (strlen($data))
230          sqlite_exec($dbh->connection, $data);
231    }
232
233    // transform a query so that it is sqlite2 compliant
234    function _sqlite_prepare_query($query)
235    {
236        if (!is_string($query))
237            return ($query);
238
239        $search = array('/NOW\(\)/',
240                        '/`/');
241        $replace = array("datetime('now')",
242                         '"');
243        $query = preg_replace($search, $replace, $query);
244
245        return ($query);
246    }
247   
248}
249
250?>
Note: See TracBrowser for help on using the repository browser.