/**
  * DirectoryStorage constructor.
  * @param string $directory
  * @param \VersionPress\Database\EntityInfo $entityInfo
  * @param string $dbPrefix
  * @param ChangeInfoFactory $changeInfoFactory
  */
 public function __construct($directory, $entityInfo, $dbPrefix, $changeInfoFactory)
 {
     parent::__construct($entityInfo, $dbPrefix);
     $this->directory = $directory;
     $this->entityInfo = $entityInfo;
     $this->changeInfoFactory = $changeInfoFactory;
 }
 /**
  * Loads entities from storage and gives subclasses the chance to transform them, see
  * {@see transformEntities()}.
  *
  * @param $entitiesToSynchronize
  * @return array
  */
 private function loadEntitiesFromStorage($entitiesToSynchronize)
 {
     if ($this->selectiveSynchronization) {
         $entities = array();
         foreach ($entitiesToSynchronize as $entityToSynchronize) {
             if ($this->storage->exists($entityToSynchronize['vp_id'], $entityToSynchronize['parent'])) {
                 $entities[] = $this->storage->loadEntity($entityToSynchronize['vp_id'], $entityToSynchronize['parent']);
             } else {
                 if ($this->storage->exists($entityToSynchronize['vp_id'], null)) {
                     $entities[] = $this->storage->loadEntity($entityToSynchronize['vp_id'], null);
                 }
             }
         }
     } else {
         $entities = $this->storage->loadAll();
     }
     $entities = $this->transformEntities($entities);
     return $entities;
 }
 /**
  * Loads entities from storage. For full synchronization it loads all entities. For selective synchronization it loads
  * only entities from $this->entitiesToSynchronize.
  *
  * @return array
  */
 private function loadEntitiesFromStorage()
 {
     if ($this->isSelectiveSynchronization) {
         $entities = [];
         foreach ($this->entitiesToSynchronize as $entityToSynchronize) {
             if ($this->storage->exists($entityToSynchronize['vp_id'], $entityToSynchronize['parent'])) {
                 $entities[] = $this->storage->loadEntity($entityToSynchronize['vp_id'], $entityToSynchronize['parent']);
             }
         }
     } else {
         $entities = $this->storage->loadAll();
     }
     $entities = $this->maybeStripMetaEntities($entities);
     $entities = array_map(function ($entity) {
         return $this->urlReplacer->restore($entity);
     }, $entities);
     $entities = array_map(function ($entity) {
         return $this->vpidRepository->restoreForeignKeys($this->entityName, $entity);
     }, $entities);
     return $entities;
 }
 public function shouldBeSaved($data)
 {
     return parent::shouldBeSaved($data) && isset($data[$this->parentReferenceName]) && $this->parentStorage->exists($data[$this->parentReferenceName], null);
 }
 private function saveMetaEntities(Storage $storage, $entities, $parentReference)
 {
     if (count($entities) == 0) {
         return;
     }
     $lastParent = $entities[0][$parentReference];
     foreach ($entities as $entity) {
         if ($entity[$parentReference] !== $lastParent) {
             $storage->commit();
             $this->checkTimeout();
         }
         $storage->saveLater($entity);
     }
     $storage->commit();
 }