root/dev/common/includes/class.db.php @ 391

Revision 391, 9.2 KB (checked in by kovell, 11 years ago)

Fixes: kill_detail comment posting works and non-existent kll_id gives correct error, t3 subsystems have correct location, potential conflicts with old mods and db classes removed.

Line 
1<?php
2require_once('db.php');
3
4class DBConnection
5{
6    function DBConnection()
7    {
8        static $conn_id;
9
10        if (is_resource($conn_id))
11        {
12            $this->id_ = $conn_id;
13            return;
14        }
15        if(defined('DB_PORT'))
16        {
17                if (!$this->id_ = mysql_connect(DB_HOST.':'.DB_PORT, DB_USER, DB_PASS))
18                    die("Unable to connect to mysql database.");
19        }
20        else
21        {
22                if (!$this->id_ = mysql_connect(DB_HOST, DB_USER, DB_PASS))
23                    die("Unable to connect to mysql database.");
24        }
25        mysql_select_db(DB_NAME);
26        $conn_id = $this->id_;
27    }
28
29    function id()
30    {
31        return $this->id_;
32    }
33
34    function affectedRows()
35    {
36        return mysql_affected_rows($this->id_);
37    }
38}
39
40class DBQuery
41{
42    var $object;
43
44    // php5 style object overloading
45    // we internally load up the wanted object and reroute all
46    // object actions to it
47    function __construct($forceNormal = false)
48    {
49        if (DB_TYPE_USED === 'mysqli' )
50        {
51            if (DB_USE_MEMCACHE === true && !$forceNormal)
52            {
53                $object = new DBMemCachedQuery_mysqli();
54            }
55            elseif (DB_USE_QCACHE === true && !$forceNormal)
56            {
57                $object = new DBCachedQuery_mysqli();
58            }
59            else
60            {
61                $object = new DBNormalQuery_mysqli();
62            }
63        }
64        elseif (DB_USE_MEMCACHE === true && !$forceNormal)
65        {
66            $object = new DBMemCachedQuery();
67        }
68        elseif (DB_USE_QCACHE === true && !$forceNormal)
69        {
70            $object = new DBCachedQuery();
71        }
72        else
73        {
74            $object = new DBNormalQuery();
75        }
76        $this->object = $object;
77    }
78
79    function __call($name, $args)
80    {
81        return call_user_func_array(array($this->object, $name), $args);
82    }
83
84    function __set($name, $value)
85    {
86        $this->object->$name = $value;
87    }
88
89    function __unset($name)
90    {
91        unset($this->object->$name);
92    }
93
94    function __isset($name)
95    {
96        return isset($this->object->$name);
97    }
98
99    function __get($name)
100    {
101        return $this->object->$name;
102    }
103
104    // php4 style object overloading
105    // we just hijack $this but we need to use a helper
106    // function for this because php5 fatals if it sees
107    // $this = ... in the src
108    function DBQuery($forceNormal = false)
109    {
110        $object = &$this->getRef($this);
111        if (DB_TYPE_USED === 'mysqli' )
112        {
113            if (DB_USE_MEMCACHE === true && !$forceNormal)
114            {
115                $object = new DBMemCachedQuery_mysqli();
116            }
117            elseif (DB_USE_QCACHE === true && !$forceNormal)
118            {
119                $object = new DBCachedQuery_mysqli();
120            }
121            else
122            {
123                $object = new DBNormalQuery_mysqli();
124            }
125        }
126        elseif (DB_USE_MEMCACHE === true && !$forceNormal)
127        {
128            $object = new DBMemCachedQuery();
129        }
130        elseif (DB_USE_QCACHE === true && !$forceNormal)
131        {
132            $object = new DBCachedQuery();
133        }
134        else
135        {
136            $object = new DBNormalQuery();
137        }
138    }
139
140    function &getRef(&$var)
141    {
142        return $var;
143    }
144}
145
146//! mysql uncached query class. Manages SQL queries to a MySQL DB using mysql.
147class DBNormalQuery
148{
149    //! Prepare a connection for a new mysql query.
150    function DBNormalQuery()
151    {
152        static $totalexectime = 0;
153                $this->totalexectime_ = &$totalexectime;
154        $this->executed_ = false;
155        $this->dbconn_ = new DBConnection;
156    }
157
158    //! Return the count of queries performed.
159
160    /*!
161     * \param $increase if true then increment the count.
162     * \return the count of queries so far.
163     */
164    function queryCount($increase = false)
165    {
166        static $count;
167
168        if ($increase)
169        {
170            $count++;
171        }
172
173        return $count;
174    }
175
176    //! Return the count of cached queries performed - 0 for uncaches queries.
177    function queryCachedCount($increase = false)
178    {
179        return 0;
180    }
181
182    //! Execute an SQL string.
183
184    /*
185     * If DB_HALTONERROR is set then this will exit on an error.
186     * \return false on error or true if successful.
187     */
188    function execute($sql)
189    {
190        $t1 = strtok(microtime(), ' ') + strtok('');
191
192        $this->resid_ = mysql_query($sql, $this->dbconn_->id());
193
194        if (!$this->resid_ || mysql_errno($this->dbconn_->id()))
195        {
196            if(defined('KB_PROFILE'))
197                        {
198                                DBDebug::recordError("Database error: ".$this->dbconn_->id()->error);
199                                DBDebug::recordError("SQL: ".$this->_sql);
200                        }
201            if (defined('DB_HALTONERROR') && DB_HALTONERROR)
202            {
203                echo "Database error: " . mysql_error($this->dbconn_->id()) . "<br>";
204                echo "SQL: " . $sql . "<br>";
205                exit;
206            }
207            else
208            {
209                return false;
210            }
211        }
212
213        $this->exectime_ = strtok(microtime(), ' ') + strtok('') - $t1;
214        $this->totalexectime_ += $this->exectime_;
215        $this->executed_ = true;
216
217        if(defined('KB_PROFILE')) DBDebug::profile($sql, $this);
218
219        $this->queryCount(true);
220
221        return true;
222    }
223
224    //! Return the number of rows returned by the last query.
225    function recordCount()
226    {
227        return mysql_num_rows($this->resid_);
228    }
229
230    //! Return the next row of results from the last query.
231    function getRow()
232    {
233        if ($this->resid_)
234        {
235            return mysql_fetch_assoc($this->resid_);
236        }
237        return false;
238    }
239
240    //! Reset list of results to return the first row from the last query.
241    function rewind()
242    {
243        @mysql_data_seek($this->resid_, 0);
244    }
245
246    //! Return the auto-increment ID from the last insert operation.
247    function getInsertID()
248    {
249        return mysql_insert_id();
250    }
251
252    //! Return the execution time of the last query.
253    function execTime()
254    {
255        return $this->exectime_;
256    }
257
258    //! Return true if a query has been executed or false if none has been.
259    function executed()
260    {
261        return $this->executed_;
262    }
263
264    //! Return the most recent error message for the DB connection.
265    function getErrorMsg()
266    {
267        $msg = $this->sql_ . "<br>";
268        $msg .= "Query failed. " . mysql_error($this->dbconn_->id());
269
270        return $msg;
271    }
272    //! Set the autocommit status.
273   
274    //! Not implemented with mysql library
275    function autocommit($commit = true)
276    {
277        return false;
278    }
279   
280    //! Rollback all queries in the current transaction.
281   
282    //! Not implemented with mysql library
283    function rollback()
284    {
285        return false;
286    }
287}
288
289    class DBDebug
290    {
291        function recordError($text)
292        {
293            $qerrfile = "/tmp/EDKprofile.lst";
294            if($text) file_put_contents($qerrfile, $text."\n", FILE_APPEND);
295        }
296        function profile($sql, $text='')
297        {
298            $qerrfile = "/tmp/EDKprofile.lst";
299            if($text) file_put_contents($qerrfile, $text."\n", FILE_APPEND);
300            if (KB_PROFILE == 2)
301            {
302                    file_put_contents($qerrfile, $sql . "\nExecution time: " . $this->exectime_ . "\n", FILE_APPEND);
303            }
304            if (KB_PROFILE == 3)
305            {
306                    if(strtolower(substr($sql,0,6))=='select')
307                    {
308                            $prof_qry= mysqli_query($this->dbconn_->id(),'EXPLAIN extended '.$sql.";");
309                            while($prof_row = mysqli_fetch_assoc($prof_qry))
310                            $prof_out_exp .= implode(' | ', $prof_row)."\n";
311                            $prof_qry= mysqli_query($this->dbconn_->id(),'show warnings');
312
313                            while($prof_row = mysqli_fetch_assoc($prof_qry))
314                            $prof_out_ext .= implode(' | ', $prof_row)."\n";
315                            file_put_contents($qerrfile, $sql . "\n".
316                                    $prof_out_ext. $prof_out_exp.
317                    "\n-- Execution time: " . $this->exectime_ . " --\n", FILE_APPEND);
318                    }
319                    else file_put_contents($qerrfile, $sql."\nExecution time: ".$this->exectime_."\n", FILE_APPEND);
320            }
321
322            if (KB_PROFILE == 4)
323            {
324                    if($this->exectime_ > 0.1 && strtolower(substr($sql,0,6))=='select')
325                    {
326                            $prof_qry= mysqli_query($this->dbconn_->id(),'EXPLAIN extended '.$sql);
327                            while($prof_row = mysqli_fetch_assoc($prof_qry))
328                            $prof_out_exp .= implode(' | ', $prof_row)."\n";
329                            $prof_qry= mysqli_query($this->dbconn_->id(),'show warnings');
330
331                            while($prof_row = mysqli_fetch_assoc($prof_qry))
332                            $prof_out_ext .= implode(' | ', $prof_row)."\n";
333                            file_put_contents($qerrfile, $sql . "\n".
334                                    $prof_out_ext. $prof_out_exp.
335                    "\n-- Execution time: " . $this->exectime_ . " --\n", FILE_APPEND);
336                    }
337            }
338
339        }
340    }
341
342?>
Note: See TracBrowser for help on using the browser.