]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - scripts/upgrade.php
initialize fave, sub, and membership URIs
[quix0rs-gnu-social.git] / scripts / upgrade.php
old mode 100755 (executable)
new mode 100644 (file)
index 2c34ae0..2b11673
@@ -38,7 +38,18 @@ function main()
 
     // These replace old "fixup_*" scripts
 
-    fixupNoticesRendered();
+    fixupNoticeRendered();
+    fixupNoticeConversation();
+    initConversation();
+    initInbox();
+    fixupGroupURI();
+
+    initLocalGroup();
+    initNoticeReshare();
+    
+    initFaveURI();
+    initSubscriptionURI();
+    initGroupMemberURI();
 }
 
 function tableDefs()
@@ -50,7 +61,7 @@ function tableDefs()
 
 function updateSchemaCore()
 {
-    printfnq("Upgrading core schema");
+    printfnq("Upgrading core schema...");
 
     $schema = Schema::get();
     $schemaUpdater = new SchemaUpdater($schema);
@@ -58,18 +69,22 @@ function updateSchemaCore()
         $schemaUpdater->register($table, $def);
     }
     $schemaUpdater->checkSchema();
+
+    printfnq("DONE.\n");
 }
 
 function updateSchemaPlugins()
 {
-    printfnq("Upgrading plugin schema");
+    printfnq("Upgrading plugin schema...");
 
     Event::handle('CheckSchema');
+
+    printfnq("DONE.\n");
 }
 
-function fixupNoticesRendered()
+function fixupNoticeRendered()
 {
-    printfnq("Ensuring all notices have rendered HTML");
+    printfnq("Ensuring all notices have rendered HTML...");
 
     $notice = new Notice();
 
@@ -81,6 +96,276 @@ function fixupNoticesRendered()
         $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->orderBy('id'); // try to get originals before replies
+    $notice->find();
+
+    while ($notice->fetch()) {
+        try {
+            $cid = null;
+    
+            $orig = clone($notice);
+    
+            if (empty($notice->reply_to)) {
+                $notice->conversation = $notice->id;
+            } else {
+                $reply = Notice::staticGet('id', $notice->reply_to);
+
+                if (empty($reply)) {
+                    $notice->conversation = $notice->id;
+                } else if (empty($reply->conversation)) {
+                    $notice->conversation = $notice->id;
+                } else {
+                    $notice->conversation = $reply->conversation;
+                }
+       
+                unset($reply);
+                $reply = null;
+            }
+
+            $result = $notice->update($orig);
+
+            $orig = null;
+            unset($orig);
+        } catch (Exception $e) {
+            printv("Error setting conversation: " . $e->getMessage());
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+function fixupGroupURI()
+{
+    printfnq("Ensuring all groups have an URI...");
+
+    $group = new User_group();
+    $group->whereAdd('uri IS NULL');
+
+    if ($group->find()) {
+        while ($group->fetch()) {
+            $orig = User_group::staticGet('id', $group->id);
+            $group->uri = $group->getUri();
+            $group->update($orig);
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+function initConversation()
+{
+    printfnq("Ensuring all conversations have a row in conversation table...");
+
+    $notice = new Notice();
+    $notice->query('select distinct notice.conversation from notice '.
+                   'where notice.conversation is not null '.
+                   'and not exists (select conversation.id from conversation where id = notice.conversation)');
+
+    while ($notice->fetch()) {
+
+        $id = $notice->conversation;
+
+        $uri = common_local_url('conversation', array('id' => $id));
+
+        // @fixme db_dataobject won't save our value for an autoincrement
+        // so we're bypassing the insert wrappers
+        $conv = new Conversation();
+        $sql = "insert into conversation (id,uri,created) values(%d,'%s','%s')";
+        $sql = sprintf($sql,
+                       $id,
+                       $conv->escape($uri),
+                       $conv->escape(common_sql_now()));
+        $conv->query($sql);
+    }
+
+    printfnq("DONE.\n");
+}
+
+function initInbox()
+{
+    printfnq("Ensuring all users have an inbox...");
+
+    $user = new User();
+    $user->whereAdd('not exists (select user_id from inbox where user_id = user.id)');
+    $user->orderBy('id');
+
+    if ($user->find()) {
+
+        while ($user->fetch()) {
+
+            try {
+                $notice = new Notice();
+
+                $notice->selectAdd();
+                $notice->selectAdd('id');
+                $notice->joinAdd(array('profile_id', 'subscription:subscribed'));
+                $notice->whereAdd('subscription.subscriber = ' . $user->id);
+                $notice->whereAdd('notice.created >= subscription.created');
+
+                $ids = array();
+
+                if ($notice->find()) {
+                    while ($notice->fetch()) {
+                        $ids[] = $notice->id;
+                    }
+                }
+
+                $notice = null;
+
+                $inbox = new Inbox();
+                $inbox->user_id = $user->id;
+                $inbox->pack($ids);
+                $inbox->insert();
+            } catch (Exception $e) {
+                printv("Error initializing inbox: " . $e->getMessage());
+            }
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+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
+            if ($group->getUri() == common_local_url('groupbyid', array('id' => $group->id))) {
+                $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");
+}
+
+function initNoticeReshare()
+{
+    printfnq("Ensuring all reshares have the correct verb and object-type...");
+    
+    $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 {
+                $orig = Notice::staticGet('id', $notice->id);
+                $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());
+            }
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+function initFaveURI() 
+{
+    printfnq("Ensuring all faves have a URI...");
+
+    $fave = new Fave();
+    $fave->whereAdd('uri IS NULL');
+
+    if ($fave->find()) {
+        while ($fave->fetch()) {
+            try {
+                $fave->decache();
+                $fave->query(sprintf('update fave '.
+                                     'set uri = "%s" '.
+                                     'where user_id = %d '.
+                                     'and notice_id = %d',
+                                     Fave::newURI($fave->user_id, $fave->notice_id, $fave->modified),
+                                     $fave->user_id,
+                                     $fave->notice_id));
+            } catch (Exception $e) {
+                common_log(LOG_ERR, "Error updated fave URI: " . $e->getMessage());
+            }
+        }
+    }
+
+    printfnq("DONE.\n");
+}
+
+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();
+                $sub->query(sprintf('update subscription '.
+                                    'set uri = "%s" '.
+                                    'where subscriber = %d '.
+                                    'and subscribed = %d',
+                                    Subscription::newURI($sub->subscriber, $sub->subscribed, $sub->created),
+                                    $sub->subscriber,
+                                    $sub->subscribed));
+            } 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();
+                $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),
+                                    $mem->profile_id,
+                                    $mem->group_id));
+            } catch (Exception $e) {
+                common_log(LOG_ERR, "Error updated membership URI: " . $e->getMessage());  
+          }
+        }
+    }
+
+    printfnq("DONE.\n");
 }
 
 main();