aboutsummaryrefslogblamecommitdiffstats
path: root/util/storageconv
blob: 594ec14fb64a3f901f884bc0e6ab10b994dd4ce1 (plain) (tree)








































































































































                                                                                                                                                                                                                 
#!/usr/bin/env php
<?php

// Hubzilla thumbnails storage convertor
function usage() {
	echo <<< EOT
Hubzilla thumbnails storage convertor

Usage:
	util/storageconv stats  # show current stats
	util/storageconv fs     # move thumbnails from SQL to filesystem
	util/storageconv db     # move thumbnails from filesystem to SQL

EOT;
}

require_once('include/cli_startup.php');

cli_startup();

if($argc == 1) {
	usage();
	killme();
}

if($argc == 2) {
	
	$storage = (intval(get_config('system','filesystem_storage_thumbnails', 0)) > 0 ? 1 : 0);
	echo 'Current storage set to: ' . ($storage ? 'filesystem' : 'SQL database') . PHP_EOL;
	switch($argv[1]) {
		case 'stats':
			$x = q("SELECT COUNT(resource_id) AS qty FROM photo WHERE photo_usage = 0 and os_storage = 1");
			echo 'Local images: ' . $x[0]['qty'] . PHP_EOL;
			$x = q("SELECT COUNT(id) AS qty FROM photo WHERE resource_id IN (SELECT DISTINCT resource_id FROM photo WHERE photo_usage = 0 and os_storage = 1) AND imgscale > 0");
			echo 'Thumbnails total: ' . $x[0]['qty'] . PHP_EOL;
			$x = q("SELECT COUNT(id) AS qty FROM photo WHERE resource_id IN (SELECT DISTINCT resource_id FROM photo WHERE photo_usage = 0 and os_storage = 1) AND os_storage != %d AND imgscale > 0",
				$storage
			);
			echo 'Thumbnails to convert: ' . $x[0]['qty'] . PHP_EOL;
			break;
			
		case 'fs':
			if($storage == 0) {
				echo 'Please set system.filesystem_storage_thumbnails to 1 before move thumbnails to filesystem storage' . PHP_EOL;
				break;
			}

			$x = q("SELECT DISTINCT uid, resource_id FROM photo WHERE photo_usage = 0 and os_storage = 1");
			
			if($x) {
				foreach($x as $xx) {
					
					$r = q("SELECT channel_address FROM channel WHERE channel_id = %d",
						intval($xx['uid'])
					);
					
					$n = q("SELECT id, imgscale, content, os_path FROM photo WHERE resource_id = '%s' AND os_storage != %d AND imgscale > 0",
						dbesc($xx['resource_id']),
						$storage
					);
					
					echo count($n) . PHP_EOL;
					foreach($n as $nn) {
						
						echo '.';
						
						$filename = 'store/' . $r[0]['channel_address'] . '/' . $nn['os_path'] . '-' . $nn['imgscale'];
						if(! file_put_contents($filename, dbunescbin($nn['content']))) {
							echo 'Failed to save file ' . $filename . PHP_EOL;
							continue;
						}
					
						$z = q("UPDATE photo SET content = '%s', os_storage = 1 WHERE id = %d",
							dbescbin($filename),
							intval($nn['id'])
						);
						if(! $z) {
							@unlink($filename);
							echo 'Failed to update metadata for saved file ' . $filename . PHP_EOL;
						}

					}
				}
			}
			break;
			
		case 'db':
			if($storage == 1) {
				echo 'Please set system.filesystem_storage_thumbnails to 0 before move thumbnails to SQL database storage' . PHP_EOL;
				break;
			}

			$x = q("SELECT DISTINCT resource_id FROM photo WHERE photo_usage = 0 and os_storage = 1");
			
			if($x) {
				foreach($x as $xx) {

					$n = q("SELECT id, content FROM photo WHERE resource_id = '%s' AND os_storage != %d AND imgscale > 0",
						dbesc($xx['resource_id']),
						$storage
					);
				
					foreach($n as $nn) {
						
						echo '.';
						
						$filename = dbunescbin($nn['content']);
						$content = file_get_contents($filename);
						if($content) {
						
							$z = q("UPDATE photo SET content = '%s', os_storage = 0 WHERE id = %d",
								dbescbin($content),
								intval($nn['id'])
							);
							if(! $z) {
								echo 'Failed to update stored file metadata ' . $filename . PHP_EOL;
								continue;
							}
					
							@unlink($filename);
						}
						else
							echo 'Can not read file contents ' . $filename . PHP_EOL;
					}
				}
			}
			break;
			
		default:
			usage();
			return;

	}
	
	echo PHP_EOL;
}