comparison 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
comparison
equal deleted inserted replaced
289:13cff35dfbec 290:19fbf800b1f7
53 [ MG_INT, "filesize" , "FileSize" , TRUE ], 53 [ MG_INT, "filesize" , "FileSize" , TRUE ],
54 [ MG_STR, "keywords" , "keywords" , FALSE ], 54 [ MG_STR, "keywords" , "keywords" , FALSE ],
55 ]; 55 ];
56 56
57 57
58 //
59 // SQL table schemas
60 //
61 $galSQLTables =
62 [
63 "images" => [
64 ["id" , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
65 ["path_id" , "INTEGER"],
66 ["filename" , "VARCHAR(64)"],
67 ],
68
69 "paths" => [
70 ["id" , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
71 ["path" , "VARCHAR(128)"],
72 ],
73
74 "metadata" => [
75 ["id" , "INTEGER", "PRIMARY KEY", "AUTOINCREMENT"],
76 ["field" , "VARCHAR(64)"],
77 ["data" , "VARCHAR(64)", "UNIQUE"],
78 ["status" , "INTEGER"],
79 ],
80
81 "images_meta" => [
82 ["image_id" , "INTEGER"],
83 ["meta_id" , "INTEGER"],
84 ],
85 ];
58 86
59 87
60 // 88 //
61 // Convert and scale image file function, for generating 89 // Convert and scale image file function, for generating
62 // the intermediate size images and thumbnails. Uses the 90 // the intermediate size images and thumbnails. Uses the
645 } 673 }
646 674
647 675
648 function mgWriteGalleryCache($cacheFilename, &$gallery, &$entries, &$parentEntry) 676 function mgWriteGalleryCache($cacheFilename, &$gallery, &$entries, &$parentEntry)
649 { 677 {
678 global $galBackend, $db, $galExifConversions, $flagSQL;
679
650 // Store gallery cache for this directory 680 // Store gallery cache for this directory
651 $images = []; 681 $images = [];
652 $albums = []; 682 $albums = [];
653 $output = []; 683 $output = [];
654 684
693 { 723 {
694 $parentEntry["image"] = &$adata; 724 $parentEntry["image"] = &$adata;
695 break; 725 break;
696 } 726 }
697 } 727 }
728 }
729
730 switch ($galBackend)
731 {
732 case "sql":
733 if (!$flagSQL)
734 break;
735
736 mgDBBeginTransaction();
737
738 if (($path_id = mgFetchSQLColumn(mgPrepareSQL("SELECT id FROM paths WHERE path=%s", $gallery["path"]))) === FALSE &&
739 ($path_id = mgExecSQLInsert(mgPrepareSQL("INSERT INTO paths (path) VALUES (%s)", $gallery["path"]))) === FALSE)
740 mgFatal("Failed.\n");
741
742
743
744 foreach ($output as $entry => &$edata)
745 if ($edata["type"] == 0)
746 {
747 $ekeys = ["path_id", "filename"];
748 $evals = [$path_id, mgDBGetSQLParam($db, "s", $entry)];
749 $esets = [];
750
751 foreach ($galExifConversions as $econv)
752 if ($econv[GEC_IS_UNIQUE])
753 {
754 $ekey = $econv[GEC_NAME];
755
756 // Skip unset and special case(s)
757 if (!isset($esets[$ekey]) && isset($edata[$ekey]))
758 {
759 $esets[$ekey] = TRUE;
760
761 switch ($econv[GEC_TYPE])
762 {
763 case MG_DATE: $etype = "D"; break;
764 case MG_INT: $etype = "d"; break;
765 default: $etype = "s"; break;
766 }
767
768 $ekeys[] = $ekey;
769 $evals[] = mgDBGetSQLParam($db, $etype, $edata[$ekey]);
770 }
771 }
772
773 $sql = "INSERT INTO images (".implode(",", $ekeys).") VALUES (".implode(",", $evals).")";
774 if (($image_id = mgExecSQLInsert($sql)) === FALSE)
775 mgFatal("Failed.\n");
776
777 // Special handling for non-unique fields
778 foreach ($galExifConversions as $econv)
779 {
780 $ekey = $econv[GEC_NAME];
781 if (!$econv[GEC_IS_UNIQUE] &&
782 array_key_exists($econv[GEC_NAME], $edata))
783 {
784 if (is_array($edata[$ekey]))
785 {
786 foreach ($edata[$ekey] as $kw)
787 {
788 $sql = mgPrepareSQL("INSERT INTO metadata (field,data,status) VALUES (%s,%s,0) ON CONFLICT(data) DO UPDATE SET status=1", $ekey, $kw);
789 if (($id = mgExecSQLInsert($sql)) === FALSE)
790 mgFatal("Failure!\n");
791
792 $sql = mgPrepareSQL("INSERT INTO images_meta (image_id,meta_id) VALUES (%d,%d)", $image_id, $id);
793 if (($id = mgExecSQL($sql)) === FALSE)
794 mgFatal("Failure!\n");
795 }
796 }
797 else
798 {
799 $sql = mgPrepareSQL("INSERT INTO metadata (field,data,status) VALUES (%s,%s,0) ON CONFLICT(data) DO UPDATE SET status=1", $ekey, $edata[$ekey]);
800 if (($id = mgExecSQLInsert($sql)) === FALSE)
801 mgFatal("Failure!\n");
802
803 $sql = mgPrepareSQL("INSERT INTO images_meta (image_id,meta_id) VALUES (%d,%d)", $image_id, $id);
804 if (($id = mgExecSQL($sql)) === FALSE)
805 mgFatal("Failure!\n");
806 }
807
808 }
809 }
810 }
811
812 mgDBCommitTransaction();
813 break;
814
698 } 815 }
699 816
700 $str = 817 $str =
701 "<?php\n". 818 "<?php\n".
702 "\$galData = ".var_export($gallery, TRUE).";\n". 819 "\$galData = ".var_export($gallery, TRUE).";\n".
985 } 1102 }
986 1103
987 1104
988 function mgProcessGalleries($cmd, $path) 1105 function mgProcessGalleries($cmd, $path)
989 { 1106 {
990 global $galTNPath, $galMedPath; 1107 global $galTNPath, $galMedPath, $galSQLTables, $flagSQL;
991 1108
992 // Check validity of some settings 1109 // Check validity of some settings
993 $galPath = mgGetSetting("base_path"); 1110 $galPath = mgGetSetting("base_path");
994 $galTNPath = mgCleanPath(TRUE, mgGetSetting("tn_path")); 1111 $galTNPath = mgCleanPath(TRUE, mgGetSetting("tn_path"));
995 $galMedPath = mgCleanPath(TRUE, mgGetSetting("med_path")); 1112 $galMedPath = mgCleanPath(TRUE, mgGetSetting("med_path"));
1038 else 1155 else
1039 $path = $galPath; 1156 $path = $galPath;
1040 1157
1041 // Start working 1158 // Start working
1042 echo "Gallery path: '".$galPath."', starting at '".$path."' ...\n"; 1159 echo "Gallery path: '".$galPath."', starting at '".$path."' ...\n";
1160
1161 if (($cmd == GCMD_CLEAN || $cmd == GCMD_RESCAN) && $flagSQL)
1162 {
1163 foreach ($galSQLTables as $tname => $tdata)
1164 {
1165 if (mgExecSQL("DELETE FROM ".$tname) === FALSE)
1166 mgFatal("Failed to purge table '".$tname."'.\n");
1167 }
1168 }
1169
1043 mgHandleDirectory($cmd, $galPath, $path, $parentData, $parentEntry, $writeMode, $startAt); 1170 mgHandleDirectory($cmd, $galPath, $path, $parentData, $parentEntry, $writeMode, $startAt);
1044 } 1171 }
1045 1172
1046 1173
1047 function mgShowCopyright() 1174 function mgShowCopyright()
1124 1251
1125 // Configure the timezone 1252 // Configure the timezone
1126 if (($pageTimeZone = mgGetSetting("timezone")) !== NULL) 1253 if (($pageTimeZone = mgGetSetting("timezone")) !== NULL)
1127 date_default_timezone_set($pageTimeZone); 1254 date_default_timezone_set($pageTimeZone);
1128 1255
1256 // Check backend
1257 if (($galBackend = mgGetSetting("backend")) === null)
1258 die("MGallery backend mode not set.\n");
1259
1260 switch ($galBackend = strtolower($galBackend))
1261 {
1262 case "sql":
1263 // Connect to database
1264 if (mgConnectSQLDB() === FALSE)
1265 die("Could not open database connection.\n");
1266
1267 // Create SQL schema elements for metadata fields
1268 $tmpSQL = [];
1269 foreach ($galExifConversions as $econv)
1270 if ($econv[GEC_IS_UNIQUE])
1271 {
1272 switch ($econv[GEC_TYPE])
1273 {
1274 case MG_STR: $etype = "VARCHAR(256)"; break;
1275 case MG_INT: $etype = "INTEGER"; break;
1276 case MG_DVA: $etype = "VARCHAR(32)"; break;
1277 case MG_DATE: $etype = "DATETIME"; break;
1278 }
1279
1280 $tmpSQL[$econv[GEC_NAME]] = $etype;
1281 }
1282
1283 // Merge to base "images" table schema
1284 foreach ($tmpSQL as $ekey => $etype)
1285 $galSQLTables["images"][] = [$ekey, $etype];
1286
1287 // Check tables
1288 foreach ($galSQLTables as $name => $schemaData)
1289 {
1290 $schema = mgDBGetTableSchema($db, $schemaData);
1291 if (!mgDBCreateOneTable($db, $name, $schema))
1292 die("Failed to create SQL table '".$name."'.\n");
1293 }
1294 break;
1295
1296 case "php":
1297 break;
1298
1299 default:
1300 die("Invalid MGallery backend mode '".$galBackend."'.\n");
1301 }
1302
1129 1303
1130 // Check for commandline arguments 1304 // Check for commandline arguments
1131 $cmd = mgCArgLC(1); 1305 $cmd = mgCArgLC(1);
1132 switch ($cmd) 1306 switch ($cmd)
1133 { 1307 {
1147 mgShowCopyright(); 1321 mgShowCopyright();
1148 mgShowHelp(); 1322 mgShowHelp();
1149 break; 1323 break;
1150 1324
1151 case "update": case "up": case "upd": case "upda": 1325 case "update": case "up": case "upd": case "upda":
1152 mgProcessGalleries(GCMD_UPDATE, mgCArg(2)); 1326 $farg = mgCArg(2);
1327 if ($farg == "--sql")
1328 {
1329 $farg = FALSE;
1330 $flagSQL = TRUE;
1331 }
1332 else
1333 $flagSQL = mgCArg(3) == "--sql";
1334
1335 mgProcessGalleries(GCMD_UPDATE, $farg);
1153 break; 1336 break;
1154 1337
1155 case "rescan": case "re": case "res": 1338 case "rescan": case "re": case "res":
1156 mgProcessGalleries(GCMD_RESCAN, mgCArg(2)); 1339 mgProcessGalleries(GCMD_RESCAN, mgCArg(2));
1157 break; 1340 break;