diff 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
line wrap: on
line diff
--- a/mgallery.inc.php	Sun Jul 28 07:50:54 2019 +0300
+++ b/mgallery.inc.php	Sun Jul 28 07:53:36 2019 +0300
@@ -97,6 +97,11 @@
   "med_height"       => [MG_INT, 640],
   "med_quality"      => [MG_INT, 90],
 
+  "backend"          => [MG_STR, "php"],
+  "sql_db"           => [MG_STR, NULL],
+  "sql_username"     => [MG_STR, ""],
+  "sql_password"     => [MG_STR, ""],
+  "sql_options"      => [MG_STR, []],
 ];
 
 
@@ -341,4 +346,314 @@
   }
 }
 
+
+function mgLogSQLError($dbh, $sql)
+{
+  return mgError("SQL error '".implode("; ", $dbh->errorInfo())."' in statement: \"".$sql."\"");
+}
+
+
+function mgDBGetSQLParam($dbh, $type, $value)
+{
+  switch ($type)
+  {
+    case "d": return intval($value);
+    case "s": return $dbh->quote($value);
+    case "b": return intval($value) ? 1 : 0;
+    case "D":
+      if ($value instanceOf DateTime)
+      {
+        switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME))
+        {
+          case "pgsql"   : $fmt = "Y-m-d H:i:sP"; break;
+          case "sqlite"  : $fmt = DATE_RFC3339; break;
+          case "mysql"   : $fmt = "Y-m-d H:i:s"; break;
+          default        : $fmt = DATE_RFC3339;
+        }
+        return $dbh->quote($value->format($fmt));
+      }
+      else
+        return intval($value);
+  }
+}
+
+
+function mgSQLToDateTime($dbh, $stamp)
+{
+  switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME))
+  {
+    case "pgsql":
+      // PostgreSQL 'timestamptz' format
+      $tmp =  DateTime::createFromFormat("Y-m-d H:i:sP", $stamp);
+      break;
+
+    case "sqlite":
+      // SQLite can use RFC3339 format
+      $tmp = DateTime::createFromFormat(DATE_RFC3339, $stamp);
+      break;
+
+    case "mysql":
+      // MySQL uses UTC internally, no way to specify TZ
+      $tmp = DateTime::createFromFormat("Y-m-d H:i:s", $stamp);
+      break;
+
+    default:
+      $tmp = NULL;
+  }
+
+  //  echo "<p>".$stamp." :: ".var_export(($tmp instanceOf DateTime) ? $tmp : NULL, TRUE)."</p>";
+  return ($tmp instanceOf DateTime) ? $tmp : NULL;
+}
+
+
+function mgConnectSQLDB()
+{
+  global $db;
+  try {
+    $db = new PDO(mgGetSetting("sql_db"),
+      mgGetSetting("sql_username", NULL),
+      mgGetSetting("sql_password", NULL),
+      mgGetSetting("sql_options", array()));
+  }
+  catch (PDOException $e) {
+    mgError("Could not connect to SQL database: ".$e->getMessage().".");
+    return FALSE;
+  }
+  return ($db !== false);
+}
+
+
+function mgDBPrepareSQLUpdate($dbh, $table, $cond, $pairs, $values = NULL)
+{
+  $sql = [];
+  foreach ($pairs as $name => $attr)
+  {
+    $sql[] = $name."=".mgDBGetSQLParam($dbh,
+      $attr, $values !== NULL ? $values[$name] : $name);
+  }
+  return
+    "UPDATE ".$table." SET ".implode(",", $sql).
+    ($cond != "" ? " ".$cond : "");
+}
+
+
+function mgDBPrepareSQL_V($dbh, $fmt, $argv)
+{
+  $len = strlen($fmt);
+  $sql = "";
+  $argn = 0;
+  $argc = count($argv);
+
+  for ($pos = 0; $pos < $len; $pos++)
+  {
+    if ($fmt[$pos] == "%")
+    {
+      if ($argn < $argc)
+        $sql .= mgDBGetSQLParam($dbh, $fmt[++$pos], $argv[$argn++]);
+      else
+      {
+        mgError("Invalid SQL statement format string '".$fmt.
+          "', not enough parameters specified (".$argn." of ".$argc.")");
+        return FALSE;
+      }
+    }
+    else
+      $sql .= $fmt[$pos];
+  }
+
+  return $sql;
+}
+
+
+function mgDBPrepareSQL($dbh)
+{
+  $argv = func_get_args();
+  return mgDBPrepareSQL_V($dbh, $argv[1], array_splice($argv, 2));
+}
+
+
+function mgPrepareSQL()
+{
+  global $db;
+  $argv = func_get_args();
+  return mgDBPrepareSQL_V($db, $argv[0], array_splice($argv, 1));
+}
+
+
+function mgDBExecSQLInsert($dbh, $sql)
+{
+  switch ($dbh->getAttribute(PDO::ATTR_DRIVER_NAME))
+  {
+    case "pgsql":
+      if (($res = mgDBFetchSQLColumn($dbh, $sql." RETURNING id")) !== false)
+        return $res;
+      else
+        return FALSE;
+
+    default:
+      if (mgDBExecSQL($dbh, $sql) !== false)
+        return $dbh->lastInsertId();
+      else
+        return FALSE;
+  }
+}
+
+
+function mgDBExecSQL($dbh, $sql)
+{
+  if (($res = $dbh->query($sql)) !== FALSE)
+    return $res;
+  else
+  {
+    mgLogSQLError($dbh, $sql);
+    return FALSE;
+  }
+}
+
+
+function mgDBFetchSQL($dbh, $sql)
+{
+  if (($res = $dbh->query($sql)) !== FALSE)
+    return $res->fetch();
+  else
+  {
+    mgLogSQLError($dbh, $sql);
+    return FALSE;
+  }
+}
+
+
+function mgDBFetchSQLColumn($dbh, $sql, $column = 0)
+{
+  if (($res = $dbh->query($sql)) !== FALSE)
+    return $res->fetchColumn($column);
+  else
+  {
+    mgLogSQLError($dbh, $sql);
+    return FALSE;
+  }
+}
+
+
+function mgPrepareSQLUpdate($table, $cond, $pairs)
+{
+  global $db;
+  return mgDBPrepareSQLUpdate($db, $table, $cond, $pairs);
+}
+
+
+function mgExecSQLInsert($sql)
+{
+  global $db;
+  return mgDBExecSQLInsert($db, $sql);
+}
+
+
+function mgExecSQL($sql)
+{
+  global $db;
+  return mgDBExecSQL($db, $sql);
+}
+
+
+function mgFetchSQL($sql)
+{
+  global $db;
+  return mgDBFetchSQL($db, $sql);
+}
+
+
+function mgFetchSQLColumn($sql, $column = 0)
+{
+  global $db;
+  return mgDBFetchSQLColumn($db, $sql, $column);
+}
+
+
+function mgDBBeginTransaction($dbh = FALSE)
+{
+  global $db;
+  return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "BEGIN TRANSACTION");
+}
+
+
+function mgDBCommitTransaction($dbh = FALSE)
+{
+  global $db;
+  return mgDBExecSQL(($dbh !== FALSE) ? $dbh : $db, "COMMIT");
+}
+
+
+function mgDBGetTableSchema($dbh, $schema)
+{
+  $res = [];
+  $driver = $dbh->getAttribute(PDO::ATTR_DRIVER_NAME);
+
+  // Go through the table schema, definition by definition
+  foreach ($schema as $scol)
+  {
+    $tmp = [];
+
+    // And each element of the one definition
+    // (like 'foo INTEGER AUTOINCREMENT')
+    foreach ($scol as $elem)
+    switch ($driver)
+    {
+      case "pgsql":
+        switch ($elem)
+        {
+          case "AUTOINCREMENT":
+            // For Postgres, use SERIAL for autoincrement and
+            // "cleverly" replace the 2nd element with SERIAL
+            // assuming that it is INTEGER or such.
+            $tmp[1] = "SERIAL";
+            break;
+
+          case "DATETIME":
+            $tmp[] = "TIMESTAMPTZ";
+            break;
+
+          default:
+            $tmp[] = $elem;
+            break;
+        }
+        break;
+
+      case "mysql":
+        switch ($elem)
+        {
+          case "AUTOINCREMENT":
+            $tmp[] = "AUTO_INCREMENT";
+            break;
+
+          case "DATETIME":
+            $tmp[] = "TIMESTAMP";
+            break;
+
+          default:
+            $tmp[] = $elem;
+            break;
+        }
+        break;
+
+      case "sqlite":
+        $tmp[] = $elem;
+        break;
+
+      default:
+        die("Don't know how to handle PDO driver '".$driver."' yet.\n");
+    }
+
+    $res[] = implode(" ", $tmp);
+  }
+
+  return implode(", ", $res);
+}
+
+
+function mgDBCreateOneTable($dbh, $name, $schema)
+{
+  return (mgDBExecSQL($dbh, "CREATE TABLE IF NOT EXISTS ".$name." (".$schema.")") !== FALSE) ? TRUE : FALSE;
+}
+
 ?>
\ No newline at end of file