protected function execute(InputInterface $input, OutputInterface $output)
 {
     $db = \Database::connection();
     $em = $db->getEntityManager();
     $cacheDriver = $em->getConfiguration()->getMetadataCacheImpl();
     $cacheDriver->flushAll();
     $tool = new \Doctrine\ORM\Tools\SchemaTool($em);
     $schemas = [];
     /**
      * @var $sm MySqlSchemaManager
      */
     $sm = $db->getSchemaManager();
     $dbSchema = $sm->createSchema();
     // core xml tables
     $schemas[] = Schema::getCoreXMLSchema();
     // core entities
     $sm = new DatabaseStructureManager($em);
     $entities = $sm->getMetadatas();
     $schemas[] = $tool->getSchemaFromMetadata($entities);
     // core, application and package block types
     $env = Environment::get();
     $list = new BlockTypeList();
     $list->includeInternalBlockTypes();
     foreach ($list->get() as $bt) {
         $r = $env->getRecord(DIRNAME_BLOCKS . '/' . $bt->getBlockTypeHandle() . '/' . FILENAME_BLOCK_DB, $bt->getPackageHandle());
         if ($r->exists()) {
             $parser = Schema::getSchemaParser(simplexml_load_file($r->file));
             $parser->setIgnoreExistingTables(false);
             $schemas[] = $parser->parse($db);
         }
     }
     // packages
     $packages = Package::getInstalledList();
     foreach ($packages as $pkg) {
         $xmlFile = $pkg->getPackagePath() . '/' . FILENAME_BLOCK_DB;
         if (file_exists($xmlFile)) {
             $parser = Schema::getSchemaParser(simplexml_load_file($xmlFile));
             $parser->setIgnoreExistingTables(false);
             $schemas[] = $parser->parse($db);
         }
     }
     // Finalize output.
     $comparator = new \Doctrine\DBAL\Schema\Comparator();
     $saveQueries = array();
     foreach ($schemas as $schema) {
         $schemaDiff = $comparator->compare($dbSchema, $schema);
         $saveQueries = array_merge($saveQueries, $schemaDiff->toSaveSql($db->getDatabasePlatform()));
     }
     $saveQueries = $this->filterQueries($saveQueries);
     if (count($saveQueries)) {
         $output->writeln(t2('%s query found', '%s queries found', count($saveQueries)));
         $i = 1;
         foreach ($saveQueries as $query) {
             $output->writeln(sprintf('%s: %s', $i, $query));
             $i++;
         }
     } else {
         $output->writeln(t('No differences found between schema and database.'));
     }
 }
Exemple #2
0
 public static function refreshDatabase(Package $package)
 {
     if (version_compare(APP_VERSION, '5.7.4', '<')) {
         if (file_exists($package->getPackagePath() . '/' . FILENAME_PACKAGE_DB)) {
             $db = Database::get();
             $db->beginTransaction();
             $parser = Schema::getSchemaParser(simplexml_load_file($package->getPackagePath() . '/' . FILENAME_PACKAGE_DB));
             $parser->setIgnoreExistingTables(false);
             $toSchema = $parser->parse($db);
             $fromSchema = $db->getSchemaManager()->createSchema();
             $comparator = new \Doctrine\DBAL\Schema\Comparator();
             $schemaDiff = $comparator->compare($fromSchema, $toSchema);
             $saveQueries = $schemaDiff->toSaveSql($db->getDatabasePlatform());
             foreach ($saveQueries as $query) {
                 $db->query($query);
             }
             $db->commit();
         }
     }
 }
Exemple #3
0
 /**
  * refreshes the BlockType's database schema throws an Exception if error
  *
  * @return void
  */
 public function refresh()
 {
     $db = DB::get();
     $pkgHandle = false;
     if ($this->pkgID > 0) {
         $pkgHandle = $this->getPackageHandle();
     }
     $class = static::getBlockTypeMappedClass($this->btHandle, $pkgHandle);
     $bta = new $class();
     $this->loadFromController($bta);
     $em = $db->getEntityManager();
     $em->persist($this);
     $em->flush();
     $env = Environment::get();
     $r = $env->getRecord(DIRNAME_BLOCKS . '/' . $this->btHandle . '/' . FILENAME_BLOCK_DB, $this->getPackageHandle());
     if ($r->exists()) {
         $parser = Schema::getSchemaParser(simplexml_load_file($r->file));
         $parser->setIgnoreExistingTables(false);
         $toSchema = $parser->parse($db);
         $fromSchema = $db->getSchemaManager()->createSchema();
         $comparator = new \Doctrine\DBAL\Schema\Comparator();
         $schemaDiff = $comparator->compare($fromSchema, $toSchema);
         $saveQueries = $schemaDiff->toSaveSql($db->getDatabasePlatform());
         foreach ($saveQueries as $query) {
             $db->query($query);
         }
     }
 }
Exemple #4
0
 public static function upgradeDatabase($pkg)
 {
     $dbm = $pkg->getDatabaseStructureManager();
     $pkg->destroyProxyClasses();
     if ($dbm->hasEntities()) {
         $dbm->generateProxyClasses();
         //$dbm->dropObsoleteDatabaseTables(camelcase($this->getPackageHandle()));
         $dbm->installDatabase();
     }
     if (file_exists($pkg->getPackagePath() . '/' . FILENAME_PACKAGE_DB)) {
         // Legacy db.xml
         // currently this is just done from xml
         $db = Database::get();
         $db->beginTransaction();
         $parser = Schema::getSchemaParser(simplexml_load_file($pkg->getPackagePath() . '/' . FILENAME_PACKAGE_DB));
         $parser->setIgnoreExistingTables(false);
         $toSchema = $parser->parse($db);
         $fromSchema = $db->getSchemaManager()->createSchema();
         $comparator = new \Doctrine\DBAL\Schema\Comparator();
         $schemaDiff = $comparator->compare($fromSchema, $toSchema);
         $saveQueries = $schemaDiff->toSaveSql($db->getDatabasePlatform());
         foreach ($saveQueries as $query) {
             $db->query($query);
         }
         $db->commit();
     }
 }
Exemple #5
0
 /**
  * Installs a package's database from an XML file.
  *
  * @param string $xmlFile Path to the database XML file
  *
  * @return bool|\stdClass Returns false if the XML file could not be found
  *
  * @throws \Doctrine\DBAL\ConnectionException
  */
 public static function installDB($xmlFile)
 {
     if (!file_exists($xmlFile)) {
         return false;
     }
     $db = \Database::connection();
     $db->beginTransaction();
     $parser = Schema::getSchemaParser(simplexml_load_file($xmlFile));
     $parser->setIgnoreExistingTables(false);
     $toSchema = $parser->parse($db);
     $fromSchema = $db->getSchemaManager()->createSchema();
     $comparator = new \Doctrine\DBAL\Schema\Comparator();
     $schemaDiff = $comparator->compare($fromSchema, $toSchema);
     $saveQueries = $schemaDiff->toSaveSql($db->getDatabasePlatform());
     foreach ($saveQueries as $query) {
         $db->query($query);
     }
     $db->commit();
     $result = new \stdClass();
     $result->result = false;
     return $result;
 }