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

« back to all changes in this revision

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

  • Committer: dcoles
  • Date: 2008-02-13 04:10:55 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:443
Added Forum application along with unmodifed version of phpBB3 "Olympus" 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/**
 
3
*
 
4
* @package dbal
 
5
* @version $Id: oracle.php,v 1.50 2007/10/05 14:36:32 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
include_once($phpbb_root_path . 'includes/db/dbal.' . $phpEx);
 
20
 
 
21
/**
 
22
* Oracle Database Abstraction Layer
 
23
* @package dbal
 
24
*/
 
25
class dbal_oracle extends dbal
 
26
{
 
27
        var $last_query_text = '';
 
28
 
 
29
        /**
 
30
        * Connect to server
 
31
        */
 
32
        function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false, $new_link = false)
 
33
        {
 
34
                $this->persistency = $persistency;
 
35
                $this->user = $sqluser;
 
36
                $this->server = $sqlserver . (($port) ? ':' . $port : '');
 
37
                $this->dbname = $database;
 
38
 
 
39
                $connect = $database;
 
40
 
 
41
                // support for "easy connect naming"
 
42
                if ($sqlserver !== '' && $sqlserver !== '/')
 
43
                {
 
44
                        if (substr($sqlserver, -1, 1) == '/')
 
45
                        {
 
46
                                $sqlserver == substr($sqlserver, 0, -1);
 
47
                        }
 
48
                        $connect = $sqlserver . (($port) ? ':' . $port : '') . '/' . $database;
 
49
                }
 
50
 
 
51
                $this->db_connect_id = ($new_link) ? @ocinlogon($this->user, $sqlpassword, $connect, 'UTF8') : (($this->persistency) ? @ociplogon($this->user, $sqlpassword, $connect, 'UTF8') : @ocilogon($this->user, $sqlpassword, $connect, 'UTF8'));
 
52
 
 
53
                return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
 
54
        }
 
55
 
 
56
        /**
 
57
        * Version information about used database
 
58
        */
 
59
        function sql_server_info()
 
60
        {
 
61
                return @ociserverversion($this->db_connect_id);
 
62
        }
 
63
 
 
64
        /**
 
65
        * SQL Transaction
 
66
        * @access private
 
67
        */
 
68
        function _sql_transaction($status = 'begin')
 
69
        {
 
70
                switch ($status)
 
71
                {
 
72
                        case 'begin':
 
73
                                return true;
 
74
                        break;
 
75
 
 
76
                        case 'commit':
 
77
                                return @ocicommit($this->db_connect_id);
 
78
                        break;
 
79
 
 
80
                        case 'rollback':
 
81
                                return @ocirollback($this->db_connect_id);
 
82
                        break;
 
83
                }
 
84
 
 
85
                return true;
 
86
        }
 
87
 
 
88
        /**
 
89
        * Oracle specific code to handle the fact that it does not compare columns properly
 
90
        * @access private
 
91
        */
 
92
        function _rewrite_col_compare($args)
 
93
        {
 
94
                if (sizeof($args) == 4)
 
95
                {
 
96
                        if ($args[2] == '=')
 
97
                        {
 
98
                                return '(' . $args[0] . ' OR (' . $args[1] . ' is NULL AND ' . $args[3] . ' is NULL))';
 
99
                        }
 
100
                        else if ($args[2] == '<>')
 
101
                        {
 
102
                                // really just a fancy way of saying foo <> bar or (foo is NULL XOR bar is NULL) but SQL has no XOR :P
 
103
                                return '(' . $args[0] . ' OR ((' . $args[1] . ' is NULL AND ' . $args[3] . ' is NOT NULL) OR (' . $args[1] . ' is NOT NULL AND ' . $args[3] . ' is NULL)))';
 
104
                        }
 
105
                }
 
106
                else
 
107
                {
 
108
                        return $this->_rewrite_where($args[0]);
 
109
                }
 
110
        }
 
111
 
 
112
        /**
 
113
        * Oracle specific code to handle it's lack of sanity
 
114
        * @access private
 
115
        */
 
116
        function _rewrite_where($where_clause)
 
