~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/db/dbal.php

Merge from no-phpbb-for-you. phpBB is no longer available by default.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package dbal
5
 
* @version $Id: dbal.php,v 1.70 2007/12/06 12:27:53 acydburn Exp $
6
 
* @copyright (c) 2005 phpBB Group
7
 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
 
*
9
 
*/
10
 
 
11
 
/**
12
 
* @ignore
13
 
*/
14
 
if (!defined('IN_PHPBB'))
15
 
{
16
 
        exit;
17
 
}
18
 
 
19
 
/**
20
 
* Database Abstraction Layer
21
 
* @package dbal
22
 
*/
23
 
class dbal
24
 
{
25
 
        var $db_connect_id;
26
 
        var $query_result;
27
 
        var $return_on_error = false;
28
 
        var $transaction = false;
29
 
        var $sql_time = 0;
30
 
        var $num_queries = array();
31
 
        var $open_queries = array();
32
 
 
33
 
        var $curtime = 0;
34
 
        var $query_hold = '';
35
 
        var $html_hold = '';
36
 
        var $sql_report = '';
37
 
        
38
 
        var $persistency = false;
39
 
        var $user = '';
40
 
        var $server = '';
41
 
        var $dbname = '';
42
 
 
43
 
        // Set to true if error triggered
44
 
        var $sql_error_triggered = false;
45
 
 
46
 
        // Holding the last sql query on sql error
47
 
        var $sql_error_sql = '';
48
 
 
49
 
        // Holding transaction count
50
 
        var $transactions = 0;
51
 
 
52
 
        // Supports multi inserts?
53
 
        var $multi_insert = false;
54
 
 
55
 
        /**
56
 
        * Current sql layer
57
 
        */
58
 
        var $sql_layer = '';
59
 
 
60
 
        /**
61
 
        * Wildcards for matching any (%) or exactly one (_) character within LIKE expressions
62
 
        */
63
 
        var $any_char;
64
 
        var $one_char;
65
 
 
66
 
        /**
67
 
        * Constructor
68
 
        */
69
 
        function dbal()
70
 
        {
71
 
                $this->num_queries = array(
72
 
                        'cached'                => 0,
73
 
                        'normal'                => 0,
74
 
                        'total'                 => 0,
75
 
                );
76
 
 
77
 
                // Fill default sql layer based on the class being called.
78
 
                // This can be changed by the specified layer itself later if needed.
79
 
                $this->sql_layer = substr(get_class($this), 5);
80
 
 
81
 
                // Do not change this please! This variable is used to easy the use of it - and is hardcoded.
82
 
                $this->any_char = chr(0) . '%';
83
 
                $this->one_char = chr(0) . '_';
84
 
        }
85
 
 
86
 
        /**
87
 
        * return on error or display error message
88
 
        */
89
 
        function sql_return_on_error($fail = false)
90
 
        {
91
 
                $this->sql_error_triggered = false;
92
 
                $this->sql_error_sql = '';
93
 
 
94
 
                $this->return_on_error = $fail;
95
 
        }
96
 
 
97
 
        /**
98
 
        * Return number of sql queries and cached sql queries used
99
 
        */
100
 
        function sql_num_queries($cached = false)
101
 
        {
102
 
                return ($cached) ? $this->num_queries['cached'] : $this->num_queries['normal'];
103
 
        }
104
 
 
105
 
        /**
106
 
        * Add to query count
107
 
        */
108
 
        function sql_add_num_queries($cached = false)
109
 
        {
110
 
                $this->num_queries['cached'] += ($cached !== false) ? 1 : 0;
111
 
                $this->num_queries['normal'] += ($cached !== false) ? 0 : 1;
112
 
                $this->num_queries['total'] += 1;
113
 
        }
114
 
 
115
 
        /**
116
 
        * DBAL garbage collection, close sql connection
117
 
        */
118
 
        function sql_close()
119
 
        {
120
 
                if (!$this->db_connect_id)
121
 
                {
122
 
                        return false;
123
 
                }
124
 
 
125
 
                if ($this->transaction)
126
 
                {
127
 
                        do
128
 
                        {
129
 
                                $this->sql_transaction('commit');
130
 
                        }
131
 
                        while ($this->transaction);
132
 
                }
133
 
 
134
 
                foreach ($this->open_queries as $query_id)
135
 
                {
136
 
                        $this->sql_freeresult($query_id);
137
 
                }
138
 
                
139
 
                return $this->_sql_close();
140
 
        }
141
 
 
142
 
        /**
143
 
        * Build LIMIT query
144
 
        * Doing some validation here.
145
 
        */
146
 
        function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
147
 
        {
148
 
                if (empty($query))
149
 
                {
150
 
                        return false;
151
 
                }
152
 
 
153
 
                // Never use a negative total or offset
154
 
                $total = ($total < 0) ? 0 : $total;
155
 
                $offset = ($offset < 0) ? 0 : $offset;
156
 
 
157
 
                return $this->_sql_query_limit($query, $total, $offset, $cache_ttl);
158
 
        }
159
 
 
160
 
        /**
161
 
        * Fetch all rows
162
 
        */
163
 
        function sql_fetchrowset($query_id = false)
164
 
        {
165
 
                if ($query_id === false)
166
 
                {
167
 
                        $query_id = $this->query_result;
168
 
                }
169
 
 
170
 
                if ($query_id !== false)
171
 
                {
172
 
                        $result = array();
173
 
                        while ($row = $this->sql_fetchrow($query_id))
174
 
                        {
175
 
                                $result[] = $row;
176
 
                        }
177
 
 
178
 
                        return $result;
179
 
                }
180
 
                
181
 
                return false;
182
 
        }
183
 
 
184
 
        /**
185
 
        * Fetch field
186
 
        * if rownum is false, the current row is used, else it is pointing to the row (zero-based)
187
 
        */
188
 
        function sql_fetchfield($field, $rownum = false, $query_id = false)
189
 
        {
190
 
                global $cache;
191
 
 
192
 
                if ($query_id === false)
193
 
                {
194
 
                        $query_id = $this->query_result;
195
 
                }
196
 
 
197
 
                if ($query_id !== false)
198
 
                {
199
 
                        if ($rownum !== false)
200
 
                        {
201
 
                                $this->sql_rowseek($rownum, $query_id);
202
 
                        }
203
 
 
204
 
                        if (!is_object($query_id) && isset($cache->sql_rowset[$query_id]))
205
 
                        {
206
 
                                return $cache->sql_fetchfield($query_id, $field);
207
 
                        }
208
 
 
209
 
                        $row = $this->sql_fetchrow($query_id);
210
 
                        return (isset($row[$field])) ? $row[$field] : false;
211
 
                }
212
 
 
213
 
                return false;
214
 
        }
215
 
 
216
 
        /**
217
 
        * Correctly adjust LIKE expression for special characters
218
 
        * Some DBMS are handling them in a different way
219
 
        *
220
 
        * @param string $expression The expression to use. Every wildcard is escaped, except $this->any_char and $this->one_char
221
 
        * @return string LIKE expression including the keyword!
222
 
        */
223
 
        function sql_like_expression($expression)
224
 
        {
225
 
                $expression = str_replace(array('_', '%'), array("\_", "\%"), $expression);
226
 
                $expression = str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
227
 
 
228
 
                return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\'');
229
 
        }
