0012532: Tinebase CLI - function to force sync token resync for given container
authorPaul Mehrer <p.mehrer@metaways.de>
Mon, 16 Jan 2017 09:42:41 +0000 (10:42 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 18 Jan 2017 14:40:01 +0000 (15:40 +0100)
add cli interface to force a WebDAV sync token resync
for given container ids

Change-Id: I701edc0f1a8d8b330a7ae7f9fbeb93afc62bf541
Reviewed-on: http://gerrit.tine20.com/customers/4092
Tested-by: Philipp Schüle <p.schuele@metaways.de>
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Tinebase/Frontend/Cli.php

index cf61013..cf10f2b 100644 (file)
@@ -33,6 +33,47 @@ class Tinebase_Frontend_Cli extends Tinebase_Frontend_Cli_Abstract
     protected $_applicationsToWorkOn = array();
 
     /**
+     * forces containers that support sync token to resync via WebDAV sync tokens
+     *
+     * this will cause 2 BadRequest responses to sync token requests
+     * the first one as soon as the client notices that something changed and sends a sync token request
+     * eventually the client receives a false sync token (as we increased content sequence, but we dont have a content history entry)
+     * eventually not (if something really changed in the calendar in the meantime)
+     *
+     * in case the client got a fake sync token, the clients next sync token request (once something really changed) will fail again
+     * after something really changed valid sync tokens will be handed out again
+     *
+     * @param Zend_Console_Getopt $_opts
+     */
+    public function forceSyncTokenResync($_opts)
+    {
+        $args = $this->_parseArgs($_opts, array());
+
+        if (isset($args['containerIds'])) {
+            $resultStr = '';
+
+            if (!is_array($args['containerIds'])) {
+                $args['containerIds'] = array($args['containerIds']);
+            }
+
+            $db = Tinebase_Core::getDb();
+
+            $container = Tinebase_Container::getInstance();
+            $contentBackend = $container->getContentBackend();
+            foreach($args['containerIds'] as $id) {
+                $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction($db);
+
+                $container->increaseContentSequence($id);
+                $resultStr = ($resultStr!==''?', ':'') . $id . '(' . $contentBackend->deleteByProperty($id, 'container_id') . ')';
+
+                Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
+            }
+
+            echo "\nDeleted containers(num content history records): " . $resultStr . "\n";
+        }
+    }
+
+    /**
      * clean timemachine_modlog for records that have been pruned (not deleted!)
      */
     public function cleanModlog()