7e778e99479e7c286fb2781b43a9de673e5d2225
[m6w6/ext-pq] / tests / conv001.phpt
1 --TEST--
2 converter
3 --SKIPIF--
4 <?php
5 include "_skipif.inc";
6 ?>
7 --INI--
8 date.timezone=UTC
9 --FILE--
10 <?php
11 echo "Test\n";
12
13 include "_setup.inc";
14
15 abstract class Converter implements pq\Converter
16 {
17 protected $types;
18
19 function __construct(\pq\Types $types) {
20 $this->types = $types;
21 }
22 }
23
24 class HStoreConverter extends Converter
25 {
26 function convertTypes() {
27 return [ $this->types["hstore"]->oid ];
28 }
29
30 function convertFromString($string, $type) {
31 return eval("return [$string];");
32 }
33
34 function convertToString($data, $type) {
35 $string = "";
36 foreach ($data as $k => $v) {
37 if (isset($v)) {
38 $string .= sprintf("\"%s\"=>\"%s\",", addslashes($k), addslashes($v));
39 } else {
40 $string .= sprintf("\"%s\"=>NULL,", addslashes($k));
41 }
42 }
43 return $string;
44 }
45 }
46
47 class IntVectorConverter extends Converter
48 {
49 function convertTypes() {
50 return [
51 $this->types["int2vector"]->oid,
52 $this->types["oidvector"]->oid
53 ];
54 }
55
56 function convertFromString($string, $type) {
57 return array_map("intval", explode(" ", $string));
58 }
59
60 function convertToString($data, $type) {
61 return implode(" ", $data);
62 }
63 }
64
65 class JSONConverter extends Converter
66 {
67 function convertTypes() {
68 return [ $this->types["json"]->oid ];
69 }
70
71 function convertFromString($string, $type) {
72 return json_decode($string);
73 }
74
75 function convertToString($data, $type) {
76 return json_encode($data);
77 }
78 }
79
80 class Text {
81 private $data;
82 function __construct($data) {
83 $this->data = $data;
84 }
85 function __toString() {
86 return (string) $this->data;
87 }
88 }
89
90 $c = new pq\Connection(PQ_DSN);
91 $c->exec("CREATE EXTENSION IF NOT EXISTS hstore");
92 $t = new pq\Types($c);
93
94 $c->setConverter(new HStoreConverter($t));
95 $c->setConverter(new IntVectorConverter($t));
96 if (!defined("pq\\Types::JSON")) {
97 $c->setConverter(new JSONConverter($t));
98 }
99 $r = $c->execParams("SELECT \$1 as hs, \$2 as iv, \$3 as oids, \$4 as js, \$5 as ia, \$6 as ta, \$7 as ba, \$8 as da, \$9 as dbl, \$10 as bln, ".
100 "\$11 as dt1, \$12 as dt2, \$13 as dt3, \$14 as dt4, \$15 as dt5, \$16 as dt6, \$17 as dt7, \$18 as dt8, \$19 as txta ",
101 array(
102 // hstore
103 array(
104 "k1" => "v1",
105 "k2" => "v2",
106 "k3" => null
107 ),
108 // vectors
109 array(
110 1, 3, 5, 7, 9, 11
111 ),
112 array(
113 2345124, 1431341, 1343423
114 ),
115 // JSON
116 (object) array(
117 "int" => 123,
118 "obj" => (object) array(
119 "a" => 1,
120 "b" => 2,
121 "c" => 3,
122 ),
123 "str" => "äüö"
124 ),
125 // arrays
126 array(array(array(1,2,3))),
127 array(array("a\"","b}",null)),
128 array(true,false),
129 array(1.1,2.2),
130 // double
131 123.456,
132 // bool
133 true,
134 // datetimes
135 new pq\Datetime,
136 new pq\Datetime,
137 new pq\Datetime,
138 new pq\Datetime,
139 new pq\Datetime,
140 new pq\Datetime,
141 new pq\Datetime,
142 new pq\Datetime,
143 [new Text(0), new Text(" or "), new Text(true)],
144 ),
145 array(
146 $t["hstore"]->oid,
147 $t["int2vector"]->oid,
148 $t["oidvector"]->oid,
149 $t["json"]->oid,
150 $t["_int4"]->oid,
151 $t["_text"]->oid,
152 $t["_bool"]->oid,
153 $t["_float8"]->oid,
154 $t["float4"]->oid,
155 $t["bool"]->oid,
156 $t["date"]->oid,
157 $t["abstime"]->oid,
158 $t["timestamp"]->oid,
159 $t["timestamptz"]->oid,
160 $t["date"]->oid,
161 $t["abstime"]->oid,
162 $t["timestamp"]->oid,
163 $t["timestamptz"]->oid,
164 $t["_text"]->oid
165 )
166 );
167
168 var_dump($r->fetchAll());
169
170 ?>
171 Done
172 --EXPECTF--
173 Test
174 array(1) {
175 [0]=>
176 array(%d) {
177 [0]=>
178 array(3) {
179 ["k1"]=>
180 string(2) "v1"
181 ["k2"]=>
182 string(2) "v2"
183 ["k3"]=>
184 NULL
185 }
186 [1]=>
187 array(6) {
188 [0]=>
189 int(1)
190 [1]=>
191 int(3)
192 [2]=>
193 int(5)
194 [3]=>
195 int(7)
196 [4]=>
197 int(9)
198 [5]=>
199 int(11)
200 }
201 [2]=>
202 array(3) {
203 [0]=>
204 int(2345124)
205 [1]=>
206 int(1431341)
207 [2]=>
208 int(1343423)
209 }
210 [3]=>
211 object(stdClass)#%d (3) {
212 ["int"]=>
213 int(123)
214 ["obj"]=>
215 object(stdClass)#%d (3) {
216 ["a"]=>
217 int(1)
218 ["b"]=>
219 int(2)
220 ["c"]=>
221 int(3)
222 }
223 ["str"]=>
224 string(6) "äüö"
225 }
226 [4]=>
227 array(1) {
228 [0]=>
229 array(1) {
230 [0]=>
231 array(3) {
232 [0]=>
233 int(1)
234 [1]=>
235 int(2)
236 [2]=>
237 int(3)
238 }
239 }
240 }
241 [5]=>
242 array(1) {
243 [0]=>
244 array(3) {
245 [0]=>
246 string(2) "a""
247 [1]=>
248 string(2) "b}"
249 [2]=>
250 NULL
251 }
252 }
253 [6]=>
254 array(2) {
255 [0]=>
256 bool(true)
257 [1]=>
258 bool(false)
259 }
260 [7]=>
261 array(2) {
262 [0]=>
263 float(1.1)
264 [1]=>
265 float(2.2)
266 }
267 [8]=>
268 float(123.456)
269 [9]=>
270 bool(true)
271 [10]=>
272 object(pq\DateTime)#%d (4) {
273 ["format"]=>
274 string(5) "Y-m-d"
275 ["date"]=>
276 string(26) "%d-%d-%d 00:00:00.000000"
277 ["timezone_type"]=>
278 int(3)
279 ["timezone"]=>
280 string(3) "UTC"
281 }
282 [11]=>
283 object(pq\DateTime)#%d (4) {
284 ["format"]=>
285 string(11) "Y-m-d H:i:s"
286 ["date"]=>
287 string(26) "%d-%d-%d %d:%d:%d.000000"
288 ["timezone_type"]=>
289 int(1)
290 ["timezone"]=>
291 string(%d) "%s"
292 }
293 [12]=>
294 object(pq\DateTime)#%d (4) {
295 ["format"]=>
296 string(13) "Y-m-d H:i:s.u"
297 ["date"]=>
298 string(26) "%d-%d-%d %d:%d:%d.000000"
299 ["timezone_type"]=>
300 int(3)
301 ["timezone"]=>
302 string(3) "UTC"
303 }
304 [13]=>
305 object(pq\DateTime)#%d (4) {
306 ["format"]=>
307 string(14) "Y-m-d H:i:s.uO"
308 ["date"]=>
309 string(26) "%d-%d-%d %d:%d:%d.000000"
310 ["timezone_type"]=>
311 int(1)
312 ["timezone"]=>
313 string(%d) "%s"
314 }
315 [14]=>
316 object(pq\DateTime)#%d (4) {
317 ["format"]=>
318 string(5) "Y-m-d"
319 ["date"]=>
320 string(26) "%d-%d-%d 00:00:00.000000"
321 ["timezone_type"]=>
322 int(3)
323 ["timezone"]=>
324 string(3) "UTC"
325 }
326 [15]=>
327 object(pq\DateTime)#%d (4) {
328 ["format"]=>
329 string(11) "Y-m-d H:i:s"
330 ["date"]=>
331 string(26) "%d-%d-%d %d:%d:%d.000000"
332 ["timezone_type"]=>
333 int(1)
334 ["timezone"]=>
335 string(%d) "%s"
336 }
337 [16]=>
338 object(pq\DateTime)#%d (4) {
339 ["format"]=>
340 string(13) "Y-m-d H:i:s.u"
341 ["date"]=>
342 string(26) "%d-%d-%d %d:%d:%d.000000"
343 ["timezone_type"]=>
344 int(3)
345 ["timezone"]=>
346 string(3) "UTC"
347 }
348 [17]=>
349 object(pq\DateTime)#%d (4) {
350 ["format"]=>
351 string(14) "Y-m-d H:i:s.uO"
352 ["date"]=>
353 string(26) "%d-%d-%d %d:%d:%d.000000"
354 ["timezone_type"]=>
355 int(1)
356 ["timezone"]=>
357 string(%d) "%s"
358 }
359 [18]=>
360 array(3) {
361 [0]=>
362 string(1) "0"
363 [1]=>
364 string(4) " or "
365 [2]=>
366 string(1) "1"
367 }
368 }
369 }
370 Done