Mercurial > hg > mgallery
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":