# Coverage for Doctrine_DataDict_Firebird

Back to coverage report

1 | <?php
2 | /*
3 | * $Id: Firebird.php 2963 2007-10-21 06:23:59Z 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 | * @author Lorenzo Alberton <l.alberton@quipo.it> (PEAR MDB2 Interbase driver)
28 | * @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
29 | * @version $Revision: 2963 $
30 | * @link www.phpdoctrine.org
31 | * @since 1.0
32 | */
33 | class Doctrine_DataDict_Firebird extends Doctrine_DataDict
34 | {
35 | /**
36 | * Obtain DBMS specific SQL code portion needed to declare an text type
37 | * field to be used in statements like CREATE TABLE.
38 | *
39 | * @param array $field associative array with the name of the properties
40 | * of the field being declared as array indexes. Currently, the types
41 | * of supported field properties are as follows:
42 | *
43 | * length
44 | * Integer value that determines the maximum length of the text
45 | * field. If this argument is missing the field should be
46 | * declared to have the longest length allowed by the DBMS.
47 | *
48 | * default
49 | * Text value to be used as default for this field.
50 | *
51 | * notnull
52 | * Boolean flag that indicates whether this field is constrained
53 | * to not be set to null.
54 | * @return string DBMS specific SQL code portion that should be used to
55 | * declare the specified field.
56 | */
57 | public function getNativeDeclaration($field)
58 | {
59 | if ( ! isset($field['type'])) {
60 | throw new Doctrine_DataDict_Exception('Missing column type.');
61 | }
62 | switch ($field['type']) {
63 | case 'varchar':
64 | case 'string':
65 | case 'array':
66 | case 'object':
67 | case 'char':
68 | case 'text':
69 | case 'gzip':
70 | $length = !empty($field['length'])
71 | ? $field['length'] : 16777215; // TODO: $this->conn->options['default_text_field_length'];
72 |
73 | $fixed = ((isset($field['fixed']) && $field['fixed']) || $field['type'] == 'char') ? true : false;
74 |
75 | return $fixed ? 'CHAR('.$length.')' : 'VARCHAR('.$length.')';
76 | case 'clob':
77 | return 'BLOB SUB_TYPE 1';
78 | case 'blob':
79 | return 'BLOB SUB_TYPE 0';
80 | case 'integer':
81 | case 'enum':
82 | case 'int':
83 | return 'INT';
84 | case 'boolean':
85 | return 'SMALLINT';
86 | case 'date':
87 | return 'DATE';
88 | case 'time':
89 | return 'TIME';
90 | case 'timestamp':
91 | return 'TIMESTAMP';
92 | case 'float':
93 | return 'DOUBLE PRECISION';
94 | case 'decimal':
95 | $length = !empty($field['length']) ? $field['length'] : 18;
96 | $scale = !empty($field['scale']) ? $field['scale'] : $this->conn->getAttribute(Doctrine::ATTR_DECIMAL_PLACES);
97 | return 'DECIMAL('.$length.','.$scale.')';
98 | }
99 |
100 | throw new Doctrine_DataDict_Exception('Unknown field type \'' . $field['type'] . '\'.');
101 | }
102 |
103 | /**
104 | * Maps a native array description of a field to a Doctrine datatype and length
105 | *
106 | * @param array $field native field description
107 | * @return array containing the various possible types, length, sign, fixed
108 | */
109 | public function getPortableDeclaration($field)
110 | {
111 | $length = (isset($field['length']) && $field['length'] > 0) ? $field['length'] : null;
112 |
113 | $type = array();
114 | $unsigned = $fixed = null;
115 | $dbType = strtolower($field['type']);
116 | $field['field_sub_type'] = !empty($field['field_sub_type'])
117 | ? strtolower($field['field_sub_type']) : null;
118 |
119 | if ( ! isset($field['name'])) {
120 | $field['name'] = '';
121 | }
122 |
123 | switch ($dbType) {
124 | case 'smallint':
125 | case 'integer':
126 | case 'int64':
127 | //these may be 'numeric' or 'decimal'
128 | if (isset($field['field_sub_type'])) {
129 | $field['type'] = $field['field_sub_type'];
130 | return $this->getPortableDeclaration($field);
131 | }
132 | case 'bigint':
133 | case 'quad':
134 | $type[] = 'integer';
135 | if ($length == '1') {
136 | $type[] = 'boolean';
137 | if (preg_match('/^(is|has)/', $field['name'])) {
138 | $type = array_reverse($type);
139 | }
140 | }
141 | break;
142 | case 'varchar':
143 | $fixed = false;
144 | case 'char':
145 | case 'cstring':
146 | $type[] = 'string';
147 | if ($length == '1') {
148 | $type[] = 'boolean';
149 | if (preg_match('/^(is|has)/', $field['name'])) {
150 | $type = array_reverse($type);
151 | }
152 | }
153 | if ($fixed !== false) {
154 | $fixed = true;
155 | }
156 | break;
157 | case 'date':
158 | $type[] = 'date';
159 | $length = null;
160 | break;
161 | case 'timestamp':
162 | $type[] = 'timestamp';
163 | $length = null;
164 | break;
165 | case 'time':
166 | $type[] = 'time';
167 | $length = null;
168 | break;
169 | case 'float':
170 | case 'double':
171 | case 'double precision':
172 | case 'd_float':
173 | $type[] = 'float';
174 | break;
175 | case 'decimal':
176 | case 'numeric':
177 | $type[] = 'decimal';
178 | break;
179 | case 'blob':
180 | $type[] = ($field['field_sub_type'] == 'text') ? 'clob' : 'blob';
181 | $length = null;
182 | break;
183 | default:
184 | throw new Doctrine_DataDict_Exception('unknown database attribute type: '.$dbType);
185 | }
186 |
187 | return array('type' => $type,
188 | 'length' => $length,
189 | 'unsigned' => $unsigned,
190 | 'fixed' => $fixed);
191 | }
192 |
193 | /**
194 | * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
195 | * of a field declaration to be used in statements like CREATE TABLE.
196 | *
197 | * @param string $charset name of the charset
198 | * @return string DBMS specific SQL code portion needed to set the CHARACTER SET
199 | * of a field declaration.
200 | */
201 | public function getCharsetFieldDeclaration($charset)
202 | {
203 | return 'CHARACTER SET ' . $charset;
204 | }
205 |
206 | /**
207 | * Obtain DBMS specific SQL code portion needed to set the COLLATION
208 | * of a field declaration to be used in statements like CREATE TABLE.
209 | *
210 | * @param string $collation name of the collation
211 | * @return string DBMS specific SQL code portion needed to set the COLLATION
212 | * of a field declaration.
213 | */
214 | public function getCollationFieldDeclaration($collation)
215 | {
216 | return 'COLLATE ' . $collation;
217 | }
218 | }