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