Mercurial > hg > mgallery
comparison mgallery.inc.php @ 290:19fbf800b1f7
Work on very early form of virtual gallery support.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 28 Jul 2019 07:53:36 +0300 |
parents | 13cff35dfbec |
children | 486398fb60ea |
comparison
equal
deleted
inserted
replaced
289:13cff35dfbec | 290:19fbf800b1f7 |
---|---|
95 "med_format" => [MG_STR, "webp"], | 95 "med_format" => [MG_STR, "webp"], |
96 "med_width" => [MG_INT, 960], | 96 "med_width" => [MG_INT, 960], |
97 "med_height" => [MG_INT, 640], | 97 "med_height" => [MG_INT, 640], |
98 "med_quality" => [MG_INT, 90], | 98 "med_quality" => [MG_INT, 90], |
99 | 99 |
100 "backend" => [MG_STR, "php"], | |
101 "sql_db" => [MG_STR, NULL], | |
102 "sql_username" => [MG_STR, ""], | |
103 "sql_password" => [MG_STR, ""], | |
104 "sql_options" => [MG_STR, []], | |
100 ]; | 105 ]; |
101 | 106 |
102 | 107 |
103 function mgDebug($msg) | 108 function mgDebug($msg) |
104 { | 109 { |
339 case MG_INT : | 344 case MG_INT : |
340 default : return (string) $val; | 345 default : return (string) $val; |
341 } | 346 } |
342 } | 347 } |
343 | 348 |
349 | |
350 function mgLogSQLError($dbh, $sql) | |
351 { | |
352 return mgError("SQL error '".implode("; ", $dbh->errorInfo())."' in statement: \"".$sql."\""); | |
353 } | |
354 | |
355 | |
356 function mgDBGetSQLParam($dbh, $type, $value) | |
357 { | |
358 switch ($type) | |
359 { | |
360 case "d": return intval($value); | |
361 case "s": return $dbh->quote($value); | |
362 case "b": return intval($value) ? 1 : 0; | |
363 case "D": | |
364 if ($value instanceOf DateTime) | |
365 { | |
366 switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) | |
367 { | |
368 case "pgsql" : $fmt = "Y-m-d H:i:sP"; break; | |
369 case "sqlite" : $fmt = DATE_RFC3339; break; | |
370 case "mysql" : $fmt = "Y-m-d H:i:s"; break; | |
371 default : $fmt = DATE_RFC3339; | |
372 } | |
373 return $dbh->quote($value->format($fmt)); | |
374 } | |
375 else | |
376 return intval($value); | |
377 } | |
378 } | |
379 | |
380 | |
381 function mgSQLToDateTime($dbh, $stamp) | |
382 { | |
383 switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) | |
384 { | |
385 case "pgsql": | |
386 // PostgreSQL 'timestamptz' format | |
387 $tmp = DateTime::createFromFormat("Y-m-d H:i:sP", $stamp); | |
388 break; | |
389 | |
390 case "sqlite": | |
391 // SQLite can use RFC3339 format | |
392 $tmp = DateTime::createFromFormat(DATE_RFC3339, $stamp); | |
393 break; | |
394 | |
395 case "mysql": | |
396 // MySQL uses UTC internally, no way to specify TZ | |
397 $tmp = DateTime::createFromFormat("Y-m-d H:i:s", $stamp); | |
398 break; | |
399 | |
400 default: | |
401 $tmp = NULL; | |
402 } | |
403 | |
404 // echo "<p>".$stamp." :: ".var_export(($tmp instanceOf DateTime) ? $tmp : NULL, TRUE)."</p>"; | |
405 return ($tmp instanceOf DateTime) ? $tmp : NULL; | |
406 } | |
407 | |
408 | |
409 function mgConnectSQLDB() | |
410 { | |
411 global $db; | |
412 try { | |
413 $db = new PDO(mgGetSetting("sql_db"), | |
414 mgGetSetting("sql_username", NULL), | |
415 mgGetSetting("sql_password", NULL), | |
416 mgGetSetting("sql_options", array())); | |
417 } | |
418 catch (PDOException $e) { | |
419 mgError("Could not connect to SQL database: ".$e->getMessage()."."); | |
420 return FALSE; | |
421 } | |
422 return ($db !== false); | |
423 } | |
424 | |
425 | |
426 function mgDBPrepareSQLUpdate($dbh, $table, $cond, $pairs, $values = NULL) | |
427 { | |
428 $sql = []; | |
429 foreach ($pairs as $name => $attr) | |
430 { | |
431 $sql[] = $name."=".mgDBGetSQLParam($dbh, | |
432 $attr, $values !== NULL ? $values[$name] : $name); | |
433 } | |
434 return | |
435 "UPDATE ".$table." SET ".implode(",", $sql). | |
436 ($cond != "" ? " ".$cond : ""); | |
437 } | |
438 | |
439 | |
440 function mgDBPrepareSQL_V($dbh, $fmt, $argv) | |
441 { | |
442 $len = strlen($fmt); | |
443 $sql = ""; | |
444 $argn = 0; | |
445 $argc = count($argv); | |
446 | |
447 for ($pos = 0; $pos < $len; $pos++) | |
448 { | |
449 if ($fmt[$pos] == "%") | |
450 { | |
451 if ($argn < $argc) | |
452 $sql .= mgDBGetSQLParam($dbh, $fmt[++$pos], $argv[$argn++]); | |
453 else | |
454 { | |
455 mgError("Invalid SQL statement format string '".$fmt. | |
456 "', not enough parameters specified (".$argn." of ".$argc.")"); | |
457 return FALSE; | |
458 } | |
459 } | |
460 else | |
461 $sql .= $fmt[$pos]; | |
462 } | |
463 | |
464 return $sql; | |
465 } | |
466 | |
467 | |
468 function mgDBPrepareSQL($dbh) | |
469 { | |
470 $argv = func_get_args(); | |
471 return mgDBPrepareSQL_V($dbh, $argv[1], array_splice($argv, 2)); | |
472 } | |
473 | |
474 | |
475 function mgPrepareSQL() | |
476 { | |
477 global $db; | |
478 $argv = func_get_args(); | |
479 return mgDBPrepareSQL_V($db, $argv[0], array_splice($argv, 1)); | |
480 } | |
481 | |
482 | |
483 function mgDBExecSQLInsert($dbh, $sql) | |
484 { | |
485 switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME)) | |
486 { | |
487 case "pgsql": | |
488 if (($res = mgDBFetchSQLColumn($dbh, $sql." RETURNING id")) !== false) | |
489 return $res; | |
490 else | |
491 return FALSE; | |
492 | |
493 default: | |
494 if (mgDBExecSQL($dbh, $sql) !== false) | |
495 return $dbh->lastInsertId(); | |
496 else | |
497 return FALSE; | |
498 } | |
499 } | |
500 | |
501 | |
502 function mgDBExecSQL($dbh, $sql) | |
503 { | |
504 if (($res = $dbh->query($sql)) !== FALSE) | |
505 return $res; | |
506 else | |
507 { | |
508 mgLogSQLError($dbh, $sql); | |
509 return FALSE; | |
510 } | |
511 } | |
512 | |
513 | |
514 function mgDBFetchSQL($dbh, $sql) | |
515 { | |
516 if (($res = $dbh->query($sql)) !== FALSE) | |
517 return $res->fetch(); | |
518 else | |
519 { | |
520 mgLogSQLError($dbh, $sql); | |
521 return FALSE; | |
522 } | |
523 } | |
524 | |
525 | |
526 function mgDBFetchSQLColumn($dbh, $sql, $column = 0) | |
527 { | |
528 if (($res = $dbh->query($sql)) !== FALSE) | |
529 return $res->fetchColumn($column); | |
530 else | |
531 { | |
532 mgLogSQLError($dbh, $sql); | |
533 return FALSE; | |
534 } | |
535 } | |
536 | |
537 | |
538 function mgPrepareSQLUpdate($table, $cond, $pairs) | |
539 { | |
540 global $db; | |
541 return mgDBPrepareSQLUpdate($db, $table, $cond, $pairs); | |
542 } | |
543 | |
544 | |
545 function mgExecSQLInsert($sql) | |
546 { | |
547 global $db; | |
548 return mgDBExecSQLInsert($db, $sql); | |
549 } | |
550 | |
551 | |
552 function mgExecSQL($sql) | |
553 { | |
554 global $db; | |
555 return mgDBExecSQL($db, $sql); | |
556 } | |
557 | |
558 | |
559 function mgFetchSQL($sql) | |
560 { | |
561 global $db; | |
562 return mgDBFetchSQL($db, $sql); | |
563 } | |
564 | |
565 | |
566 function mgFetchSQLColumn($sql, $column = 0) | |
567 { | |
568 global $db; | |
569 return mgDBFetchSQLColumn($db, $sql, $column); | |
570 } | |
571 | |
572 | |
573 function mgDBBeginTransaction($dbh = FALSE) | |
574 { | |
575 global $db; | |
576 return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "BEGIN TRANSACTION"); | |
577 } | |
578 | |
579 | |
580 function mgDBCommitTransaction($dbh = FALSE) | |
581 { | |
582 global $db; | |
583 return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "COMMIT"); | |
584 } | |
585 | |
586 | |
587 function mgDBGetTableSchema($dbh, $schema) | |
588 { | |
589 $res = []; | |
590 $driver = $dbh->getAttribute(PDO::ATTR_DRIVER_NAME); | |
591 | |
592 // Go through the table schema, definition by definition | |
593 foreach ($schema as $scol) | |
594 { | |
595 $tmp = []; | |
596 | |
597 // And each element of the one definition | |
598 // (like 'foo INTEGER AUTOINCREMENT') | |
599 foreach ($scol as $elem) | |
600 switch ($driver) | |
601 { | |
602 case "pgsql": | |
603 switch ($elem) | |
604 { | |
605 case "AUTOINCREMENT": | |
606 // For Postgres, use SERIAL for autoincrement and | |
607 // "cleverly" replace the 2nd element with SERIAL | |
608 // assuming that it is INTEGER or such. | |
609 $tmp[1] = "SERIAL"; | |
610 break; | |
611 | |
612 case "DATETIME": | |
613 $tmp[] = "TIMESTAMPTZ"; | |
614 break; | |
615 | |
616 default: | |
617 $tmp[] = $elem; | |
618 break; | |
619 } | |
620 break; | |
621 | |
622 case "mysql": | |
623 switch ($elem) | |
624 { | |
625 case "AUTOINCREMENT": | |
626 $tmp[] = "AUTO_INCREMENT"; | |
627 break; | |
628 | |
629 case "DATETIME": | |
630 $tmp[] = "TIMESTAMP"; | |
631 break; | |
632 | |
633 default: | |
634 $tmp[] = $elem; | |
635 break; | |
636 } | |
637 break; | |
638 | |
639 case "sqlite": | |
640 $tmp[] = $elem; | |
641 break; | |
642 | |
643 default: | |
644 die("Don't know how to handle PDO driver '".$driver."' yet.\n"); | |
645 } | |
646 | |
647 $res[] = implode(" ", $tmp); | |
648 } | |
649 | |
650 return implode(", ", $res); | |
651 } | |
652 | |
653 | |
654 function mgDBCreateOneTable($dbh, $name, $schema) | |
655 { | |
656 return (mgDBExecSQL($dbh, "CREATE TABLE IF NOT EXISTS ".$name." (".$schema.")") !== FALSE) ? TRUE : FALSE; | |
657 } | |
658 | |
344 ?> | 659 ?> |