117
        {
 
118
                preg_match_all('/\s*(AND|OR)?\s*([\w_.]++)\s*(?:(=|<[=>]?|>=?)\s*((?>\'(?>[^\']++|\'\')*+\'|[\d-.]+))|((NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]+,? ?)*+\)))/', $where_clause, $result, PREG_SET_ORDER);
 
119
                $out = '';
 
120
                foreach ($result as $val)
 
121
                {
 
122
                        if (!isset($val[5]))
 
123
                        {
 
124
                                if ($val[4] !== "''")
 
125
                                {
 
126
                                        $out .= $val[0];
 
127
                                }
 
128
                                else
 
129
                                {
 
130
                                        $out .= ' ' . $val[1] . ' ' . $val[2];
 
131
                                        if ($val[3] == '=')
 
132
                                        {
 
133
                                                $out .= ' is NULL';
 
134
                                        }
 
135
                                        else if ($val[3] == '<>')
 
136
                                        {
 
137
                                                $out .= ' is NOT NULL';
 
138
                                        }
 
139
                                }
 
140
                        }
 
141
                        else
 
142
                        {
 
143
                                $in_clause = array();
 
144
                                $sub_exp = substr($val[5], strpos($val[5], '(') + 1, -1);
 
145
                                $extra = false;
 
146
                                preg_match_all('/\'(?>[^\']++|\'\')*+\'|[\d-.]++/', $sub_exp, $sub_vals, PREG_PATTERN_ORDER);
 
147
                                $i = 0;
 
148
                                foreach ($sub_vals[0] as $sub_val)
 
149
                                {
 
150
                                        // two things:
 
151
                                        // 1) This determines if an empty string was in the IN clausing, making us turn it into a NULL comparison
 
152
                                        // 2) This fixes the 1000 list limit that Oracle has (ORA-01795)
 
153
                                        if ($sub_val !== "''")
 
154
                                        {
 
155
                                                $in_clause[(int) $i++/1000][] = $sub_val;
 
156
                                        }
 
157
                                        else
 
158
                                        {
 
159
                                                $extra = true;
 
160
                                        }
 
161
                                }
 
162
                                if (!$extra && $i < 1000)
 
163
                                {
 
164
                                        $out .= $val[0];
 
165
                                }
 
166
                                else
 
167
                                {
 
168
                                        $out .= ' ' . $val[1] . '(';
 
169
                                        $in_array = array();
 
170
 
 
171
                                        // constuct each IN() clause    
 
172
                                        foreach ($in_clause as $in_values)
 
173
                                        {
 
174
                                                $in_array[] = $val[2] . ' ' . (isset($val[6]) ? $val[6] : '') . 'IN(' . implode(', ', $in_values) . ')';
 
175
                                        }
 
176
 
 
177
                                        // Join the IN() clauses against a few ORs (IN is just a nicer OR anyway)
 
178
                                        $out .= implode(' OR ', $in_array);
 
179
 
 
180
                                        // handle the empty string case
 
181
                                        if ($extra)
 
182
                                        {
 
183
                                                $out .= ' OR ' . $val[2] . ' is ' . (isset($val[6]) ? $val[6] : '') . 'NULL';
 
184
                                        }
 
185
                                        $out .= ')';
 
186
 
 
187
                                        unset($in_array, $in_clause);
 
188
                                }
 
189
                        }
 
190
                }
 
191
 
 
192
                return $out;
 
193
        }
 
194
 
 
195
        /**
 
196
        * Base query method
 
197
        *
 
198
        * @param        string  $query          Contains the SQL query which shall be executed
 
199
        * @param        int             $cache_ttl      Either 0 to avoid caching or the time in seconds which the result shall be kept in cache
 
200
        * @return       mixed                           When casted to bool the returned value returns true on success and false on failure
 
201
        *
 
202
        * @access       public
 
203
        */
 
204
        function sql_query($query = '', $cache_ttl = 0)
 
