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

« back to all changes in this revision

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

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

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'