230
 
 
231
 
        /**
232
 
        * SQL Transaction
233
 
        * @access private
234
 
        */
235
 
        function sql_transaction($status = 'begin')
236
 
        {
237
 
                switch ($status)
238
 
                {
239
 
                        case 'begin':
240
 
                                // If we are within a transaction we will not open another one, but enclose the current one to not loose data (prevening auto commit)
241
 
                                if ($this->transaction)
242
 
                                {
243
 
                                        $this->transactions++;
244
 
                                        return true;
245
 
                                }
246
 
 
247
 
                                $result = $this->_sql_transaction('begin');
248
 
 
249
 
                                if (!$result)
250
 
                                {
251
 
                                        $this->sql_error();
252
 
                                }
253
 
 
254
 
                                $this->transaction = true;
255
 
                        break;
256
 
 
257
 
                        case 'commit':
258
 
                                // If there was a previously opened transaction we do not commit yet... but count back the number of inner transactions
259
 
                                if ($this->transaction && $this->transactions)
260
 
                                {
261
 
                                        $this->transactions--;
262
 
                                        return true;
263
 
                                }
264
 
 
265
 
                                $result = $this->_sql_transaction('commit');
266
 
 
267
 
                                if (!$result)
268
 
                                {
269
 
                                        $this->sql_error();
270
 
                                }
271
 
 
272
 
                                $this->transaction = false;
273
 
                                $this->transactions = 0;
274
 
                        break;
275
 
 
276
 
                        case 'rollback':
277
 
                                $result = $this->_sql_transaction('rollback');
278
 
                                $this->transaction = false;
279
 
                                $this->transactions = 0;
280
 
                        break;
281
 
 
282
 
                        default:
283
 
                                $result = $this->_sql_transaction($status);
284
 
                        break;
285
 
                }
286
 
 
287
 
                return $result;
288
 
        }
