Commit | Line | Data |
---|---|---|
6855525e JL |
1 | <?php |
2 | /* | |
3 | * Copyright (C) 2003-2004 Polytechnique.org | |
4 | * http://opensource.polytechnique.org/ | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program; if not, write to the Free Software | |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 | */ | |
20 | ||
21 | ||
22 | /** Class for handling database requests. It is a wrapper around a permanent | |
23 | * MySQL database connection with some commonly used functions. | |
24 | */ | |
25 | class DiogenesDatabase { | |
26 | /** The id of the permanent database connection. | |
27 | */ | |
28 | var $connect_id; | |
29 | ||
30 | /** Are we in debugging mode. | |
31 | * This variable affects whether we make detailed records of everything | |
32 | * we do. Useful for debugging, but I imagine it probably slows down | |
33 | * regular use a bit. | |
34 | * | |
35 | * @see $_trace_data | |
36 | */ | |
37 | var $_trace = false; | |
38 | ||
39 | /** Historical trace data. | |
40 | * If our queries are being logged, all of the relevant data will end up | |
41 | * in this variable. | |
42 | * | |
43 | * @see $_trace | |
44 | */ | |
45 | var $_trace_data = Array(); | |
46 | ||
47 | /** Whether database errors are fatal. | |
48 | */ | |
49 | var $_fatal = false; | |
50 | ||
51 | /** The numeric code of the last error that occured. | |
52 | */ | |
53 | var $_errno = 0; | |
54 | ||
55 | /** The string describing the last error that occured. | |
56 | */ | |
57 | var $_errstr = ''; | |
58 | ||
59 | /** Extra info about what might have caused the error. | |
60 | */ | |
61 | var $_errinfo = ''; | |
62 | ||
63 | /** The constructor. | |
64 | * | |
65 | * @param $database The name of the database to connect to | |
66 | * @param $host The computer hosting the database server | |
67 | * @param $user The username to use to authenticate to the database server | |
68 | * @param $password The password to use in authenticating to the database server | |
69 | */ | |
70 | function DiogenesDatabase($database, $host, $user, $password) { | |
71 | global $globals; | |
72 | ||
73 | // make sure that we have MySQL support, try loading it | |
74 | if (!extension_loaded('mysql') && !dl('mysql.so')) | |
75 | { | |
76 | echo "MySQL support needs to be activated in your PHP configuration!<br>\n"; | |
77 | echo "Add a line with 'extension=mysql.so' in your php.ini file.\n"; | |
78 | exit(1); | |
79 | } | |
80 | ||
81 | $this->_fatal = @$this->database_error_fatal; | |
82 | ||
83 | if(empty($user)){ | |
84 | $this->connect_id=@mysql_connect(); | |
85 | } else { | |
86 | $this->connect_id=@mysql_connect($host, $user, $password); | |
87 | } | |
88 | ||
89 | if (!$this->connect_id) { | |
90 | $this->_handleError(""); | |
91 | return; | |
92 | } | |
93 | ||
94 | if (!@mysql_select_db($database,$this->connect_id)) | |
95 | { | |
96 | $this->_handleError(""); | |
97 | return; | |
98 | } | |
99 | ||
100 | // when the script exits, we close the connection to the DB | |
101 | register_shutdown_function(array(&$this, 'close')); | |
102 | } | |
103 | ||
104 | ||
105 | /** Close connection to database | |
106 | */ | |
107 | function close() { | |
108 | mysql_close($this->connect_id); | |
109 | $this->connect_id = FALSE; | |
110 | } | |
111 | ||
112 | ||
113 | /** Deactivate trace mode. | |
114 | */ | |
115 | function trace_off() { | |
116 | $this->_trace = false; | |
117 | } | |
118 | ||
119 | ||
120 | /** Activate trace mode. | |
121 | */ | |
122 | function trace_on() { | |
123 | $this->_trace = true; | |
124 | } | |
125 | ||
126 | ||
127 | /** Formats tracing information for output. | |
128 | * | |
129 | * @param $page | |
130 | * @param $template | |
131 | */ | |
132 | function trace_format(&$page,$template='') { | |
133 | global $globals; | |
134 | if(empty($template)) | |
135 | $template = $globals->libroot . '/templates/database-debug.tpl'; | |
136 | $page->assign_by_ref('trace_data', $this->_trace_data); | |
137 | return $page->fetch($template); | |
138 | } | |
139 | ||
140 | ||
141 | /** Execute a database query. | |
142 | * | |
143 | * @param $query | |
144 | */ | |
145 | function query($query) { | |
146 | if (!empty($query)) { | |
147 | ||
148 | if ($this->_trace) { | |
149 | $_res = mysql_query("EXPLAIN $query", $this->connect_id); | |
150 | $explain = Array(); | |
151 | while($row = @mysql_fetch_assoc($_res)) $explain[] = $row; | |
152 | $trace_data = Array('query' => $query, 'explain' => $explain ); | |
153 | @mysql_free_result($_res); | |
154 | } | |
155 | ||
156 | $res = mysql_query($query, $this->connect_id); | |
157 | ||
158 | if ($this->_trace) { | |
159 | $trace_data['error'] = $this->error(); | |
160 | $this->_trace_data[] = $trace_data; | |
161 | } | |
162 | ||
163 | if (!$res) | |
164 | { | |
165 | $this->_handleError($query); | |
166 | } | |
167 | ||
168 | return $res; | |
169 | } | |
170 | } | |
171 | ||
172 | ||
173 | /** Return insert_id | |
174 | */ | |
175 | function insert_id() | |
176 | { | |
177 | return @mysql_insert_id($this->connect_id); | |
178 | } | |
179 | ||
180 | ||
181 | /** Return whether there is currently an error in effect. | |
182 | * | |
183 | * @return boolean true if error, false otherwise | |
184 | */ | |
185 | function err() | |
186 | { | |
187 | return ($this->_errno != 0); | |
188 | } | |
189 | ||
190 | ||
191 | /** Return the last error string. | |
192 | */ | |
193 | function error() { | |
194 | return $this->_errstr; | |
195 | } | |
196 | ||
197 | ||
198 | /** Return the last error number. | |
199 | */ | |
200 | function errno() { | |
201 | return $this->_errno; | |
202 | } | |
203 | ||
204 | ||
205 | /** Return extra info which might help in determining the cause of the | |
206 | * previous error. | |
207 | */ | |
208 | function errinfo() | |
209 | { | |
210 | return $this->_errinfo; | |
211 | } | |
212 | ||
213 | ||
214 | /** Forget about any errors previously raised. | |
215 | */ | |
216 | function ResetError() | |
217 | { | |
218 | $this->_errno = 0; | |
219 | $this->_errstr = ''; | |
220 | $this->_errinfo = ''; | |
221 | } | |
222 | ||
223 | ||
224 | /** Return the number rows affected by the last query. | |
225 | */ | |
226 | function affected_rows() { | |
227 | return @mysql_affected_rows($this->connect_id); | |
228 | } | |
229 | ||
230 | ||
231 | /** Return an array with the possibly values of a set column. | |
232 | * | |
233 | * @param $table | |
234 | * @param $column | |
235 | */ | |
236 | function get_set($table,$column) { | |
237 | $res = $this->query("show columns from $table like '$column'"); | |
238 | $line = mysql_fetch_assoc($res); | |
239 | $set = $line['Type']; | |
240 | $set = substr($set,5,strlen($set)-7); | |
241 | return preg_split("/','/",$set); | |
242 | } | |
243 | ||
244 | ||
245 | /** Handle an error in the database. | |
246 | * | |
247 | * Updates the error status information in the system, and possibly dies | |
248 | * if we're doing that sort of thing. | |
249 | * | |
250 | * @param $extras | |
251 | */ | |
252 | function _handleError($extras = '') | |
253 | { | |
254 | $this->_errinfo = $extras; | |
255 | ||
256 | if ($this->connect_id) | |
257 | { | |
258 | $this->_errno = mysql_errno($this->connect_id); | |
259 | $this->_errstr = mysql_error($this->connect_id); | |
260 | } | |
261 | else | |
262 | { | |
263 | $this->_errno = mysql_errno(); | |
264 | $this->_errstr = mysql_error(); | |
265 | } | |
266 | ||
267 | if ($this->_fatal) | |
268 | { | |
269 | die(sprintf("Database error: (%i) %s\n%s\n", $this->_errno, $this->_errstr, $this->_errinfo)); | |
270 | } | |
271 | } | |
272 | } | |
273 | ||
274 | ?> |