205
        {
 
206
                if ($query != '')
 
207
                {
 
208
                        global $cache;
 
209
 
 
210
                        // EXPLAIN only in extra debug mode
 
211
                        if (defined('DEBUG_EXTRA'))
 
212
                        {
 
213
                                $this->sql_report('start', $query);
 
214
                        }
 
215
 
 
216
                        $this->last_query_text = $query;
 
217
                        $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;
 
218
                        $this->sql_add_num_queries($this->query_result);
 
219
 
 
220
                        if ($this->query_result === false)
 
221
                        {
 
222
                                $in_transaction = false;
 
223
                                if (!$this->transaction)
 
224
                                {
 
225
                                        $this->sql_transaction('begin');
 
226
                                }
 
227
                                else
 
228
                                {
 
229
                                        $in_transaction = true;
 
230
                                }
 
231
 
 
232
                                $array = array();
 
233
 
 
234
                                // We overcome Oracle's 4000 char limit by binding vars
 
235
                                if (strlen($query) > 4000)
 
236
                                {
 
237
                                        if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/s', $query, $regs))
 
238
                                        {
 
239
                                                if (strlen($regs[3]) > 4000)
 
240
                                                {
 
241
                                                        $cols = explode(', ', $regs[2]);
 
242
                                                        preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER);
 
243
 
 
244
                                                        $inserts = $vals[0];
 
245
                                                        unset($vals);
 
246
 
 
247
                                                        foreach ($inserts as $key => $value)
 
248
                                                        {
 
249
                                                                if (!empty($value) && $value[0] === "'" && strlen($value) > 4002) // check to see if this thing is greater than the max + 'x2
 
250
                                                                {
 
251
                                                                        $inserts[$key] = ':' . strtoupper($cols[$key]);
 
252
                                                                        $array[$inserts[$key]] = str_replace("''", "'", substr($value, 1, -1));
 
253
                                                                }
 
254
                                                        }
 
255
 
 
256
                                                        $query = $regs[1] . '(' . $regs[2] . ') VALUES (' . implode(', ', $inserts) . ')';
 
257
                                                }
 
258
                                        }
 
259
                                        else if (preg_match_all('/^(UPDATE [\\w_]++\\s+SET )([\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+)(?:,\\s*[\\w_]++\\s*=\\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]+))*+)\\s+(WHERE.*)$/s', $query, $data, PREG_SET_ORDER))
 
260
                                        {
 
261
                                                if (strlen($data[0][2]) > 4000)
 
262
                                                {
 
263
                                                        $update = $data[0][1];
 
264
                                                        $where = $data[0][3];
 
265
                                                        preg_match_all('/([\\w_]++)\\s*=\\s*(\'(?:[^\']++|\'\')*+\'|[\d-.]++)/', $data[0][2], $temp, PREG_SET_ORDER);
 
266
                                                        unset($data);
 
267
 
 
268
                                                        $cols = array();
 
269
                                                        foreach ($temp as $value)
 
270
                                                        {
 
271
                                                                if (!empty($value[2]) && $value[2][0] === "'" && strlen($value[2]) > 4002) // check to see if this thing is greater than the max + 'x2
 
272
                                                                {
 
273
                                                                        $cols[] = $value[1] . '=:' . strtoupper($value[1]);
 
274
                                                                        $array[$value[1]] = str_replace("''", "'", substr($value[2], 1, -1));
 
275
                                                                }
 
276
                                                                else
 
277
                                                                {
 
278
                                                                        $cols[] = $value[1] . '=' . $value[2];
 
279
                                                                }
 
280
                                                        }
 
281
 
 
282
                                                        $query = $update . implode(', ', $cols) . ' ' . $where;
 
283
                                                        unset($cols);
 
284
                                                }
 
285
                                        }
 
286
                                }
 
287
 
 
288
                                switch (substr($query, 0, 6))
 
289
                                {
 
290
                                        case 'DELETE':
 
291
                                                if (preg_match('/^(DELETE FROM [\w_]++ WHERE)((?:\s*(?:AND|OR)?\s*[\w_]+\s*(?:(?:=|<>)\s*(?>\'(?>[^\']++|\'\')*+\'|[\d-.]+)|(?:NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]+,? ?)*+\)))*+)$/', $query, $regs))
 
292
                                                {
 
293
                                                        $query = $regs[1] . $this->_rewrite_where($regs[2]);
 
294
                                                        unset($regs);
 
295
                                                }
 
296
                                        break;
 
297
 
 
298
                                        case 'UPDATE':
 
299
                                                if (preg_match('/^(UPDATE [\\w_]++\\s+SET [\\w_]+\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]++|:\w++)(?:, [\\w_]+\s*=\s*(?:\'(?:[^\']++|\'\')*+\'|[\d-.]++|:\w++))*+\\s+WHERE)(.*)$/s',  $query, $regs))
 
300
                                                {
 
301
                                                        $query = $regs[1] . $this->_rewrite_where($regs[2]);
 
302
                                                        unset($regs);
 
303
                                                }
 
304
                                        break;
 
305
 
 
306
                                        case 'SELECT':
 
307
                                                $query = preg_replace_callback('/([\w_.]++)\s*(?:(=|<>)\s*(?>\'(?>[^\']++|\'\')*+\'|[\d-.]++|([\w_.]++))|(?:NOT )?IN\s*\((?>\'(?>[^\']++|\'\')*+\',? ?|[\d-.]++,? ?)*+\))/', array($this, '_rewrite_col_compare'), $query);
 
308
                                        break;
 
309
                                }
 
310
 
 
311
                                $this->query_result = @ociparse($this->db_connect_id, $query);
 
312
 
 
313
                                foreach ($array as $key => $value)
 
314
                                {
 
315
                                        @ocibindbyname($this->query_result, $key, $array[$key], -1);
 
316
                                }
 
317
 
 
318
                                $success = @ociexecute($this->query_result, OCI_DEFAULT);
 
319
 
 
320
                                if (!$success)
 
321
                                {
 
322
                                        $this->sql_error($query);
 
323
                                        $this->query_result = false;
 
324
                                }
 
325
                                else
 
326
                                {
 
327
                                        if (!$in_transaction)
 
328
                                        {
 
329
                                                $this->sql_transaction('commit');
 
330
                                        }
 
331
                                }
 
332
 
 
333
                                if (defined('DEBUG_EXTRA'))
 
334
                                {
 
335
                                        $this->sql_report('stop', $query);
 
336
                                }
 
337
 
 
338
                                if ($cache_ttl && method_exists($cache, 'sql_save'))
 
339
                                {
 
340
                                        $this->open_queries[(int) $this->query_result] = $this->query_result;
 
341
                                        $cache->sql_save($query, $this->query_result, $cache_ttl);
 
342
                                }
 
343
                                else if (strpos($query, 'SELECT') === 0 && $this->query_result)
 
344
                                {
 
345
                                        $this->open_queries[(int) $this->query_result] = $this->query_result;
 
346
                                }
 
347
                        }
 
348
                        else if (defined('DEBUG_EXTRA'))
 
349
                        {
 
350
                                $this->sql_report('fromcache', $query);
 
351
                        }
 
352
                }
 
