Coverage for Doctrine_DataDict_Oracle

Back to coverage report

1 <?php
2 /*
3  *  $Id: Oracle.php 3159 2007-11-15 05:16:31Z Jonathan.Wage $
4  *
5  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16  *
17  * This software consists of voluntary contributions made by many individuals
18  * and is licensed under the LGPL. For more information, see
19  * <http://www.phpdoctrine.org>.
20  */
21 Doctrine::autoload('Doctrine_DataDict');
22 /**
23  * @package     Doctrine
24  * @subpackage  DataDict
25  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
26  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
27  * @version     $Revision: 3159 $
28  * @link        www.phpdoctrine.org
29  * @since       1.0
30  */
31 class Doctrine_DataDict_Oracle extends Doctrine_DataDict
32 {
33     /**
34      * Obtain DBMS specific SQL code portion needed to declare an text type
35      * field to be used in statements like CREATE TABLE.
36      *
37      * @param array $field  associative array with the name of the properties
38      *      of the field being declared as array indexes. Currently, the types
39      *      of supported field properties are as follows:
40      *
41      *      length
42      *          Integer value that determines the maximum length of the text
43      *          field. If this argument is missing the field should be
44      *          declared to have the longest length allowed by the DBMS.
45      *
46      *      default
47      *          Text value to be used as default for this field.
48      *
49      *      notnull
50      *          Boolean flag that indicates whether this field is constrained
51      *          to not be set to null.
52      * @return string  DBMS specific SQL code portion that should be used to
53      *      declare the specified field.
54      */
55     public function getNativeDeclaration(array $field)
56     {
57         if ( ! isset($field['type'])) {
58             throw new Doctrine_DataDict_Exception('Missing column type.');
59         }
60         switch ($field['type']) {
61             case 'string':
62             case 'array':
63             case 'object':
64             case 'gzip':
65             case 'char':
66             case 'varchar':
67                 $length = !empty($field['length'])
68                     ? $field['length'] : 16777215; // TODO: $this->conn->options['default_text_field_length'];
69
70                 $fixed  = ((isset($field['fixed']) && $field['fixed']) || $field['type'] == 'char') ? true : false;
71
72                 return $fixed ? 'CHAR('.$length.')' : 'VARCHAR2('.$length.')';
73             case 'clob':
74                 return 'CLOB';
75             case 'blob':
76                 return 'BLOB';
77             case 'integer':
78             case 'enum':
79             case 'int':
80                 if ( ! empty($field['length'])) {
81                     return 'NUMBER('.$field['length'].')';
82                 }
83                 return 'INT';
84             case 'boolean':
85                 return 'NUMBER(1)';
86             case 'date':
87             case 'time':
88             case 'timestamp':
89                 return 'DATE';
90             case 'float':
91             case 'double':
92                 return 'NUMBER';
93             case 'decimal':
94                 $scale = !empty($field['scale']) ? $field['scale'] : $this->conn->getAttribute(Doctrine::ATTR_DECIMAL_PLACES);
95                 return 'NUMBER(*,'.$scale.')';
96             default:
97         }
98         throw new Doctrine_DataDict_Exception('Unknown field type \'' . $field['type'] .  '\'.');
99     }
100
101     /**
102      * Maps a native array description of a field to a doctrine datatype and length
103      *
104      * @param array  $field native field description
105      * @return array containing the various possible types, length, sign, fixed
106      * @throws Doctrine_DataDict_Oracle_Exception
107      */
108     public function getPortableDeclaration(array $field)
109     {
110         if ( ! isset($field['data_type'])) {
111             throw new Doctrine_DataDict_Exception('Native oracle definition must have a data_type key specified');
112         }
113         
114         $dbType = strtolower($field['data_type']);
115         $type = array();
116         $length = $unsigned = $fixed = null;
117         if ( ! empty($field['data_length'])) {
118             $length = $field['data_length'];
119         }
120
121         if ( ! isset($field['column_name'])) {
122             $field['column_name'] = '';
123         }
124
125         switch ($dbType) {
126             case 'integer':
127             case 'pls_integer':
128             case 'binary_integer':
129                 $type[] = 'integer';
130                 if ($length == '1') {
131                     $type[] = 'boolean';
132                     if (preg_match('/^(is|has)/', $field['column_name'])) {
133                         $type = array_reverse($type);
134                     }
135                 }
136                 break;
137             case 'varchar':
138             case 'varchar2':
139             case 'nvarchar2':
140                 $fixed = false;
141             case 'char':
142             case 'nchar':
143                 $type[] = 'string';
144                 if ($length == '1') {
145                     $type[] = 'boolean';
146                     if (preg_match('/^(is|has)/', $field['column_name'])) {
147                         $type = array_reverse($type);
148                     }
149                 }
150                 if ($fixed !== false) {
151                     $fixed = true;
152                 }
153                 break;
154             case 'date':
155             case 'timestamp':
156                 $type[] = 'timestamp';
157                 $length = null;
158                 break;
159             case 'float':
160                 $type[] = 'float';
161                 break;
162             case 'number':
163                 if ( ! empty($field['data_scale'])) {
164                     $type[] = 'decimal';
165                 } else {
166                     $type[] = 'integer';
167                     if ($length == '1') {
168                         $type[] = 'boolean';
169                         if (preg_match('/^(is|has)/', $field['column_name'])) {
170                             $type = array_reverse($type);
171                         }
172                     }
173                 }
174                 break;
175             case 'long':
176                 $type[] = 'string';
177             case 'clob':
178             case 'nclob':
179                 $type[] = 'clob';
180                 break;
181             case 'blob':
182             case 'raw':
183             case 'long raw':
184             case 'bfile':
185                 $type[] = 'blob';
186                 $length = null;
187             break;
188             case 'rowid':
189             case 'urowid':
190             default:
191                 throw new Doctrine_DataDict_Exception('unknown database attribute type: ' . $dbType);
192         }
193
194         return array('type'     => $type,
195                      'length'   => $length,
196                      'unsigned' => $unsigned,
197                      'fixed'    => $fixed);
198     }
199 }