diff mgtool.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 878d2a772fd6
children 13a23b120e72
line wrap: on
line diff
--- a/mgtool.php	Sun Jul 28 07:50:54 2019 +0300
+++ b/mgtool.php	Sun Jul 28 07:53:36 2019 +0300
@@ -55,6 +55,34 @@
 ];
 
 
+//
+// SQL table schemas
+//
+$galSQLTables =
+[
+  "images" => [
+    ["id"          , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
+    ["path_id"     , "INTEGER"],
+    ["filename"    , "VARCHAR(64)"],
+  ],
+
+  "paths" => [
+    ["id"          , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
+    ["path"        , "VARCHAR(128)"],
+  ],
+
+  "metadata" => [
+    ["id"          , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
+    ["field"       , "VARCHAR(64)"],
+    ["data"        , "VARCHAR(64)", "UNIQUE"],
+    ["status"      , "INTEGER"],
+  ],
+
+  "images_meta" => [
+    ["image_id"    , "INTEGER"],
+    ["meta_id"     , "INTEGER"],
+  ],
+];
 
 
 //
@@ -647,6 +675,8 @@
 
 function mgWriteGalleryCache($cacheFilename, &$gallery, &$entries, &$parentEntry)
 {
+  global $galBackend, $db, $galExifConversions, $flagSQL;
+
   // Store gallery cache for this directory
   $images = [];
   $albums = [];
@@ -697,6 +727,93 @@
     }
   }
 
+  switch ($galBackend)
+  {
+    case "sql":
+      if (!$flagSQL)
+        break;
+
+      mgDBBeginTransaction();
+
+      if (($path_id = mgFetchSQLColumn(mgPrepareSQL("SELECT id FROM paths WHERE path=%s", $gallery["path"]))) === FALSE &&
+          ($path_id = mgExecSQLInsert(mgPrepareSQL("INSERT INTO paths (path) VALUES (%s)", $gallery["path"]))) === FALSE)
+        mgFatal("Failed.\n");
+
+
+
+      foreach ($output as $entry => &$edata)
+      if ($edata["type"] == 0)
+      {
+        $ekeys = ["path_id", "filename"];
+        $evals = [$path_id, mgDBGetSQLParam($db, "s", $entry)];
+        $esets = [];
+
+        foreach ($galExifConversions as $econv)
+        if ($econv[GEC_IS_UNIQUE])
+        {
+          $ekey = $econv[GEC_NAME];
+
+          // Skip unset and special case(s)
+          if (!isset($esets[$ekey]) && isset($edata[$ekey]))
+          {
+            $esets[$ekey] = TRUE;
+
+            switch ($econv[GEC_TYPE])
+            {
+              case MG_DATE: $etype = "D"; break;
+              case MG_INT:  $etype = "d"; break;
+              default:      $etype = "s"; break;
+            }
+
+            $ekeys[] = $ekey;
+            $evals[] = mgDBGetSQLParam($db, $etype, $edata[$ekey]);
+          }
+        }
+
+        $sql = "INSERT INTO images (".implode(",", $ekeys).") VALUES (".implode(",", $evals).")";
+        if (($image_id = mgExecSQLInsert($sql)) === FALSE)
+          mgFatal("Failed.\n");
+
+        // Special handling for non-unique fields
+        foreach ($galExifConversions as $econv)
+        {
+          $ekey = $econv[GEC_NAME];
+          if (!$econv[GEC_IS_UNIQUE] &&
+              array_key_exists($econv[GEC_NAME], $edata))
+          {
+            if (is_array($edata[$ekey]))
+            {
+              foreach ($edata[$ekey] as $kw)
+              {
+                $sql = mgPrepareSQL("INSERT INTO metadata (field,data,status) VALUES (%s,%s,0) ON CONFLICT(data) DO UPDATE SET status=1", $ekey, $kw);
+                if (($id = mgExecSQLInsert($sql)) === FALSE)
+                  mgFatal("Failure!\n");
+
+                $sql = mgPrepareSQL("INSERT INTO images_meta (image_id,meta_id) VALUES (%d,%d)", $image_id, $id);
+                if (($id = mgExecSQL($sql)) === FALSE)
+                  mgFatal("Failure!\n");
+              }
+            }
+            else
+            {
+              $sql = mgPrepareSQL("INSERT INTO metadata (field,data,status) VALUES (%s,%s,0) ON CONFLICT(data) DO UPDATE SET status=1", $ekey, $edata[$ekey]);
+              if (($id = mgExecSQLInsert($sql)) === FALSE)
+                mgFatal("Failure!\n");
+
+                $sql = mgPrepareSQL("INSERT INTO images_meta (image_id,meta_id) VALUES (%d,%d)", $image_id, $id);
+              if (($id = mgExecSQL($sql)) === FALSE)
+                mgFatal("Failure!\n");
+            }
+
+          }
+        }
+      }
+
+      mgDBCommitTransaction();
+      break;
+
+  }
+
   $str =
     "<?php\n".
     "\$galData = ".var_export($gallery, TRUE).";\n".
@@ -987,7 +1104,7 @@
 
 function mgProcessGalleries($cmd, $path)
 {
-  global $galTNPath, $galMedPath;
+  global $galTNPath, $galMedPath, $galSQLTables, $flagSQL;
 
   // Check validity of some settings
   $galPath = mgGetSetting("base_path");
@@ -1040,6 +1157,16 @@
 
   // Start working
   echo "Gallery path: '".$galPath."', starting at '".$path."' ...\n";
+
+  if (($cmd == GCMD_CLEAN || $cmd == GCMD_RESCAN) && $flagSQL)
+  {
+    foreach ($galSQLTables as $tname => $tdata)
+    {
+      if (mgExecSQL("DELETE FROM ".$tname) === FALSE)
+        mgFatal("Failed to purge table '".$tname."'.\n");
+    }
+  }
+
   mgHandleDirectory($cmd, $galPath, $path, $parentData, $parentEntry, $writeMode, $startAt);
 }
 
@@ -1126,6 +1253,53 @@
 if (($pageTimeZone = mgGetSetting("timezone")) !== NULL)
   date_default_timezone_set($pageTimeZone);
 
+// Check backend
+if (($galBackend = mgGetSetting("backend")) === null)
+  die("MGallery backend mode not set.\n");
+
+switch ($galBackend = strtolower($galBackend))
+{
+  case "sql":
+    // Connect to database
+    if (mgConnectSQLDB() === FALSE)
+      die("Could not open database connection.\n");
+
+    // Create SQL schema elements for metadata fields
+    $tmpSQL = [];
+    foreach ($galExifConversions as $econv)
+    if ($econv[GEC_IS_UNIQUE])
+    {
+      switch ($econv[GEC_TYPE])
+      {
+        case MG_STR: $etype = "VARCHAR(256)"; break;
+        case MG_INT: $etype = "INTEGER"; break;
+        case MG_DVA: $etype = "VARCHAR(32)"; break;
+        case MG_DATE: $etype = "DATETIME"; break;
+      }
+
+      $tmpSQL[$econv[GEC_NAME]] = $etype;
+    }
+
+    // Merge to base "images" table schema
+    foreach ($tmpSQL as $ekey => $etype)
+      $galSQLTables["images"][] = [$ekey, $etype];
+
+    // Check tables
+    foreach ($galSQLTables as $name => $schemaData)
+    {
+      $schema = mgDBGetTableSchema($db, $schemaData);
+      if (!mgDBCreateOneTable($db, $name, $schema))
+        die("Failed to create SQL table '".$name."'.\n");
+    }
+    break;
+
+  case "php":
+    break;
+
+  default:
+    die("Invalid MGallery backend mode '".$galBackend."'.\n");
+}
+
 
 // Check for commandline arguments
 $cmd = mgCArgLC(1);
@@ -1149,7 +1323,16 @@
     break;
 
   case "update": case "up": case "upd": case "upda":
-    mgProcessGalleries(GCMD_UPDATE, mgCArg(2));
+    $farg = mgCArg(2);
+    if ($farg == "--sql")
+    {
+      $farg = FALSE;
+      $flagSQL = TRUE;
+    }
+    else
+      $flagSQL = mgCArg(3) == "--sql";
+
+    mgProcessGalleries(GCMD_UPDATE, $farg);
     break;
 
   case "rescan": case "re": case "res":