33namespace Kiboko \Plugin \SQL \Builder ;
44
55use Kiboko \Contract \Configurator \StepBuilderInterface ;
6- use Kiboko \Plugin \SQL \Builder \DTO \Parameter ;
76use PhpParser \Node ;
7+ use function Kiboko \Component \SatelliteToolbox \AST \variable ;
88
99final class Loader implements StepBuilderInterface
1010{
@@ -248,30 +248,153 @@ public function compileAfterQueries(): Node\Expr
248248 public function compileParameters (): iterable
249249 {
250250 foreach ($ this ->parameters as $ key => $ parameter ) {
251- yield new Node \Stmt \Expression (
252- new Node \Expr \MethodCall (
253- var: new Node \Expr \Variable ('statement ' ),
254- name: new Node \Identifier ('bindParam ' ),
255- args: array_filter ([
256- new Node \Arg (
257- is_string ($ key ) ? new Node \Scalar \Encapsed (
258- [
259- new Node \Scalar \EncapsedStringPart (': ' ),
260- new Node \Scalar \EncapsedStringPart ($ key )
261- ]
262- ) : new Node \Scalar \LNumber ($ key )
251+ yield match ($ parameter ['type ' ]) {
252+ 'datetime ' => [
253+ new Node \Stmt \Expression (
254+ expr: new Node \Expr \Assign (
255+ var: new Node \Expr \Variable ('datetime ' ),
256+ expr: new Node \Expr \FuncCall (
257+ name: new Node \Name ('strtotime ' ),
258+ args: [
259+ new Node \Arg (
260+ value: new Node \Expr \MethodCall (
261+ var: $ parameter ['value ' ],
262+ name: new Node \Name ('format ' ),
263+ args: [
264+ new Node \Arg (
265+ value: new Node \Scalar \String_ ('YYYY-MM-DD HH:MI:SS ' )
266+ ),
267+ ],
268+ ),
269+ ),
270+ ],
271+ ),
263272 ),
264- new Node \Arg (
265- $ parameter ["value " ]
273+ ),
274+ new Node \Stmt \Expression (
275+ new Node \Expr \MethodCall (
276+ var: new Node \Expr \Variable ('statement ' ),
277+ name: new Node \Identifier ('bindParam ' ),
278+ args: array_filter ([
279+ new Node \Arg (
280+ is_string ($ key ) ? new Node \Scalar \Encapsed (
281+ [
282+ new Node \Scalar \EncapsedStringPart (': ' ),
283+ new Node \Scalar \EncapsedStringPart ($ key )
284+ ]
285+ ) : new Node \Scalar \LNumber ($ key )
286+ ),
287+ new Node \Arg (
288+ new Node \Expr \Variable ('datetime ' )
289+ ),
290+ $ this ->compileParameterType ($ parameter )
291+ ]),
266292 ),
267- $ this ->compileParameterType ($ parameter )
268- ]),
269- )
270- );
293+ ),
294+ ],
295+ 'date ' => [
296+ new Node \Stmt \Expression (
297+ expr: new Node \Expr \Assign (
298+ var: new Node \Expr \Variable ('date ' ),
299+ expr: new Node \Expr \FuncCall (
300+ name: new Node \Name ('strtotime ' ),
301+ args: [
302+ new Node \Arg (
303+ value: new Node \Expr \MethodCall (
304+ var: $ parameter ['value ' ],
305+ name: new Node \Name ('format ' ),
306+ args: [
307+ new Node \Arg (
308+ value: new Node \Scalar \String_ ('YYYY-MM-DD ' )
309+ ),
310+ ],
311+ ),
312+ ),
313+ ],
314+ ),
315+ ),
316+ ),
317+ new Node \Stmt \Expression (
318+ new Node \Expr \MethodCall (
319+ var: new Node \Expr \Variable ('statement ' ),
320+ name: new Node \Identifier ('bindParam ' ),
321+ args: array_filter ([
322+ new Node \Arg (
323+ is_string ($ key ) ? new Node \Scalar \Encapsed (
324+ [
325+ new Node \Scalar \EncapsedStringPart (': ' ),
326+ new Node \Scalar \EncapsedStringPart ($ key )
327+ ]
328+ ) : new Node \Scalar \LNumber ($ key )
329+ ),
330+ new Node \Arg (
331+ new Node \Expr \Variable ('date ' )
332+ ),
333+ $ this ->compileParameterType ($ parameter )
334+ ]),
335+ ),
336+ ),
337+ ],
338+ 'json ' => [
339+ new Node \Stmt \Expression (
340+ expr: new Node \Expr \Assign (
341+ var: new Node \Expr \Variable ('json ' ),
342+ expr: new Node \Expr \FuncCall (
343+ name: new Node \Name ('json_encode ' ),
344+ args: [
345+ new Node \Arg (
346+ value: $ parameter ['value ' ]
347+ )
348+ ],
349+ ),
350+ ),
351+ ),
352+ new Node \Stmt \Expression (
353+ new Node \Expr \MethodCall (
354+ var: new Node \Expr \Variable ('statement ' ),
355+ name: new Node \Identifier ('bindParam ' ),
356+ args: array_filter ([
357+ new Node \Arg (
358+ is_string ($ key ) ? new Node \Scalar \Encapsed (
359+ [
360+ new Node \Scalar \EncapsedStringPart (': ' ),
361+ new Node \Scalar \EncapsedStringPart ($ key )
362+ ]
363+ ) : new Node \Scalar \LNumber ($ key )
364+ ),
365+ new Node \Arg (
366+ new Node \Expr \Variable ('json ' )
367+ ),
368+ $ this ->compileParameterType ($ parameter )
369+ ]),
370+ ),
371+ ),
372+ ],
373+ default => new Node \Stmt \Expression (
374+ new Node \Expr \MethodCall (
375+ var: new Node \Expr \Variable ('statement ' ),
376+ name: new Node \Identifier ('bindParam ' ),
377+ args: array_filter ([
378+ new Node \Arg (
379+ is_string ($ key ) ? new Node \Scalar \Encapsed (
380+ [
381+ new Node \Scalar \EncapsedStringPart (': ' ),
382+ new Node \Scalar \EncapsedStringPart ($ key )
383+ ]
384+ ) : new Node \Scalar \LNumber ($ key )
385+ ),
386+ new Node \Arg (
387+ $ parameter ["value " ]
388+ ),
389+ $ this ->compileParameterType ($ parameter )
390+ ]),
391+ ),
392+ ),
393+ };
271394 }
272395 }
273396
274- private function compileParameterType (array $ parameter ): ? Node \Arg
397+ private function compileParameterType (array $ parameter ): Node \Arg
275398 {
276399 return match ($ parameter ["type " ]) {
277400 'integer ' => new Node \Arg (
@@ -286,13 +409,18 @@ class: new Node\Name\FullyQualified(name: 'PDO'),
286409 name: new Node \Identifier (name: 'PARAM_BOOL ' )
287410 )
288411 ),
289- 'string ' => new Node \Arg (
412+ 'binary ' => new Node \Arg (
290413 value: new Node \Expr \ClassConstFetch (
291414 class: new Node \Name \FullyQualified (name: 'PDO ' ),
292- name: new Node \Identifier (name: 'PARAM_STR ' )
415+ name: new Node \Identifier (name: 'PARAM_LOB ' )
293416 )
294417 ),
295- default => null
418+ default => new Node \Arg (
419+ value: new Node \Expr \ClassConstFetch (
420+ class: new Node \Name \FullyQualified (name: 'PDO ' ),
421+ name: new Node \Identifier (name: 'PARAM_STR ' )
422+ )
423+ )
296424 };
297425 }
298426}
0 commit comments