/** * Saves all eligible entities into the file system storage (the 'db' folder) */ private function saveDatabaseToStorages() { if (is_dir(VP_VPDB_DIR)) { FileSystem::remove(VP_VPDB_DIR); } FileSystem::mkdir(VP_VPDB_DIR); $entityNames = $this->synchronizerFactory->getSynchronizationSequence(); foreach ($entityNames as $entityName) { $this->createVpidsForEntitiesOfType($entityName); $this->saveEntitiesOfTypeToStorage($entityName); } $mnReferenceDetails = $this->dbSchema->getAllMnReferences(); foreach ($mnReferenceDetails as $referenceDetail) { $this->saveMnReferences($referenceDetail); } }
/** * Saves all already existing meta and M:N references for an entity that wasn't tracked yet * * @param array $data * @param string $entityName */ private function storeRelatedEntities($data, $entityName) { $id = $data[$this->dbSchemaInfo->getEntityInfo($entityName)->idColumnName]; foreach ($this->dbSchemaInfo->getAllEntityNames() as $referencedEntityName) { $entityInfo = $this->dbSchemaInfo->getEntityInfo($referencedEntityName); if ($this->dbSchemaInfo->isChildEntity($referencedEntityName) && $entityInfo->references[$entityInfo->parentReference] === $entityName) { $childEntities = $this->database->get_results("SELECT * FROM {$this->dbSchemaInfo->getPrefixedTableName($referencedEntityName)} WHERE `{$entityInfo->parentReference}` = '{$id}'", ARRAY_A); foreach ($childEntities as $childEntity) { $childEntity = $this->vpidRepository->replaceForeignKeysWithReferences($referencedEntityName, $childEntity); if (!$this->mirror->shouldBeSaved($referencedEntityName, $childEntity)) { continue; } $id = $childEntity[$entityInfo->idColumnName]; $vpid = $this->vpidRepository->getVpidForEntity($referencedEntityName, $id); if ($vpid) { $childEntity[$entityInfo->vpidColumnName] = $vpid; } else { $childEntity = $this->vpidRepository->identifyEntity($referencedEntityName, $childEntity, $childEntity[$entityInfo->idColumnName]); } $childEntity = $this->shortcodesReplacer->replaceShortcodesInEntity($referencedEntityName, $childEntity); $this->mirror->save($referencedEntityName, $childEntity); } } } foreach ($this->dbSchemaInfo->getAllMnReferences() as $mnReferenceDetails) { if ($mnReferenceDetails['source-entity'] === $entityName) { $junctionTable = $mnReferenceDetails['junction-table']; $prefixedJunctionTable = $this->dbSchemaInfo->getPrefixedTableName($junctionTable); $sourceColumn = $mnReferenceDetails['source-column']; $references = $this->database->get_results("SELECT * FROM `{$prefixedJunctionTable}` WHERE `{$sourceColumn}` = '{$id}'", ARRAY_A); foreach ($references as $reference) { $reference = $this->vpidRepository->replaceForeignKeysWithReferences($junctionTable, $reference); $this->mirror->save($junctionTable, $reference); } } } }
function vp_update_table_ddl_scripts(DbSchemaInfo $dbSchemaInfo, TableSchemaStorage $tableSchemaStorage) { $tableSchemaStorage->deleteAll(); $entityNames = $dbSchemaInfo->getAllEntityNames(); foreach ($entityNames as $entityName) { $table = $dbSchemaInfo->getPrefixedTableName($entityName); $tableSchemaStorage->saveSchema($table); } $referenceDetails = $dbSchemaInfo->getAllMnReferences(); foreach ($referenceDetails as $referenceDetail) { $table = $dbSchemaInfo->getPrefixedTableName($referenceDetail['junction-table']); $tableSchemaStorage->saveSchema($table); } }