# Coverage for Doctrine_Formatter

Back to coverage report

1 | <?php
2 | /*
3 | * $Id$
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_Connection_Module');
22 | /**
23 | * Doctrine_Formatter
24 | *
25 | * @package Doctrine
26 | * @subpackage Formatter
27 | * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
28 | * @link www.phpdoctrine.org
29 | * @since 1.0
30 | * @version $Revision$
31 | * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
32 | */
33 | class Doctrine_Formatter extends Doctrine_Connection_Module
34 | {
35 | /**
36 | * Quotes pattern (% and _) characters in a string)
37 | *
38 | * EXPERIMENTAL
39 | *
40 | * WARNING: this function is experimental and may change signature at
41 | * any time until labelled as non-experimental
42 | *
43 | * @param string the input string to quote
44 | *
45 | * @return string quoted string
46 | */
47 | public function escapePattern($text)
48 | {
49 | if ( ! $this->string_quoting['escape_pattern']) {
50 | return $text;
51 | }
52 | $tmp = $this->conn->string_quoting;
53 |
54 | $text = str_replace($tmp['escape_pattern'],
55 | $tmp['escape_pattern'] .
56 | $tmp['escape_pattern'], $text);
57 |
58 | foreach ($this->wildcards as $wildcard) {
59 | $text = str_replace($wildcard, $tmp['escape_pattern'] . $wildcard, $text);
60 | }
61 | return $text;
62 | }
63 |
64 | /**
65 | * convertBooleans
66 | * some drivers need the boolean values to be converted into integers
67 | * when using DQL API
68 | *
69 | * This method takes care of that conversion
70 | *
71 | * @param array $item
72 | * @return void
73 | */
74 | public function convertBooleans($item)
75 | {
76 | if (is_array($item)) {
77 | foreach ($item as $k => $value) {
78 | if (is_bool($value)) {
79 | $item[$k] = (int) $value;
80 | }
81 | }
82 | } else {
83 | if (is_bool($item)) {
84 | $item = (int) $item;
85 | }
86 | }
87 | return $item;
88 | }
89 |
90 | /**
91 | * Quote a string so it can be safely used as a table or column name
92 | *
93 | * Delimiting style depends on which database driver is being used.
94 | *
95 | * NOTE: just because you CAN use delimited identifiers doesn't mean
96 | * you SHOULD use them. In general, they end up causing way more
97 | * problems than they solve.
98 | *
99 | * Portability is broken by using the following characters inside
100 | * delimited identifiers:
101 | * + backtick (<kbd>`</kbd>) -- due to MySQL
102 | * + double quote (<kbd>"</kbd>) -- due to Oracle
103 | * + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
104 | *
105 | * Delimited identifiers are known to generally work correctly under
106 | * the following drivers:
107 | * + mssql
108 | * + mysql
109 | * + mysqli
110 | * + oci8
111 | * + pgsql
112 | * + sqlite
113 | *
114 | * InterBase doesn't seem to be able to use delimited identifiers
115 | * via PHP 4. They work fine under PHP 5.
116 | *
117 | * @param string $str identifier name to be quoted
118 | * @param bool $checkOption check the 'quote_identifier' option
119 | *
120 | * @return string quoted identifier string
121 | */
122 | public function quoteIdentifier($str, $checkOption = true)
123 | {
124 | if ($checkOption && ! $this->conn->getAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER)) {
125 | return $str;
126 | }
127 | $tmp = $this->conn->identifier_quoting;
128 | $str = str_replace($tmp['end'],
129 | $tmp['escape'] .
130 | $tmp['end'], $str);
131 |
132 | return $tmp['start'] . $str . $tmp['end'];
133 | }
134 |
135 | /**
136 | * quote
137 | * quotes given input parameter
138 | *
139 | * @param mixed $input parameter to be quoted
140 | * @param string $type
141 | * @return mixed
142 | */
143 | public function quote($input, $type = null)
144 | {
145 | if ($type == null) {
146 | $type = gettype($input);
147 | }
148 | switch ($type) {
149 | case 'integer':
150 | case 'enum':
151 | case 'boolean':
152 | case 'double':
153 | case 'float':
154 | case 'bool':
155 | case 'decimal':
156 | case 'int':
157 | return $input;
158 | case 'array':
159 | case 'object':
160 | $input = serialize($input);
161 | case 'string':
162 | case 'char':
163 | case 'varchar':
164 | case 'text':
165 | case 'gzip':
166 | case 'blob':
167 | case 'clob':
168 | $this->conn->connect();
169 |
170 | return $this->conn->getDbh()->quote($input);
171 | }
172 | }
173 |
174 | /**
175 | * Removes any formatting in an sequence name using the 'seqname_format' option
176 | *
177 | * @param string $sqn string that containts name of a potential sequence
178 | * @return string name of the sequence with possible formatting removed
179 | */
180 | public function fixSequenceName($sqn)
181 | {
182 | $seqPattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $this->conn->getAttribute(Doctrine::ATTR_SEQNAME_FORMAT)).'$/i';
183 | $seqName = preg_replace($seqPattern, '\\1', $sqn);
184 |
185 | if ($seqName && ! strcasecmp($sqn, $this->getSequenceName($seqName))) {
186 | return $seqName;
187 | }
188 | return $sqn;
189 | }
190 |
191 | /**
192 | * Removes any formatting in an index name using the 'idxname_format' option
193 | *
194 | * @param string $idx string that containts name of anl index
195 | * @return string name of the index with possible formatting removed
196 | */
197 | public function fixIndexName($idx)
198 | {
199 | $indexPattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $this->conn->getAttribute(Doctrine::ATTR_IDXNAME_FORMAT)).'$/i';
200 | $indexName = preg_replace($indexPattern, '\\1', $idx);
201 | if ($indexName && ! strcasecmp($idx, $this->getIndexName($indexName))) {
202 | return $indexName;
203 | }
204 | return $idx;
205 | }
206 |
207 | /**
208 | * adds sequence name formatting to a sequence name
209 | *
210 | * @param string name of the sequence
211 | * @return string formatted sequence name
212 | */
213 | public function getSequenceName($sqn)
214 | {
215 | return sprintf($this->conn->getAttribute(Doctrine::ATTR_SEQNAME_FORMAT),
216 | preg_replace('/[^a-z0-9_\$.]/i', '_', $sqn));
217 | }
218 |
219 | /**
220 | * adds index name formatting to a index name
221 | *
222 | * @param string name of the index
223 | * @return string formatted index name
224 | */
225 | public function getIndexName($idx)
226 | {
227 | return sprintf($this->conn->getAttribute(Doctrine::ATTR_IDXNAME_FORMAT),
228 | preg_replace('/[^a-z0-9_\$]/i', '_', $idx));
229 | }
230 |
231 | /**
232 | * adds table name formatting to a table name
233 | *
234 | * @param string name of the table
235 | * @return string formatted table name
236 | */
237 | public function getTableName($table)
238 | {
239 | return sprintf($this->conn->getAttribute(Doctrine::ATTR_TBLNAME_FORMAT),
240 | preg_replace('/[^a-z0-9_\$]/i', '_', $table));
241 | }
242 | }