aboutsummaryrefslogtreecommitdiffstats
path: root/util/storageconv
blob: 992c906b893beee78bab8bef6665cabdd8ff3f07 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/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 AND imgscale = 0");
			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 resource_id, content FROM photo WHERE photo_usage = 0 AND os_storage = 1 AND imgscale = 0");

			if($x) {
				foreach($x as $xx) {
					
					$n = q("SELECT id, imgscale, content FROM photo WHERE resource_id = '%s' AND os_storage != %d AND imgscale > 0",
						dbesc($xx['resource_id']),
						$storage
					);

					$img_path = dbunescbin($xx['content']);
					
					foreach($n as $nn) {
						
						echo '.';
						
						$filename = $img_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 resource_id FROM photo WHERE photo_usage = 0 AND os_storage = 1 AND imgscale = 0");
			
			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;
}