thomascube
2006-04-04 f3704e18d89e4065cede8509256d7fbf483b7fe6
commit | author | age
c9462d 1 <?php
S 2 // +----------------------------------------------------------------------+
3 // | PHP versions 4 and 5                                                 |
4 // +----------------------------------------------------------------------+
5 // | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox,                 |
6 // | Stig. S. Bakken, Lukas Smith, Frank M. Kromann                       |
7 // | All rights reserved.                                                 |
8 // +----------------------------------------------------------------------+
9 // | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
10 // | API as well as database abstraction for PHP applications.            |
11 // | This LICENSE is in the BSD license style.                            |
12 // |                                                                      |
13 // | Redistribution and use in source and binary forms, with or without   |
14 // | modification, are permitted provided that the following conditions   |
15 // | are met:                                                             |
16 // |                                                                      |
17 // | Redistributions of source code must retain the above copyright       |
18 // | notice, this list of conditions and the following disclaimer.        |
19 // |                                                                      |
20 // | Redistributions in binary form must reproduce the above copyright    |
21 // | notice, this list of conditions and the following disclaimer in the  |
22 // | documentation and/or other materials provided with the distribution. |
23 // |                                                                      |
24 // | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
25 // | Lukas Smith nor the names of his contributors may be used to endorse |
26 // | or promote products derived from this software without specific prior|
27 // | written permission.                                                  |
28 // |                                                                      |
29 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
30 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
31 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
32 // | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
33 // | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
34 // | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
35 // | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
36 // |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
37 // | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
38 // | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
39 // | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
40 // | POSSIBILITY OF SUCH DAMAGE.                                          |
41 // +----------------------------------------------------------------------+
42 // | Author: Lukas Smith <smith@pooteeweet.org>                           |
43 // +----------------------------------------------------------------------+
44 //
45 // $Id$
46 //
47
48 require_once 'MDB2/Driver/Reverse/Common.php';
49
50 /**
51  * MDB2 Oracle driver for the schema reverse engineering module
52  *
53  * @package MDB2
54  * @category Database
55  * @author  Lukas Smith <smith@dybnet.de>
56  */
57 class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common
58 {
59     // }}}
60     // {{{ tableInfo()
61
62     /**
63      * Returns information about a table or a result set
64      *
65      * NOTE: only supports 'table' and 'flags' if <var>$result</var>
66      * is a table name.
67      *
68      * NOTE: flags won't contain index information.
69      *
70      * @param object|string  $result  MDB2_result object from a query or a
71      *                                 string containing the name of a table.
72      *                                 While this also accepts a query result
73      *                                 resource identifier, this behavior is
74      *                                 deprecated.
75      * @param int            $mode    a valid tableInfo mode
76      *
77      * @return array  an associative array with the information requested.
78      *                 A MDB2_Error object on failure.
79      *
80      * @see MDB2_Driver_Common::tableInfo()
81      */
82     function tableInfo($result, $mode = null)
83     {
84         $db =& $this->getDBInstance();
85         if (PEAR::isError($db)) {
86             return $db;
87         }
88
89         if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
90             if ($db->options['field_case'] == CASE_LOWER) {
91                 $case_func = 'strtolower';
92             } else {
93                 $case_func = 'strtoupper';
94             }
95         } else {
96             $case_func = 'strval';
97         }
98
99         $res = array();
100
101         if (is_string($result)) {
102             /*
103              * Probably received a table name.
104              * Create a result resource identifier.
105              */
106             $result = strtoupper($result);
107             $query = 'SELECT column_name, data_type, data_length, '
108                         . 'nullable '
109                         . 'FROM user_tab_columns '
110                         . "WHERE table_name='$result' ORDER BY column_id";
111
112             $stmt = $db->_doQuery($query);
113             if (PEAR::isError($stmt)) {
114                 return $stmt;
115             }
116
117             $i = 0;
118             while (@OCIFetch($stmt)) {
119                 $res[$i] = array(
120                     'table' => $case_func($result),
121                     'name'  => $case_func(@OCIResult($stmt, 1)),
122                     'type'  => @OCIResult($stmt, 2),
123                     'len'   => @OCIResult($stmt, 3),
124                     'flags' => (@OCIResult($stmt, 4) == 'N') ? 'not_null' : '',
125                 );
126                 if ($mode & MDB2_TABLEINFO_ORDER) {
127                     $res['order'][$res[$i]['name']] = $i;
128                 }
129                 if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
130                     $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
131                 }
132                 $i++;
133             }
134
135             if ($mode) {
136                 $res['num_fields'] = $i;
137             }
138             @OCIFreeStatement($stmt);
139
140         } else {
141             if (MDB2::isResultCommon($result)) {
142                 /*
143                  * Probably received a result object.
144                  * Extract the result resource identifier.
145                  */
146                 $result = $result->getResource();
147             }
148
149             $res = array();
150
151             if ($result === $db->last_stmt) {
152                 $count = @OCINumCols($result);
153                 if ($mode) {
154                     $res['num_fields'] = $count;
155                 }
156                 for ($i = 0; $i < $count; $i++) {
157                     $res[$i] = array(
158                         'table' => '',
159                         'name'  => $case_func(@OCIColumnName($result, $i+1)),
160                         'type'  => @OCIColumnType($result, $i+1),
161                         'len'   => @OCIColumnSize($result, $i+1),
162                         'flags' => '',
163                     );
164                     if ($mode & MDB2_TABLEINFO_ORDER) {
165                         $res['order'][$res[$i]['name']] = $i;
166                     }
167                     if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
168                         $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
169                     }
170                 }
171             } else {
172                 return $db->raiseError(MDB2_ERROR_NOT_CAPABLE);
173             }
174         }
175         return $res;
176     }
177 }
178 ?>