353
                else
 
354
                {
 
355
                        return false;
 
356
                }
 
357
 
 
358
                return ($this->query_result) ? $this->query_result : false;
 
359
        }
 
360
 
 
361
        /**
 
362
        * Build LIMIT query
 
363
        */
 
364
        function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
 
365
        {
 
366
                $this->query_result = false;
 
367
 
 
368
                $query = 'SELECT * FROM (SELECT /*+ FIRST_ROWS */ rownum AS xrownum, a.* FROM (' . $query . ') a WHERE rownum <= ' . ($offset + $total) . ') WHERE xrownum >= ' . $offset;
 
369
 
 
370
                return $this->sql_query($query, $cache_ttl);
 
371
        }
 
372
 
 
373
        /**
 
374
        * Return number of affected rows
 
375
        */
 
376
        function sql_affectedrows()
 
377
        {
 
378
                return ($this->query_result) ? @ocirowcount($this->query_result) : false;
 
379
        }
 
380
 
 
381
        /**
 
382
        * Fetch current row
 
383
        */
 
384
        function sql_fetchrow($query_id = false)
 
385
        {
 
386
                global $cache;
 
387
 
 
388
                if ($query_id === false)
 
389
                {
 
390
                        $query_id = $this->query_result;
 
391
                }
 
392
 
 
393
                if (isset($cache->sql_rowset[$query_id]))
 
394
                {
 
395
                        return $cache->sql_fetchrow($query_id);
 
396
                }
 
397
 
 
398
                if ($query_id !== false)
 
399
                {
 
400
                        $row = array();
 
401
                        $result = @ocifetchinto($query_id, $row, OCI_ASSOC + OCI_RETURN_NULLS);
 
402
 
 
403
                        if (!$result || !$row)
 
404
                        {
 
405
                                return false;
 
406
                        }
 
407
 
 
408
                        $result_row = array();
 
409
                        foreach ($row as $key => $value)
 
410
                        {
 
411
                                // Oracle treats empty strings as null
 
412
                                if (is_null($value))
 
413
                                {
 
414
                                        $value = '';
 
415
                                }
 
416
 
 
417
                                // OCI->CLOB?
 
418
                                if (is_object($value))
 
419
                                {
 
420
                                        $value = $value->load();
 
421
                                }
 
422
 
 
423
                                $result_row[strtolower($key)] = $value;
 
424
                        }
 
425
 
 
426
                        return $result_row;
 
427
                }
 
428
 
 
429
                return false;
 
430
        }
 
431
 
 
432
        /**
 
433
        * Seek to given row number
 
434
        * rownum is zero-based
 
435
        */
 