289
 
 
290
 
        /**
291
 
        * Build sql statement from array for insert/update/select statements
292
 
        *
293
 
        * Idea for this from Ikonboard
294
 
        * Possible query values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT
295
 
        *
296
 
        */
297
 
        function sql_build_array($query, $assoc_ary = false)
298
 
        {
299
 
                if (!is_array($assoc_ary))
300
 
                {
301
 
                        return false;
302
 
                }
303
 
 
304
 
                $fields = $values = array();
305
 
 
306
 
                if ($query == 'INSERT' || $query == 'INSERT_SELECT')
307
 
                {
308
 
                        foreach ($assoc_ary as $key => $var)
309
 
                        {
310
 
                                $fields[] = $key;
311
 
 
312
 
                                if (is_array($var) && is_string($var[0]))
313
 
                                {
314
 
                                        // This is used for INSERT_SELECT(s)
315
 
                                        $values[] = $var[0];
316
 
                                }
317
 
                                else
318
 
                                {
319
 
                                        $values[] = $this->_sql_validate_value($var);
320
 
                                }
321
 
                        }
322
 
 
323
 
                        $query = ($query == 'INSERT') ? ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')' : ' (' . implode(', ', $fields) . ') SELECT ' . implode(', ', $values) . ' ';
324
 
                }
325
 
                else if ($query == 'MULTI_INSERT')
326
 
                {
327
 
                        $ary = array();
328
 
                        foreach ($assoc_ary as $id => $sql_ary)
329
 
                        {
330
 
                                // If by accident the sql array is only one-dimensional we build a normal insert statement
331
 
                                if (!is_array($sql_ary))
332
 
                                {
333
 
                                        return $this->sql_build_array('INSERT', $assoc_ary);
334
 
                                }
335
 
 
336
 
                                $values = array();
337
 
                                foreach ($sql_ary as $key => $var)
338
 
                                {
339
 
                                        $values[] = $this->_sql_validate_value($var);
340
 
                                }
341
 
                                $ary[] = '(' . implode(', ', $values) . ')';
342
 
                        }
343
 
 
344
 
                        $query = ' (' . implode(', ', array_keys($assoc_ary[0])) . ') VALUES ' . implode(', ', $ary);
345
 
                }
346
 
                else if ($query == 'UPDATE' || $query == 'SELECT')
347
 
                {
348
 
                        $values = array();
349
 
                        foreach ($assoc_ary as $key => $var)
350
 
                        {
351
 
                                $values[] = "$key = " . $this->_sql_validate_value($var);
352
 
                        }
353
 
                        $query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values);
354
 
                }
355
 
 
356
 
                return $query;
357
 
        }
358
 
 
359
 
        /**
360
 
        * Build IN or NOT IN sql comparison string, uses <> or = on single element
361
 
        * arrays to improve comparison speed
362
 
        *
363
 
        * @access public
364
 
        * @param        string  $field                          name of the sql column that shall be compared
365
 
        * @param        array   $array                          array of values that are allowed (IN) or not allowed (NOT IN)
366
 
        * @param        bool    $negate                         true for NOT IN (), false for IN () (default)
367
 
        * @param        bool    $allow_empty_set        If true, allow $array to be empty, this function will return 1=1 or 1=0 then. Default to false.
368
 
        */
369
 
        function sql_in_set($field, $array, $negate = false, $allow_empty_set = false)
