/** * Syncs the files in the db with the files in the filesystem * * @param string $strPrevID * @param string $strPath * @param bool $bitRecursive * @param \class_module_mediamanager_repo|null $objRepo * * @return array [insert, delete] */ public static function syncRecursive($strPrevID, $strPath, $bitRecursive = true, class_module_mediamanager_repo $objRepo = null) { $arrReturn = array(); $arrReturn["insert"] = 0; $arrReturn["delete"] = 0; if ($objRepo == null) { $objRepo = class_objectfactory::getInstance()->getObject($strPrevID); while ($objRepo != null && !$objRepo instanceof class_module_mediamanager_repo) { $objRepo = class_objectfactory::getInstance()->getObject($objRepo->getPrevId()); } } //Load the files in the DB $arrObjDB = class_module_mediamanager_file::loadFilesDB($strPrevID); //Load files and folder from filesystem $objFilesystem = new class_filesystem(); //if the repo defines a view-filter, take that one into account $arrViewFilter = array(); if ($objRepo->getStrViewFilter() != "") { $arrViewFilter = explode(",", $objRepo->getStrViewFilter()); } $arrFilesystem = $objFilesystem->getCompleteList($strPath, $arrViewFilter, array(), array(".", "..", ".svn")); //So, lets sync those two arrays //At first the files foreach ($arrFilesystem["files"] as $intKeyFS => $arrOneFileFilesystem) { //search the db-array for this file foreach ($arrObjDB as $intKeyDB => $objOneFileDB) { //File or folder if ($objOneFileDB->getintType() == self::$INT_TYPE_FILE) { //compare if ($objOneFileDB->getStrFilename() == str_replace(_realpath_, "", $arrOneFileFilesystem["filepath"])) { //And unset from both arrays unset($arrFilesystem["files"][$intKeyFS]); unset($arrObjDB[$intKeyDB]); } } } } //And loop the folders foreach ($arrFilesystem["folders"] as $intKeyFolder => $strFolder) { //search the array for folders foreach ($arrObjDB as $intKeyDB => $objOneFolderDB) { //file or folder? if ($objOneFolderDB->getIntType() == self::$INT_TYPE_FOLDER) { //compare if ($objOneFolderDB->getStrFilename() == $strPath . "/" . $strFolder) { //Unset from both unset($arrFilesystem["folders"][$intKeyFolder]); unset($arrObjDB[$intKeyDB]); } } } } //the remaining records from the database have to be deleted! if (count($arrObjDB) > 0) { foreach ($arrObjDB as $objOneFileDB) { $objOneFileDB->deleteObjectFromDatabase(); $arrReturn["delete"]++; } } //the remaining records from the filesystem have to be added foreach ($arrFilesystem["files"] as $arrOneFileFilesystem) { $strFileName = $arrOneFileFilesystem["filename"]; $strFileFilename = str_replace(_realpath_, "", $arrOneFileFilesystem["filepath"]); $objFile = new class_module_mediamanager_file(); $objFile->setStrFilename($strFileFilename); $objFile->setStrName($strFileName); $objFile->setIntType(self::$INT_TYPE_FILE); $objFile->updateObjectToDb($strPrevID); $arrReturn["insert"]++; } foreach ($arrFilesystem["folders"] as $strFolder) { $strFileName = $strFolder; $strFileFilename = $strPath . "/" . $strFolder; $objFile = new class_module_mediamanager_file(); $objFile->setStrFilename($strFileFilename); $objFile->setStrName($strFileName); $objFile->setIntType(self::$INT_TYPE_FOLDER); $objFile->updateObjectToDb($strPrevID); $arrReturn["insert"]++; } //Load subfolders class_carrier::getInstance()->getObjDB()->flushQueryCache(); if ($bitRecursive) { $objFolders = class_module_mediamanager_file::loadFilesDB($strPrevID, self::$INT_TYPE_FOLDER); foreach ($objFolders as $objOneFolderDB) { $arrTemp = class_module_mediamanager_file::syncRecursive($objOneFolderDB->getSystemid(), $objOneFolderDB->getStrFilename(), $bitRecursive, $objRepo); $arrReturn["insert"] += $arrTemp["insert"]; $arrReturn["delete"] += $arrTemp["delete"]; } } return $arrReturn; }