436
        function sql_rowseek($rownum, &$query_id)
 
437
        {
 
438
                global $cache;
 
439
 
 
440
                if ($query_id === false)
 
441
                {
 
442
                        $query_id = $this->query_result;
 
443
                }
 
444
 
 
445
                if (isset($cache->sql_rowset[$query_id]))
 
446
                {
 
447
                        return $cache->sql_rowseek($rownum, $query_id);
 
448
                }
 
449
 
 
450
                if ($query_id === false)
 
451
                {
 
452
                        return false;
 
453
                }
 
454
 
 
455
                // Reset internal pointer
 
456
                @ociexecute($query_id, OCI_DEFAULT);
 
457
 
 
458
                // We do not fetch the row for rownum == 0 because then the next resultset would be the second row
 
459
                for ($i = 0; $i < $rownum; $i++)
 
460
                {
 
461
                        if (!$this->sql_fetchrow($query_id))
 
462
                        {
 
463
                                return false;
 
464
                        }
 
465
                }
 
466
 
 
467
                return true;
 
468
        }
 
469
 
 
470
        /**
 
471
        * Get last inserted id after insert statement
 
472
        */
 
473
        function sql_nextid()
 
474
        {
 
475
                $query_id = $this->query_result;
 
476
 
 
477
                if ($query_id !== false && $this->last_query_text != '')
 
478
                {
 
479
                        if (preg_match('#^INSERT[\t\n ]+INTO[\t\n ]+([a-z0-9\_\-]+)#is', $this->last_query_text, $tablename))
 
480
                        {
 
481
                                $query = 'SELECT ' . $tablename[1] . '_seq.currval FROM DUAL';
 
482
                                $stmt = @ociparse($this->db_connect_id, $query);
 
483
                                @ociexecute($stmt, OCI_DEFAULT);
 
484
 
 
485
                                $temp_result = @ocifetchinto($stmt, $temp_array, OCI_ASSOC + OCI_RETURN_NULLS);
 
486
                                @ocifreestatement($stmt);
 
487
 
 
488
                                if ($temp_result)
 
489
                                {
 
490
                                        return $temp_array['CURRVAL'];
 
491
                                }
 
492
                                else
 
493
                                {
 
494
                                        return false;
 
495
                                }
 
496
                        }
 
497
                }
 
498
 
 
499
                return false;
 
500
        }
 
501
 
 
502
        /**
 
503
        * Free sql result
 
504
        */
 
505
        function sql_freeresult($query_id = false)
 
506
        {
 
507
                global $cache;
 
508
 
 
509
                if ($query_id === false)
 
510
                {
 
511
                        $query_id = $this->query_result;
 
512
                }
 
513
 
 
514
                if (isset($cache->sql_rowset[$query_id]))
 
515
                {
 
516
                        return $cache->sql_freeresult($query_id);
 
517
                }
 
518
 
 
519
                if (isset($this->open_queries[(int) $query_id]))
 
520
                {
 
521
                        unset($this->open_queries[(int) $query_id]);
 
522
                        return @ocifreestatement($query_id);
 
523
                }
 
524
 
 
525
                return false;
 
526
        }
 
527
 
 
528
        /**
 
529
        * Escape string used in sql query
 
530
        */
 
531
        function sql_escape($msg)
 
532
        {
 
533
                return str_replace("'", "''", $msg);
 
534
        }
 
535
 
 
536
        /**
 
537
        * Build LIKE expression
 
538
        * @access private
 
539
        */
 
540
        function _sql_like_expression($expression)
 
541
        {
 
542
                return $expression . " ESCAPE '\\'";
 
543
        }
 
544
 
 
545
        function _sql_custom_build($stage, $data)
 
546
        {
 
547
                return $data;
 
548
        }
 
549
 
 
550
        /**
 
551
        * return sql error array
 
552
        * @access private
 
553
        */
 
554
        function _sql_error()
 
555
        {
 
556
                $error = @ocierror();
 
557
                $error = (!$error) ? @ocierror($this->query_result) : $error;
 
558
                $error = (!$error) ? @ocierror($this->db_connect_id) : $error;
 
559
 
 
560
                if ($error)
 
561
                {
 
562
                        $this->last_error_result = $error;
 
563
                }
 
564
                else
 
565
                {
 
566
                        $error = (isset($this->last_error_result) && $this->last_error_result) ? $this->last_error_result : array();
 
567
                }
 
568
 
 
569
                return $error;
 
570
        }
 