370
 
        {
371
 
                if (!sizeof($array))
372
 
                {
373
 
                        if (!$allow_empty_set)
374
 
                        {
375
 
                                // Print the backtrace to help identifying the location of the problematic code
376
 
                                $this->sql_error('No values specified for SQL IN comparison');
377
 
                        }
378
 
                        else
379
 
                        {
380
 
                                // NOT IN () actually means everything so use a tautology
381
 
                                if ($negate)
382
 
                                {
383
 
                                        return '1=1';
384
 
                                }
385
 
                                // IN () actually means nothing so use a contradiction
386
 
                                else
387
 
                                {
388
 
                                        return '1=0';
389
 
                                }
390
 
                        }
391
 
                }
392
 
 
393
 
                if (!is_array($array))
394
 
                {
395
 
                        $array = array($array);
396
 
                }
397
 
 
398
 
                if (sizeof($array) == 1)
399
 
                {
400
 
                        @reset($array);
401
 
                        $var = current($array);
402
 
 
403
 
                        return $field . ($negate ? ' <> ' : ' = ') . $this->_sql_validate_value($var);
404
 
                }
405
 
                else
406
 
                {
407
 
                        return $field . ($negate ? ' NOT IN ' : ' IN ') . '(' . implode(', ', array_map(array($this, '_sql_validate_value'), $array)) . ')';
408
 
                }
409
 
        }
410
 
 
411
 
        /**
412
 
        * Run more than one insert statement.
413
 
        *
414
 
        * @param string $table table name to run the statements on
415
 
        * @param array &$sql_ary multi-dimensional array holding the statement data.
416
 
        *
417
 
        * @return bool false if no statements were executed.
418
 
        * @access public
419
 
        */
420
 
        function sql_multi_insert($table, &$sql_ary)
421
 
        {
422
 
                if (!sizeof($sql_ary))
423
 
                {
424
 
                        return false;
425
 
                }
426
 
 
427
 
                if ($this->multi_insert)
428
 
                {
429
 
                        $this->sql_query('INSERT INTO ' . $table . ' ' . $this->sql_build_array('MULTI_INSERT', $sql_ary));
430
 
                }
431
 
                else
432
 
                {
433
 
                        foreach ($sql_ary as $ary)
434
 
                        {
435
 
                                if (!is_array($ary))
436
 
                                {
437
 
                                        return false;
438
 
                                }
439
 
 
440
 
                                $this->sql_query('INSERT INTO ' . $table . ' ' . $this->sql_build_array('INSERT', $ary));
441
 
                        }
442
 
                }
443
 
 
444
 
                return true;
445
 
        }
446
 
 
447
 
        /**
448
 
        * Function for validating values
449
 
        * @access private
450
 
        */
451
 
        function _sql_validate_value($var)
452
 
        {
453
 
                if (is_null($var))
454
 
                {
455
 
                        return 'NULL';
456
 
                }
457
 
                else if (is_string($var))
458
 
                {
459
 
                        return "'" . $this->sql_escape($var) . "'";
460
 
                }
461
 
                else
462
 
                {
463
 
                        return (is_bool($var)) ? intval($var) : $var;
464
 
                }
465
 
        }
466
 
 
467
 
        /**
468
 
        * Build sql statement from array for select and select distinct statements
469
 
        *
470
 
        * Possible query values: SELECT, SELECT_DISTINCT
471
 
        */
472
 
        function sql_build_query($query, $array)
473
 
        {
474
 
                $sql = '';
475
 
                switch ($query)
476
 
                {
477
 
                        case 'SELECT':
478
 
                        case 'SELECT_DISTINCT';
479
 
 
480
 
                                $sql = str_replace('_', ' ', $query) . ' ' . $array['SELECT'] . ' FROM ';
481
 
 
482
 
                                $table_array = array();
483
 
                                foreach ($array['FROM'] as $table_name => $alias)
484
 
                                {
485
 
                                        if (is_array($alias))
486
 
                                        {
487
 
                                                foreach ($alias as $multi_alias)
488
 
                                                {
489
 
                                                        $table_array[] = $table_name . ' ' . $multi_alias;
490
 
                                                }
491
 
                                        }
492
 
                                        else
493
 
                                        {
494
 
                                                $table_array[] = $table_name . ' ' . $alias;
495
 
                                        }
496
 
                                }
497
 
 
498
 
                                $sql .= $this->_sql_custom_build('FROM', implode(', ', $table_array));
499
 
 
500
 
                                if (!empty($array['LEFT_JOIN']))
501
 
                                {
502
 
                                        foreach ($array['LEFT_JOIN'] as $join)
503
 
                                        {
504
 
                                                $sql .= ' LEFT JOIN ' . key($join['FROM']) . ' ' . current($join['FROM']) . ' ON (' . $join['ON'] . ')';
505
 
                                        }
506
 
                                }
507
 
 
508
 
                                if (!empty($array['WHERE']))
509
 
                                {
510
 
                                        $sql .= ' WHERE ' . $this->_sql_custom_build('WHERE', $array['WHERE']);
511
 
                                }
512
 
 
513
 
                                if (!empty($array['GROUP_BY']))
514
 
                                {
515
 
                                        $sql .= ' GROUP BY ' . $array['GROUP_BY'];
516
 
                                }
517
 
 
518
 
                                if (!empty($array['ORDER_BY']))
519
 
                                {
520
 
                                        $sql .= ' ORDER BY ' . $array['ORDER_BY'];
521
 
                                }
522
 
 
523
 
                        break;
524
 
                }
525
 
 
526
 
                return $sql;
527
 
        }
