1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/z-push_ynh.git synced 2024-09-03 18:05:58 +02:00
z-push_ynh/sources/lib/core/hierarchycache.php
2014-12-17 15:40:48 +00:00

216 lines
No EOL
6.7 KiB
PHP

<?php
/***********************************************
* File : hierarchycache.php
* Project : Z-Push
* Descr : HierarchyCache implementation
*
* Created : 18.08.2011
*
* Copyright 2007 - 2013 Zarafa Deutschland GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation with the following additional
* term according to sec. 7:
*
* According to sec. 7 of the GNU Affero General Public License, version 3,
* the terms of the AGPL are supplemented with the following terms:
*
* "Zarafa" is a registered trademark of Zarafa B.V.
* "Z-Push" is a registered trademark of Zarafa Deutschland GmbH
* The licensing of the Program under the AGPL does not imply a trademark license.
* Therefore any rights, title and interest in our trademarks remain entirely with us.
*
* However, if you propagate an unmodified version of the Program you are
* allowed to use the term "Z-Push" to indicate that you distribute the Program.
* Furthermore you may use our trademarks where it is necessary to indicate
* the intended purpose of a product or service provided you use it in accordance
* with honest practices in industrial or commercial matters.
* If you want to propagate modified versions of the Program under the name "Z-Push",
* you may only do so if you have a written permission by Zarafa Deutschland GmbH
* (to acquire a permission please contact Zarafa at trademark@zarafa.com).
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* Consult LICENSE file for details
************************************************/
class HierarchyCache {
private $changed = false;
protected $cacheById;
private $cacheByIdOld;
/**
* Constructor of the HierarchyCache
*
* @access public
* @return
*/
public function HierarchyCache() {
$this->cacheById = array();
$this->cacheByIdOld = $this->cacheById;
$this->changed = true;
}
/**
* Indicates if the cache was changed
*
* @access public
* @return boolean
*/
public function IsStateChanged() {
return $this->changed;
}
/**
* Copy current CacheById to memory
*
* @access public
* @return boolean
*/
public function CopyOldState() {
$this->cacheByIdOld = $this->cacheById;
return true;
}
/**
* Returns the SyncFolder object for a folder id
* If $oldstate is set, then the data from the previous state is returned
*
* @param string $serverid
* @param boolean $oldstate (optional) by default false
*
* @access public
* @return SyncObject/boolean false if not found
*/
public function GetFolder($serverid, $oldState = false) {
if (!$oldState && array_key_exists($serverid, $this->cacheById)) {
return $this->cacheById[$serverid];
}
else if ($oldState && array_key_exists($serverid, $this->cacheByIdOld)) {
return $this->cacheByIdOld[$serverid];
}
return false;
}
/**
* Adds a folder to the HierarchyCache
*
* @param SyncObject $folder
*
* @access public
* @return boolean
*/
public function AddFolder($folder) {
ZLog::Write(LOGLEVEL_DEBUG, "HierarchyCache: AddFolder() serverid: {$folder->serverid} displayname: {$folder->displayname}");
// on update the $folder does most of the times not contain a type
// we copy the value in this case to the new $folder object
if (isset($this->cacheById[$folder->serverid]) && (!isset($folder->type) || $folder->type == false) && isset($this->cacheById[$folder->serverid]->type)) {
$folder->type = $this->cacheById[$folder->serverid]->type;
ZLog::Write(LOGLEVEL_DEBUG, sprintf("HierarchyCache: AddFolder() is an update: used type '%s' from old object", $folder->type));
}
// add/update
$this->cacheById[$folder->serverid] = $folder;
$this->changed = true;
return true;
}
/**
* Removes a folder to the HierarchyCache
*
* @param string $serverid id of folder to be removed
*
* @access public
* @return boolean
*/
public function DelFolder($serverid) {
$ftype = $this->GetFolder($serverid);
ZLog::Write(LOGLEVEL_DEBUG, sprintf("HierarchyCache: DelFolder() serverid: '%s' - type: '%s'", $serverid, $ftype->type));
unset($this->cacheById[$serverid]);
$this->changed = true;
return true;
}
/**
* Imports a folder array to the HierarchyCache
*
* @param array $folders folders to the HierarchyCache
*
* @access public
* @return boolean
*/
public function ImportFolders($folders) {
if (!is_array($folders))
return false;
$this->cacheById = array();
foreach ($folders as $folder) {
if (!isset($folder->type))
continue;
$this->AddFolder($folder);
}
return true;
}
/**
* Exports all folders from the HierarchyCache
*
* @param boolean $oldstate (optional) by default false
*
* @access public
* @return array
*/
public function ExportFolders($oldstate = false) {
if ($oldstate === false)
return $this->cacheById;
else
return $this->cacheByIdOld;
}
/**
* Returns all folder objects which were deleted in this operation
*
* @access public
* @return array with SyncFolder objects
*/
public function GetDeletedFolders() {
// diffing the OldCacheById with CacheById we know if folders were deleted
return array_diff_key($this->cacheByIdOld, $this->cacheById);
}
/**
* Returns some statistics about the HierarchyCache
*
* @access public
* @return string
*/
public function GetStat() {
return sprintf("HierarchyCache is %s - Cached objects: %d", ((isset($this->cacheById))?"up":"down"), ((isset($this->cacheById))?count($this->cacheById):"0"));
}
/**
* Returns objects which should be persistent
* called before serialization
*
* @access public
* @return array
*/
public function __sleep() {
return array("cacheById");
}
}
?>