571
 
 
572
        /**
 
573
        * Close sql connection
 
574
        * @access private
 
575
        */
 
576
        function _sql_close()
 
577
        {
 
578
                return @ocilogoff($this->db_connect_id);
 
579
        }
 
580
 
 
581
        /**
 
582
        * Build db-specific report
 
583
        * @access private
 
584
        */
 
585
        function _sql_report($mode, $query = '')
 
586
        {
 
587
                switch ($mode)
 
588
                {
 
589
                        case 'start':
 
590
 
 
591
                                $html_table = false;
 
592
 
 
593
                                // Grab a plan table, any will do
 
594
                                $sql = "SELECT table_name
 
595
                                        FROM USER_TABLES
 
596
                                        WHERE table_name LIKE '%PLAN_TABLE%'";
 
597
                                $stmt = ociparse($this->db_connect_id, $sql);
 
598
                                ociexecute($stmt);
 
599
                                $result = array();
 
600
 
 
601
                                if (ocifetchinto($stmt, $result, OCI_ASSOC + OCI_RETURN_NULLS))
 
602
                                {
 
603
                                        $table = $result['TABLE_NAME'];
 
604
 
 
605
                                        // This is the statement_id that will allow us to track the plan
 
606
                                        $statement_id = substr(md5($query), 0, 30);
 
607
 
 
608
                                        // Remove any stale plans
 
609
                                        $stmt2 = ociparse($this->db_connect_id, "DELETE FROM $table WHERE statement_id='$statement_id'");
 
610
                                        ociexecute($stmt2);
 
611
                                        ocifreestatement($stmt2);
 
612
 
 
613
                                        // Explain the plan
 
614
                                        $sql = "EXPLAIN PLAN
 
615
                                                SET STATEMENT_ID = '$statement_id'
 
616
                                                FOR $query";
 
617
                                        $stmt2 = ociparse($this->db_connect_id, $sql);
 
618
                                        ociexecute($stmt2);
 
619
                                        ocifreestatement($stmt2);
 
620
 
 
621
                                        // Get the data from the plan
 
622
                                        $sql = "SELECT operation, options, object_name, object_type, cardinality, cost
 
623
                                                FROM plan_table
 
624
                                                START WITH id = 0 AND statement_id = '$statement_id'
 
625
                                                CONNECT BY PRIOR id = parent_id
 
626
                                                        AND statement_id = '$statement_id'";
 
627
                                        $stmt2 = ociparse($this->db_connect_id, $sql);
 
628
                                        ociexecute($stmt2);
 
629
 
 
630
                                        $row = array();
 
631
                                        while (ocifetchinto($stmt2, $row, OCI_ASSOC + OCI_RETURN_NULLS))
 
632
                                        {
 
633
                                                $html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
 
634
                                        }
 
635
 
 
636
                                        ocifreestatement($stmt2);
 
637
 
 
638
                                        // Remove the plan we just made, we delete them on request anyway
 
639
                                        $stmt2 = ociparse($this->db_connect_id, "DELETE FROM $table WHERE statement_id='$statement_id'");
 
640
                                        ociexecute($stmt2);
 
641
                                        ocifreestatement($stmt2);
 
642
                                }
 
643
 
 
644
                                ocifreestatement($stmt);
 
645
 
 
646
                                if ($html_table)
 
647
                                {
 
648
                                        $this->html_hold .= '</table>';
 
649
                                }
 
650
 
 
651
                        break;
 
652
 
 
653
                        case 'fromcache':
 
654
                                $endtime = explode(' ', microtime());
 
655
                                $endtime = $endtime[0] + $endtime[1];
 
656
 
 
657
                                $result = @ociparse($this->db_connect_id, $query);
 
658
                                $success = @ociexecute($result, OCI_DEFAULT);
 
659
                                $row = array();
 
660
 
 
661
                                while (@ocifetchinto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS))
 
662
                                {
 
663
                                        // Take the time spent on parsing rows into account
 
664
                                }
 
665
                                @ocifreestatement($result);
 
666
 
 
667
                                $splittime = explode(' ', microtime());
 
668
                                $splittime = $splittime[0] + $splittime[1];
 
669
 
 
670
                                $this->sql_report('record_fromcache', $query, $endtime, $splittime);
 
671
 
 
672
                        break;
 
673
                }
 
674
        }
 
675
}
 
676
 
 
677
?>
 
 
b'\\ No newline at end of file'