528
 
 
529
 
        /**
530
 
        * display sql error page
531
 
        */
532
 
        function sql_error($sql = '')
533
 
        {
534
 
                global $auth, $user, $config;
535
 
 
536
 
                // Set var to retrieve errored status
537
 
                $this->sql_error_triggered = true;
538
 
                $this->sql_error_sql = $sql;
539
 
 
540
 
                $error = $this->_sql_error();
541
 
 
542
 
                if (!$this->return_on_error)
543
 
                {
544
 
                        $message = 'SQL ERROR [ ' . $this->sql_layer . ' ]<br /><br />' . $error['message'] . ' [' . $error['code'] . ']';
545
 
 
546
 
                        // Show complete SQL error and path to administrators only
547
 
                        // Additionally show complete error on installation or if extended debug mode is enabled
548
 
                        // The DEBUG_EXTRA constant is for development only!
549
 
                        if ((isset($auth) && $auth->acl_get('a_')) || defined('IN_INSTALL') || defined('DEBUG_EXTRA'))
550
 
                        {
551
 
                                // Print out a nice backtrace...
552
 
                                $backtrace = get_backtrace();
553
 
 
554
 
                                $message .= ($sql) ? '<br /><br />SQL<br /><br />' . htmlspecialchars($sql) : '';
555
 
                                $message .= ($backtrace) ? '<br /><br />BACKTRACE<br />' . $backtrace : '';
556
 
                                $message .= '<br />';
557
 
                        }
558
 
                        else
559
 
                        {
560
 
                                // If error occurs in initiating the session we need to use a pre-defined language string
561
 
                                // This could happen if the connection could not be established for example (then we are not able to grab the default language)
562
 
                                if (!isset($user->lang['SQL_ERROR_OCCURRED']))
563
 
                                {
564
 
                                        $message .= '<br /><br />An sql error occurred while fetching this page. Please contact an administrator if this problem persists.';
565
 
                                }
566
 
                                else
567
 
                                {
568
 
                                        if (!empty($config['board_contact']))
569
 
                                        {
570
 
                                                $message .= '<br /><br />' . sprintf($user->lang['SQL_ERROR_OCCURRED'], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>');
571
 
                                        }
572
 
                                        else
573
 
                                        {
574
 
                                                $message .= '<br /><br />' . sprintf($user->lang['SQL_ERROR_OCCURRED'], '', '');
575
 
                                        }
576
 
                                }
577
 
                        }
578
 
 
579
 
                        if ($this->transaction)
580
 
                        {
581
 
                                $this->sql_transaction('rollback');
582
 
                        }
583
 
 
584
 
                        if (strlen($message) > 1024)
585
 
                        {
586
 
                                // We need to define $msg_long_text here to circumvent text stripping.
587
 
                                global $msg_long_text;
588
 
                                $msg_long_text = $message;
589
 
 
590
 
                                trigger_error(false, E_USER_ERROR);
591
 
                        }
592
 
 
593
 
                        trigger_error($message, E_USER_ERROR);
594
 
                }
595
 
 
596
 
                if ($this->transaction)
597
 
                {
598
 
                        $this->sql_transaction('rollback');
599
 
                }
600
 
 
601
 
                return $error;
602
 
        }
603
 
 
604
 
        /**
605
 
        * Explain queries
606
 
        */
607
 
        function sql_report($mode, $query = '')
608
 
        {
609
 
                global $cache, $starttime, $phpbb_root_path, $user;
610
 
 
611
 
                if (empty($_REQUEST['explain']))
612
 
                {
613
 
                        return false;
614
 
                }
615
 
 
616
 
                if (!$query && $this->query_hold != '')
617
 
                {
618
 
                        $query = $this->query_hold;
619
 
                }
620
 
 
621
 
                switch ($mode)
622
 
                {
623
 
                        case 'display':
624
 
                                if (!empty($cache))
625
 
                                {
626
 
                                        $cache->unload();
627
 
                                }
628
 
                                $this->sql_close();
629
 
 
630
 
                                $mtime = explode(' ', microtime());
631
 
                                $totaltime = $mtime[0] + $mtime[1] - $starttime;
632
 
 
633
 
                                echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
634
 
                                        <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
635
 
                                        <head>
636
 
                                                <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
637
 
                                                <meta http-equiv="Content-Style-Type" content="text/css" />
638
 
                                                <meta http-equiv="imagetoolbar" content="no" />
639
 
                                                <title>SQL Report</title>
640
 
                                                <link href="' . $phpbb_root_path . 'adm/style/admin.css" rel="stylesheet" type="text/css" media="screen" />
641
 
                                        </head>
642
 
                                        <body id="errorpage">
643
 
                                        <div id="wrap">
644
 
                                                <div id="page-header">
645
 
                                                        <a href="' . build_url('explain') . '">Return to previous page</a>
646
 
                                                </div>
647
 
                                                <div id="page-body">
648
 
                                                        <div id="acp">
649
 
                                                        <div class="panel">
650
 
                                                                <span class="corners-top"><span></span></span>
651
 
                                                                <div id="content">
652
 
                                                                        <h1>SQL Report</h1>
653
 
                                                                        <br />
654
 
                                                                        <p><b>Page generated in ' . round($totaltime, 4) . " seconds with {$this->num_queries['normal']} queries" . (($this->num_queries['cached']) ? " + {$this->num_queries['cached']} " . (($this->num_queries['cached'] == 1) ? 'query' : 'queries') . ' returning data from cache' : '') . '</b></p>
655
 
 
656
 
                                                                        <p>Time spent on ' . $this->sql_layer . ' queries: <b>' . round($this->sql_time, 5) . 's</b> | Time spent on PHP: <b>' . round($totaltime - $this->sql_time, 5) . 's</b></p>
657
 
 
658
 
                                                                        <br /><br />
659
 
                                                                        ' . $this->sql_report . '
660
 
                                                                </div>
661
 
                                                                <span class="corners-bottom"><span></span></span>
662
 
                                                        </div>
663
 
                                                        </div>
664
 
                                                </div>
665
 
                                                <div id="page-footer">
666
 
                                                        Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>
667
 
                                                </div>
668
 
                                        </div>
669
 
                                        </body>
670
 
                                        </html>';
671
 
 
672
 
                                exit_handler();
673
 
 
674
 
                        break;
675
 
 
676
 
                        case 'stop':
677
 
                                $endtime = explode(' ', microtime());
678
 
                                $endtime = $endtime[0] + $endtime[1];
679
 
 
680
 
                                $this->sql_report .= '
681
 
 
682
 
                                        <table cellspacing="1">
683
 
                                        <thead>
684
 
                                        <tr>
685
 
                                                <th>Query #' . $this->num_queries['total'] . '</th>
686
 
                                        </tr>
687
 
                                        </thead>
688
 
                                        <tbody>
689
 
                                        <tr>
690
 
                                                <td class="row3"><textarea style="font-family:\'Courier New\',monospace;width:99%" rows="5" cols="10">' . preg_replace('/\t(AND|OR)(\W)/', "\$1\$2", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n", $query))) . '</textarea></td>
691
 
                                        </tr>
692
 
                                        </tbody>
693
 
                                        </table>
694
 
                                        
695
 
                                        ' . $this->html_hold . '
696
 
 
697
 
                                        <p style="text-align: center;">
698
 
                                ';
699
 
 
700
 
                                if ($this->query_result)
701
 
                                {
702
 
                                        if (preg_match('/^(UPDATE|DELETE|REPLACE)/', $query))
703
 
                                        {
704
 
                                                $this->sql_report .= 'Affected rows: <b>' . $this->sql_affectedrows($this->query_result) . '</b> | ';
705
 
                                        }
706
 
                                        $this->sql_report .= 'Before: ' . sprintf('%.5f', $this->curtime - $starttime) . 's | After: ' . sprintf('%.5f', $endtime - $starttime) . 's | Elapsed: <b>' . sprintf('%.5f', $endtime - $this->curtime) . 's</b>';
707
 
                                }
708
 
                                else
709
 
                                {
710
 
                                        $error = $this->sql_error();
711
 
                                        $this->sql_report .= '<b style="color: red">FAILED</b> - ' . $this->sql_layer . ' Error ' . $error['code'] . ': ' . htmlspecialchars($error['message']);
712
 
                                }
713
 
 
714
 
                                $this->sql_report .= '</p><br /><br />';
715
 
 
716
 
                                $this->sql_time += $endtime - $this->curtime;
717
 
                        break;
718
 
 
719
 
                        case 'start':
720
 
                                $this->query_hold = $query;
721
 
                                $this->html_hold = '';
722
 
                        
723
 
                                $this->_sql_report($mode, $query);
724
 
 
725
 
                                $this->curtime = explode(' ', microtime());
726
 
                                $this->curtime = $this->curtime[0] + $this->curtime[1];
727
 
 
728
 
                        break;
729
 
                        
730
 
                        case 'add_select_row':
731
 
 
732
 
                                $html_table = func_get_arg(2);
733
 
                                $row = func_get_arg(3);
734
 
                                
735
 
                                if (!$html_table && sizeof($row))
736
 
                                {
737
 
                                        $html_table = true;
738
 
                                        $this->html_hold .= '<table cellspacing="1"><tr>';
739
 
                                                                
740
 
                                        foreach (array_keys($row) as $val)
741
 
                                        {
742
 
                                                $this->html_hold .= '<th>' . (($val) ? ucwords(str_replace('_', ' ', $val)) : '&nbsp;') . '</th>';
743
 
                                        }
744
 
                                        $this->html_hold .= '</tr>';
745
 
                                }
746
 
                                $this->html_hold .= '<tr>';
747
 
 
748
 
                                $class = 'row1';
749
 
                                foreach (array_values($row) as $val)
750
 
                                {
751
 
                                        $class = ($class == 'row1') ? 'row2' : 'row1';
752
 
                                        $this->html_hold .= '<td class="' . $class . '">' . (($val) ? $val : '&nbsp;') . '</td>';
753
 
                                }
754
 
                                $this->html_hold .= '</tr>';
755
 
                        
756
 
                                return $html_table;
757
 
 
758
 
                        break;
759
 
 
760
 
                        case 'fromcache':
761
 
 
762
 
                                $this->_sql_report($mode, $query);
763
 
 
764
 
                        break;
765
 
 
766
 
                        case 'record_fromcache':
767
 
 
768
 
                                $endtime = func_get_arg(2);
769
 
                                $splittime = func_get_arg(3);
770
 
 
771
 
                                $time_cache = $endtime - $this->curtime;
772
 
                                $time_db = $splittime - $endtime;
773
 
                                $color = ($time_db > $time_cache) ? 'green' : 'red';
774
 
 
775
 
                                $this->sql_report .= '<table cellspacing="1"><thead><tr><th>Query results obtained from the cache</th></tr></thead><tbody><tr>';
776
 
                                $this->sql_report .= '<td class="row3"><textarea style="font-family:\'Courier New\',monospace;width:99%" rows="5" cols="10">' . preg_replace('/\t(AND|OR)(\W)/', "\$1\$2", htmlspecialchars(preg_replace('/[\s]*[\n\r\t]+[\n\r\s\t]*/', "\n", $query))) . '</textarea></td></tr></tbody></table>';
777
 
                                $this->sql_report .= '<p style="text-align: center;">';
778
 
                                $this->sql_report .= 'Before: ' . sprintf('%.5f', $this->curtime - $starttime) . 's | After: ' . sprintf('%.5f', $endtime - $starttime) . 's | Elapsed [cache]: <b style="color: ' . $color . '">' . sprintf('%.5f', ($time_cache)) . 's</b> | Elapsed [db]: <b>' . sprintf('%.5f', $time_db) . 's</b></p><br /><br />';
779
 
 
780
 
                                // Pad the start time to not interfere with page timing
781
 
                                $starttime += $time_db;
782
 
 
783
 
                        break;
784
 
 
785
 
                        default:
786
 
                        
787
 
                                $this->_sql_report($mode, $query);
788
 
 
789
 
                        break;
790
 
                }
791
 
 
792
 
                return true;
793
 
        }
794
 
}
795
 
 
796
 
/**
797
 
* This variable holds the class name to use later
798
 
*/
799
 
$sql_db = (!empty($dbms)) ? 'dbal_' . basename($dbms) : 'dbal';
800
 
 
801
 
?>
 
 
b'\\ No newline at end of file'