]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - scripts/upgrade.php
Merge branch 'master' into 'master'
[quix0rs-gnu-social.git] / scripts / upgrade.php
old mode 100644 (file)
new mode 100755 (executable)
index c221a49..d5178e1
@@ -41,13 +41,14 @@ function main()
 
         // These replace old "fixup_*" scripts
 
-        fixupNoticeRendered();
         fixupNoticeConversation();
         initConversation();
         fixupGroupURI();
         fixupFileGeometry();
         deleteLocalFileThumbnailsWithoutFilename();
         deleteMissingLocalFileThumbnails();
+        fixupFileThumbnailUrlhash();
+        setFilehashOnLocalFiles();
 
         initGroupProfileId();
         initLocalGroup();
@@ -58,6 +59,8 @@ function main()
 
         initProfileLists();
 
+        migrateProfilePrefs();
+
         Event::handle('EndUpgrade');
     }
 }
@@ -87,35 +90,19 @@ function updateSchemaPlugins()
 {
     printfnq("Upgrading plugin schema...");
 
+    Event::handle('BeforePluginCheckSchema');
     Event::handle('CheckSchema');
 
     printfnq("DONE.\n");
 }
 
-function fixupNoticeRendered()
-{
-    printfnq("Ensuring all notices have rendered HTML...");
-
-    $notice = new Notice();
-
-    $notice->whereAdd('rendered IS NULL');
-    $notice->find();
-
-    while ($notice->fetch()) {
-        $original = clone($notice);
-        $notice->rendered = common_render_content($notice->content, $notice);
-        $notice->update($original);
-    }
-
-    printfnq("DONE.\n");
-}
-
 function fixupNoticeConversation()
 {
     printfnq("Ensuring all notices have a conversation ID...");
 
     $notice = new Notice();
     $notice->whereAdd('conversation is null');
+    $notice->whereAdd('conversation = 0', 'OR');
     $notice->orderBy('id'); // try to get originals before replies
     $notice->find();
 
@@ -125,29 +112,36 @@ function fixupNoticeConversation()
     
             $orig = clone($notice);
     
-            if (empty($notice->reply_to)) {
-                $notice->conversation = $notice->id;
-            } else {
+            if (!empty($notice->reply_to)) {
                 $reply = Notice::getKV('id', $notice->reply_to);
 
-                if (empty($reply)) {
-                    $notice->conversation = $notice->id;
-                } else if (empty($reply->conversation)) {
-                    $notice->conversation = $notice->id;
-                } else {
+                if ($reply instanceof Notice && !empty($reply->conversation)) {
                     $notice->conversation = $reply->conversation;
                 }
-       
                 unset($reply);
-                $reply = null;
+            }
+
+            // 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();
             }
 
             $result = $notice->update($orig);
 
-            $orig = null;
             unset($orig);
         } catch (Exception $e) {
-            printv("Error setting conversation: " . $e->getMessage());
+            print("Error setting conversation: " . $e->getMessage());
         }
     }
 
@@ -331,7 +325,7 @@ function initSubscriptionURI()
                                     'set uri = "%s" '.
                                     'where subscriber = %d '.
                                     'and subscribed = %d',
-                                    Subscription::newURI($sub->subscriber, $sub->subscribed, $sub->created),
+                                    $sub->escape(Subscription::newUri($sub->getSubscriber(), $sub->getSubscribed(), $sub->created)),
                                     $sub->subscriber,
                                     $sub->subscribed));
             } catch (Exception $e) {
@@ -357,7 +351,7 @@ function initGroupMemberURI()
                 $mem->query(sprintf('update group_member set uri = "%s" '.
                                     'where profile_id = %d ' . 
                                     'and group_id = %d ',
-                                    Group_member::newURI($mem->profile_id, $mem->group_id, $mem->created),
+                                    Group_member::newUri(Profile::getByID($mem->profile_id), User_group::getByID($mem->group_id), $mem->created),
                                     $mem->profile_id,
                                     $mem->group_id));
             } catch (Exception $e) {
@@ -490,7 +484,9 @@ function deleteMissingLocalFileThumbnails()
     // Checking if there were any File_thumbnail entries without filename
     if ($thumbs->find()) {
         while ($thumbs->fetch()) {
-            if (!file_exists(File_thumbnail::path($thumbs->filename))) {
+            try {
+                $thumbs->getPath();
+            } catch (FileNotFoundException $e) {
                 $thumbs->delete();
             }
         }
@@ -499,4 +495,69 @@ function deleteMissingLocalFileThumbnails()
     printfnq("DONE.\n");
 }
 
+/*
+ * 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();
+    $file->whereAdd('filename IS NOT NULL');        // local files
+    $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) {
+                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";
+            }
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+function fixupFileThumbnailUrlhash()
+{
+    printfnq("Setting urlhash for File_thumbnail entries: ");
+
+    $thumb = new File_thumbnail();
+    $thumb->query('UPDATE '.$thumb->escapedTableName().' SET urlhash=SHA2(url, 256) WHERE'.
+                    ' url IS NOT NULL AND'. // find all entries with a url value
+                    ' url != "" AND'.       // precaution against non-null empty strings
+                    ' urlhash IS NULL');    // but don't touch those we've already calculated
+
+    printfnq("DONE.\n");
+}
+
+function migrateProfilePrefs()
+{
+    printfnq("Finding and possibly migrating Profile_prefs entries: ");
+
+    $prefs = array();   // ['qvitter' => ['cover_photo'=>'profile_banner_url', ...], ...]
+    Event::handle('GetProfilePrefsMigrations', array(&$prefs));
+
+    foreach($prefs as $namespace=>$mods) {
+        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");
+}
+
 main();