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 ?>