| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							|  |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Upgrade database schema and data to latest software and check DB integrity | 
					
						
							|  |  |  |  * Usage: php upgrade.php [options] | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |  * @package   GNUsocial | 
					
						
							|  |  |  |  * @author    Bhuvan Krishna <bhuvan@swecha.net> | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @author    Mikael Nordfeldth <mmn@hethane.se> | 
					
						
							|  |  |  |  * @copyright 2010-2019 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | define('INSTALLDIR', dirname(__DIR__)); | 
					
						
							| 
									
										
										
										
											2019-07-15 04:10:29 +01:00
										 |  |  | define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  | $shortoptions = 'dfx::'; | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | $longoptions = ['debug', 'files', 'extensions=']; | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | $helptext = <<<END_OF_UPGRADE_HELP | 
					
						
							|  |  |  | php upgrade.php [options] | 
					
						
							|  |  |  | Upgrade database schema and data to latest software | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | END_OF_UPGRADE_HELP; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR.'/scripts/commandline.inc'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if (!defined('DEBUG')) { | 
					
						
							|  |  |  |     define('DEBUG', (bool)have_option('d', 'debug')); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | function main() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     // "files" option enables possibly disk/resource intensive operations
 | 
					
						
							|  |  |  |     // that aren't really _required_ for the upgrade
 | 
					
						
							|  |  |  |     $iterate_files = (bool)have_option('f', 'files'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |     if (Event::handle('StartUpgrade')) { | 
					
						
							| 
									
										
										
										
											2014-11-27 18:56:57 +01:00
										 |  |  |         fixupConversationURIs(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         updateSchemaCore(); | 
					
						
							|  |  |  |         updateSchemaPlugins(); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         // These replace old "fixup_*" scripts
 | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         fixupNoticeConversation(); | 
					
						
							|  |  |  |         initConversation(); | 
					
						
							|  |  |  |         fixupGroupURI(); | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |         if ($iterate_files) { | 
					
						
							|  |  |  |             printfnq("Running file iterations:\n"); | 
					
						
							|  |  |  |             printfnq("* "); fixupFileGeometry(); | 
					
						
							|  |  |  |             printfnq("* "); deleteLocalFileThumbnailsWithoutFilename(); | 
					
						
							|  |  |  |             printfnq("* "); deleteMissingLocalFileThumbnails(); | 
					
						
							|  |  |  |             printfnq("* "); fixupFileThumbnailUrlhash(); | 
					
						
							|  |  |  |             printfnq("* "); setFilehashOnLocalFiles(); | 
					
						
							|  |  |  |             printfnq("DONE.\n"); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             printfnq("Skipping intensive/long-running file iteration functions (enable with -f, should be done at least once!)\n"); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-09-12 12:13:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 11:12:50 +02:00
										 |  |  |         initGroupProfileId(); | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         initLocalGroup(); | 
					
						
							|  |  |  |         initNoticeReshare(); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         initSubscriptionURI(); | 
					
						
							|  |  |  |         initGroupMemberURI(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 11:16:14 -04:00
										 |  |  |         initProfileLists(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-28 19:03:24 +01:00
										 |  |  |         migrateProfilePrefs(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-15 17:05:32 -04:00
										 |  |  |         Event::handle('EndUpgrade'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function tableDefs() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     $schema = []; | 
					
						
							|  |  |  |     require INSTALLDIR . '/db/core.php'; | 
					
						
							|  |  |  |     return $schema; | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function updateSchemaCore() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |     printfnq("Upgrading core schema..."); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     $schema = Schema::get(); | 
					
						
							|  |  |  |     $schemaUpdater = new SchemaUpdater($schema); | 
					
						
							|  |  |  |     foreach (tableDefs() as $table => $def) { | 
					
						
							|  |  |  |         $schemaUpdater->register($table, $def); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $schemaUpdater->checkSchema(); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function updateSchemaPlugins() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |     printfnq("Upgrading plugin schema..."); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 02:02:37 +02:00
										 |  |  |     Event::handle('BeforePluginCheckSchema'); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  |     Event::handle('CheckSchema'); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  | function fixupNoticeConversation() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all notices have a conversation ID..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $notice = new Notice(); | 
					
						
							|  |  |  |     $notice->whereAdd('conversation is null'); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:57:30 +01:00
										 |  |  |     $notice->whereAdd('conversation = 0', 'OR'); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |     $notice->orderBy('id'); // try to get originals before replies
 | 
					
						
							|  |  |  |     $notice->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ($notice->fetch()) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             $cid = null; | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |             $orig = clone($notice); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:57:30 +01:00
										 |  |  |             if (!empty($notice->reply_to)) { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |                 $reply = Notice::getKV('id', $notice->reply_to); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 14:57:30 +01:00
										 |  |  |                 if ($reply instanceof Notice && !empty($reply->conversation)) { | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |                     $notice->conversation = $reply->conversation; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 unset($reply); | 
					
						
							| 
									
										
										
										
											2016-01-06 14:57:30 +01:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // if still empty
 | 
					
						
							|  |  |  |             if (empty($notice->conversation)) { | 
					
						
							|  |  |  |                 $child = new Notice(); | 
					
						
							|  |  |  |                 $child->reply_to = $notice->getID(); | 
					
						
							|  |  |  |                 $child->limit(1); | 
					
						
							|  |  |  |                 if ($child->find(true) && !empty($child->conversation)) { | 
					
						
							|  |  |  |                     $notice->conversation = $child->conversation; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 unset($child); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // if _still_ empty we just create our own conversation
 | 
					
						
							|  |  |  |             if (empty($notice->conversation)) { | 
					
						
							|  |  |  |                 $notice->conversation = $notice->getID(); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $result = $notice->update($orig); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             unset($orig); | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							| 
									
										
										
										
											2016-01-06 14:57:30 +01:00
										 |  |  |             print("Error setting conversation: " . $e->getMessage()); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:09:05 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:14:21 -04:00
										 |  |  | function fixupGroupURI() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all groups have an URI..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $group = new User_group(); | 
					
						
							|  |  |  |     $group->whereAdd('uri IS NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($group->find()) { | 
					
						
							|  |  |  |         while ($group->fetch()) { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |             $orig = User_group::getKV('id', $group->id); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:14:21 -04:00
										 |  |  |             $group->uri = $group->getUri(); | 
					
						
							|  |  |  |             $group->update($orig); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  | function initConversation() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     if (common_config('fix', 'upgrade_initConversation') <= 1) { | 
					
						
							|  |  |  |         printfnq(sprintf("Skipping %s, fixed by previous upgrade.\n", __METHOD__)); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  |     printfnq("Ensuring all conversations have a row in conversation table..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $notice = new Notice(); | 
					
						
							| 
									
										
										
										
											2016-03-29 14:36:27 +02:00
										 |  |  |     $notice->selectAdd(); | 
					
						
							|  |  |  |     $notice->selectAdd('DISTINCT conversation'); | 
					
						
							|  |  |  |     $notice->joinAdd(['conversation', 'conversation:id'], 'LEFT');  // LEFT to get the null values for conversation.id
 | 
					
						
							|  |  |  |     $notice->whereAdd('conversation.id IS NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($notice->find()) { | 
					
						
							|  |  |  |         printfnq(" fixing {$notice->N} missing conversation entries..."); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     while ($notice->fetch()) { | 
					
						
							|  |  |  |         $id = $notice->conversation; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |         $uri = common_local_url('conversation', ['id' => $id]); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // @fixme db_dataobject won't save our value for an autoincrement
 | 
					
						
							|  |  |  |         // so we're bypassing the insert wrappers
 | 
					
						
							|  |  |  |         $conv = new Conversation(); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |         $sql = "INSERT INTO conversation (id,uri,created) VALUES (%d,'%s','%s')"; | 
					
						
							|  |  |  |         $sql = sprintf( | 
					
						
							|  |  |  |             $sql, | 
					
						
							|  |  |  |             $id, | 
					
						
							|  |  |  |             $conv->escape($uri), | 
					
						
							|  |  |  |             $conv->escape(common_sql_now()) | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  |         $conv->query($sql); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     // This is something we should only have to do once unless introducing new, bad code.
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     if (DEBUG) { | 
					
						
							|  |  |  |         printfnq(sprintf('Storing in config that we have done %s', __METHOD__)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     common_config_set('fix', 'upgrade_initConversation', 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 16:23:49 -04:00
										 |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-27 18:56:57 +01:00
										 |  |  | function fixupConversationURIs() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all conversations have a URI..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $conv = new Conversation(); | 
					
						
							|  |  |  |     $conv->whereAdd('uri IS NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($conv->find()) { | 
					
						
							|  |  |  |         $rounds = 0; | 
					
						
							|  |  |  |         while ($conv->fetch()) { | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             $uri = common_local_url('conversation', ['id' => $conv->id]); | 
					
						
							|  |  |  |             $sql = sprintf( | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |                 'UPDATE conversation SET uri = \'%1$s\' WHERE id = %2$d;', | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 $conv->escape($uri), | 
					
						
							|  |  |  |                 $conv->id | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2014-11-27 18:56:57 +01:00
										 |  |  |             $conv->query($sql); | 
					
						
							|  |  |  |             if (($conv->N-++$rounds) % 500 == 0) { | 
					
						
							|  |  |  |                 printfnq(sprintf(' %d items left...', $conv->N-$rounds)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 11:12:50 +02:00
										 |  |  | function initGroupProfileId() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all User_group entries have a Profile and profile_id..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $group = new User_group(); | 
					
						
							|  |  |  |     $group->whereAdd('NOT EXISTS (SELECT id FROM profile WHERE id = user_group.profile_id)'); | 
					
						
							|  |  |  |     $group->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ($group->fetch()) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             // We must create a new, incrementally assigned profile_id
 | 
					
						
							|  |  |  |             $profile = new Profile(); | 
					
						
							|  |  |  |             $profile->nickname   = $group->nickname; | 
					
						
							|  |  |  |             $profile->fullname   = $group->fullname; | 
					
						
							|  |  |  |             $profile->profileurl = $group->mainpage; | 
					
						
							|  |  |  |             $profile->homepage   = $group->homepage; | 
					
						
							|  |  |  |             $profile->bio        = $group->description; | 
					
						
							|  |  |  |             $profile->location   = $group->location; | 
					
						
							|  |  |  |             $profile->created    = $group->created; | 
					
						
							|  |  |  |             $profile->modified   = $group->modified; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $profile->query('BEGIN'); | 
					
						
							|  |  |  |             $id = $profile->insert(); | 
					
						
							|  |  |  |             if (empty($id)) { | 
					
						
							|  |  |  |                 $profile->query('ROLLBACK'); | 
					
						
							|  |  |  |                 throw new Exception('Profile insertion failed, profileurl: '.$profile->profileurl); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $group->query("UPDATE user_group SET profile_id={$id} WHERE id={$group->id}"); | 
					
						
							|  |  |  |             $profile->query('COMMIT'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $profile->free(); | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             printfv("Error initializing Profile for group {$group->nickname}:" . $e->getMessage()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 18:27:20 -04:00
										 |  |  | function initLocalGroup() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all local user groups have a local_group..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $group = new User_group(); | 
					
						
							|  |  |  |     $group->whereAdd('NOT EXISTS (select group_id from local_group where group_id = user_group.id)'); | 
					
						
							|  |  |  |     $group->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ($group->fetch()) { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             // Hack to check for local groups
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             if ($group->getUri() == common_local_url('groupbyid', ['id' => $group->id])) { | 
					
						
							| 
									
										
										
										
											2011-09-07 18:27:20 -04:00
										 |  |  |                 $lg = new Local_group(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $lg->group_id = $group->id; | 
					
						
							|  |  |  |                 $lg->nickname = $group->nickname; | 
					
						
							|  |  |  |                 $lg->created  = $group->created; // XXX: common_sql_now() ?
 | 
					
						
							|  |  |  |                 $lg->modified = $group->modified; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $lg->insert(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             printfv("Error initializing local group for {$group->nickname}:" . $e->getMessage()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 18:34:31 -04:00
										 |  |  | function initNoticeReshare() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     if (common_config('fix', 'upgrade_initNoticeReshare') <= 1) { | 
					
						
							|  |  |  |         printfnq(sprintf("Skipping %s, fixed by previous upgrade.\n", __METHOD__)); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 18:34:31 -04:00
										 |  |  |     printfnq("Ensuring all reshares have the correct verb and object-type..."); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 18:34:31 -04:00
										 |  |  |     $notice = new Notice(); | 
					
						
							|  |  |  |     $notice->whereAdd('repeat_of is not null'); | 
					
						
							|  |  |  |     $notice->whereAdd('(verb != "'.ActivityVerb::SHARE.'" OR object_type != "'.ActivityObject::ACTIVITY.'")'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($notice->find()) { | 
					
						
							|  |  |  |         while ($notice->fetch()) { | 
					
						
							|  |  |  |             try { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |                 $orig = Notice::getKV('id', $notice->id); | 
					
						
							| 
									
										
										
										
											2011-09-07 18:34:31 -04:00
										 |  |  |                 $notice->verb = ActivityVerb::SHARE; | 
					
						
							|  |  |  |                 $notice->object_type = ActivityObject::ACTIVITY; | 
					
						
							|  |  |  |                 $notice->update($orig); | 
					
						
							|  |  |  |             } catch (Exception $e) { | 
					
						
							|  |  |  |                 printfv("Error updating verb and object_type for {$notice->id}:" . $e->getMessage()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     // This is something we should only have to do once unless introducing new, bad code.
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     if (DEBUG) { | 
					
						
							|  |  |  |         printfnq(sprintf('Storing in config that we have done %s', __METHOD__)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  |     common_config_set('fix', 'upgrade_initNoticeReshare', 1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 18:34:31 -04:00
										 |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-12 12:13:04 -04:00
										 |  |  | function initSubscriptionURI() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all subscriptions have a URI..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $sub = new Subscription(); | 
					
						
							|  |  |  |     $sub->whereAdd('uri IS NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($sub->find()) { | 
					
						
							|  |  |  |         while ($sub->fetch()) { | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $sub->decache(); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 $sub->query(sprintf( | 
					
						
							|  |  |  |                     'UPDATE subscription '. | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |                     "SET uri = '%s' " . | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                     'WHERE subscriber = %d '. | 
					
						
							|  |  |  |                       'AND subscribed = %d', | 
					
						
							|  |  |  |                     $sub->escape(Subscription::newUri($sub->getSubscriber(), $sub->getSubscribed(), $sub->created)), | 
					
						
							|  |  |  |                     $sub->subscriber, | 
					
						
							|  |  |  |                     $sub->subscribed | 
					
						
							|  |  |  |                 )); | 
					
						
							| 
									
										
										
										
											2011-09-12 12:13:04 -04:00
										 |  |  |             } catch (Exception $e) { | 
					
						
							|  |  |  |                 common_log(LOG_ERR, "Error updated subscription URI: " . $e->getMessage()); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function initGroupMemberURI() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all group memberships have a URI..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $mem = new Group_member(); | 
					
						
							|  |  |  |     $mem->whereAdd('uri IS NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($mem->find()) { | 
					
						
							|  |  |  |         while ($mem->fetch()) { | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $mem->decache(); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 $mem->query(sprintf( | 
					
						
							|  |  |  |                     'UPDATE group_member '. | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |                     "SET uri = '%s' " . | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                     'WHERE profile_id = %d ' . | 
					
						
							|  |  |  |                       'AND group_id = %d', | 
					
						
							|  |  |  |                     Group_member::newUri(Profile::getByID($mem->profile_id), User_group::getByID($mem->group_id), $mem->created), | 
					
						
							|  |  |  |                     $mem->profile_id, | 
					
						
							|  |  |  |                     $mem->group_id | 
					
						
							|  |  |  |                 )); | 
					
						
							| 
									
										
										
										
											2011-09-12 12:13:04 -04:00
										 |  |  |             } catch (Exception $e) { | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 common_log(LOG_ERR, "Error updated membership URI: " . $e->getMessage()); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-09-12 12:13:04 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 11:16:14 -04:00
										 |  |  | function initProfileLists() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring all profile tags have a corresponding list..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $ptag = new Profile_tag(); | 
					
						
							|  |  |  |     $ptag->selectAdd(); | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     $ptag->selectAdd('tagger, tag, COUNT(*) AS tagged_count'); | 
					
						
							|  |  |  |     $ptag->whereAdd('NOT EXISTS (SELECT tagger, tagged FROM profile_list '. | 
					
						
							|  |  |  |                     'WHERE profile_tag.tagger = profile_list.tagger '. | 
					
						
							|  |  |  |                     'AND profile_tag.tag = profile_list.tag)'); | 
					
						
							| 
									
										
										
										
											2011-09-27 11:16:14 -04:00
										 |  |  |     $ptag->groupBy('tagger, tag'); | 
					
						
							|  |  |  |     $ptag->orderBy('tagger, tag'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($ptag->find()) { | 
					
						
							|  |  |  |         while ($ptag->fetch()) { | 
					
						
							|  |  |  |             $plist = new Profile_list(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $plist->tagger   = $ptag->tagger; | 
					
						
							|  |  |  |             $plist->tag      = $ptag->tag; | 
					
						
							|  |  |  |             $plist->private  = 0; | 
					
						
							|  |  |  |             $plist->created  = common_sql_now(); | 
					
						
							|  |  |  |             $plist->modified = $plist->created; | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             $plist->mainpage = common_local_url( | 
					
						
							|  |  |  |                 'showprofiletag', | 
					
						
							|  |  |  |                 ['tagger' => $plist->getTagger()->nickname, | 
					
						
							|  |  |  |                  'tag'    => $plist->tag] | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             ; | 
					
						
							| 
									
										
										
										
											2011-09-27 11:16:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $plist->tagged_count     = $ptag->tagged_count; | 
					
						
							|  |  |  |             $plist->subscriber_count = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $plist->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $orig = clone($plist); | 
					
						
							|  |  |  |             // After insert since it uses auto-generated ID
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             $plist->uri = common_local_url( | 
					
						
							|  |  |  |                 'profiletagbyid', | 
					
						
							|  |  |  |                 ['id'        => $plist->id, | 
					
						
							|  |  |  |                  'tagger_id' => $plist->tagger] | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2011-09-27 11:16:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $plist->update($orig); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-21 20:39:28 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Added as we now store interpretd width and height in File table. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function fixupFileGeometry() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Ensuring width and height is set for supported local File objects..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $file = new File(); | 
					
						
							|  |  |  |     $file->whereAdd('filename IS NOT NULL');    // local files
 | 
					
						
							|  |  |  |     $file->whereAdd('width IS NULL OR width = 0'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($file->find()) { | 
					
						
							|  |  |  |         while ($file->fetch()) { | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             if (DEBUG) { | 
					
						
							|  |  |  |                 printfnq(sprintf('Found file without width: %s\n', _ve($file->getFilename()))); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-07-10 19:39:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-22 12:09:24 +02:00
										 |  |  |             // Set file geometrical properties if available
 | 
					
						
							| 
									
										
										
										
											2014-04-21 20:39:28 +02:00
										 |  |  |             try { | 
					
						
							| 
									
										
										
										
											2014-04-22 12:09:24 +02:00
										 |  |  |                 $image = ImageFile::fromFileObject($file); | 
					
						
							|  |  |  |             } catch (ServerException $e) { | 
					
						
							|  |  |  |                 // We couldn't make out an image from the file.
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 if (DEBUG) { | 
					
						
							|  |  |  |                     printfnq(sprintf('Could not make an image out of the file.\n')); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2014-04-21 20:39:28 +02:00
										 |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $orig = clone($file); | 
					
						
							|  |  |  |             $file->width = $image->width; | 
					
						
							|  |  |  |             $file->height = $image->height; | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |             if (DEBUG) { | 
					
						
							|  |  |  |                 printfnq(sprintf('Setting image file and with to %sx%s.\n', $file->width, $file->height)); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-04-21 20:39:28 +02:00
										 |  |  |             $file->update($orig); | 
					
						
							| 
									
										
										
										
											2014-04-22 12:09:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // FIXME: Do this more automagically inside ImageFile or so.
 | 
					
						
							|  |  |  |             if ($image->getPath() != $file->getPath()) { | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |                 if (DEBUG) { | 
					
						
							|  |  |  |                     printfnq(sprintf('Deleting the temporarily stored ImageFile.\n')); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2014-04-22 12:09:24 +02:00
										 |  |  |                 $image->unlink(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             unset($image); | 
					
						
							| 
									
										
										
										
											2014-04-21 20:39:28 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-12 14:33:41 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |  * File_thumbnail objects for local Files store their own filenames in the database. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function deleteLocalFileThumbnailsWithoutFilename() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Removing all local File_thumbnail entries without filename property..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $file = new File(); | 
					
						
							|  |  |  |     $file->whereAdd('filename IS NOT NULL');    // local files
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($file->find()) { | 
					
						
							|  |  |  |         // Looping through local File entries
 | 
					
						
							|  |  |  |         while ($file->fetch()) { | 
					
						
							|  |  |  |             $thumbs = new File_thumbnail(); | 
					
						
							|  |  |  |             $thumbs->file_id = $file->id; | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |             $thumbs->whereAdd("filename IS NULL OR filename = ''"); | 
					
						
							| 
									
										
										
										
											2014-05-12 14:33:41 +02:00
										 |  |  |             // Checking if there were any File_thumbnail entries without filename
 | 
					
						
							|  |  |  |             if (!$thumbs->find()) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             // deleting incomplete entry to allow regeneration
 | 
					
						
							|  |  |  |             while ($thumbs->fetch()) { | 
					
						
							|  |  |  |                 $thumbs->delete(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Delete File_thumbnail entries where the referenced file does not exist. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function deleteMissingLocalFileThumbnails() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Removing all local File_thumbnail entries without existing files..."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $thumbs = new File_thumbnail(); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     $thumbs->whereAdd("filename IS NOT NULL AND filename != ''"); | 
					
						
							| 
									
										
										
										
											2014-05-12 14:33:41 +02:00
										 |  |  |     // Checking if there were any File_thumbnail entries without filename
 | 
					
						
							|  |  |  |     if ($thumbs->find()) { | 
					
						
							|  |  |  |         while ($thumbs->fetch()) { | 
					
						
							| 
									
										
										
										
											2015-02-24 21:11:25 +01:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $thumbs->getPath(); | 
					
						
							|  |  |  |             } catch (FileNotFoundException $e) { | 
					
						
							| 
									
										
										
										
											2014-05-12 14:33:41 +02:00
										 |  |  |                 $thumbs->delete(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-24 21:11:25 +01:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Files are now stored with their hash, so let's generate for previously uploaded files. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function setFilehashOnLocalFiles() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq('Ensuring all local files have the filehash field set...'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $file = new File(); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     $file->whereAdd("filename IS NOT NULL AND filename != ''"); // local files
 | 
					
						
							| 
									
										
										
										
											2015-02-24 21:11:25 +01:00
										 |  |  |     $file->whereAdd('filehash IS NULL', 'AND');     // without filehash value
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ($file->find()) { | 
					
						
							|  |  |  |         while ($file->fetch()) { | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $orig = clone($file); | 
					
						
							|  |  |  |                 $file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath()); | 
					
						
							|  |  |  |                 $file->update($orig); | 
					
						
							|  |  |  |             } catch (FileNotFoundException $e) { | 
					
						
							| 
									
										
										
										
											2015-04-16 00:22:09 +02:00
										 |  |  |                 echo "\n    WARNING: file ID {$file->id} does not exist on path '{$e->path}'. If there is no file system error, run: php scripts/clean_file_table.php"; | 
					
						
							| 
									
										
										
										
											2015-02-24 21:11:25 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 04:15:41 +01:00
										 |  |  | function fixupFileThumbnailUrlhash() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Setting urlhash for File_thumbnail entries: "); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $thumb = new File_thumbnail(); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     $thumb->query(sprintf( | 
					
						
							|  |  |  |         'UPDATE %1$s ' . | 
					
						
							|  |  |  |         'SET urlhash = sha2(url, 256) ' . | 
					
						
							|  |  |  |         'WHERE url IS NOT NULL ' . // find all entries with a url value
 | 
					
						
							|  |  |  |         "AND url <> '' " .         // precaution against non-null empty strings
 | 
					
						
							|  |  |  |         'AND urlhash IS NULL',     // but don't touch those we've already calculated
 | 
					
						
							|  |  |  |         $thumb->escapedTableName() | 
					
						
							|  |  |  |     )); | 
					
						
							| 
									
										
										
										
											2016-02-10 04:15:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-28 19:03:24 +01:00
										 |  |  | function migrateProfilePrefs() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     printfnq("Finding and possibly migrating Profile_prefs entries: "); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     $prefs = [];   // ['qvitter' => ['cover_photo'=>'profile_banner_url', ...], ...]
 | 
					
						
							|  |  |  |     Event::handle('GetProfilePrefsMigrations', [&$prefs]); | 
					
						
							| 
									
										
										
										
											2016-01-28 19:03:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-01 23:05:07 +01:00
										 |  |  |     foreach ($prefs as $namespace=>$mods) { | 
					
						
							| 
									
										
										
										
											2016-01-28 19:03:24 +01:00
										 |  |  |         echo "$namespace... "; | 
					
						
							|  |  |  |         assert(is_array($mods)); | 
					
						
							|  |  |  |         $p = new Profile_prefs(); | 
					
						
							|  |  |  |         $p->namespace = $namespace; | 
					
						
							|  |  |  |         // find all entries in all modified topics given in this namespace
 | 
					
						
							|  |  |  |         $p->whereAddIn('topic', array_keys($mods), $p->columnType('topic')); | 
					
						
							|  |  |  |         $p->find(); | 
					
						
							|  |  |  |         while ($p->fetch()) { | 
					
						
							|  |  |  |             // for each entry, update 'topic' to the new key value
 | 
					
						
							|  |  |  |             $orig = clone($p); | 
					
						
							|  |  |  |             $p->topic = $mods[$p->topic]; | 
					
						
							|  |  |  |             $p->updateWithKeys($orig); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printfnq("DONE.\n"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-07 12:10:26 -04:00
										 |  |  | main(); |