Based on on parts of the monolithic Bolt\Database\IntegrityChecker class.
/** * Create/update database table. */ public function build() { $tableName = $this->tableName; // User/client account table $this->schemaManager->registerExtensionTable(function (DbalSchema $schema) use($tableName) { // @codingStandardsIgnoreStart $table = $schema->createTable($tableName . '_account'); $table->addColumn('guid', 'guid', []); $table->addColumn('resource_owner_id', 'string', ['notnull' => false, 'length' => 128]); $table->addColumn('password', 'string', ['notnull' => false, 'length' => 64]); $table->addColumn('email', 'string', ['notnull' => false, 'length' => 254]); $table->addColumn('enabled', 'boolean', ['default' => false]); $table->setPrimaryKey(['guid']); $table->addUniqueIndex(['resource_owner_id']); $table->addUniqueIndex(['email']); $table->addIndex(['enabled']); return $table; // @codingStandardsIgnoreEnd }); // User/client provider table $this->schemaManager->registerExtensionTable(function (DbalSchema $schema) use($tableName) { // @codingStandardsIgnoreStart $table = $schema->createTable($tableName . '_provider'); $table->addColumn('guid', 'guid', []); $table->addColumn('provider', 'string', ['length' => 64]); $table->addColumn('resource_owner_id', 'string', ['length' => 128]); $table->addColumn('refresh_token', 'string', ['notnull' => false, 'default' => null, 'length' => 128]); $table->addColumn('resource_owner', 'text', ['notnull' => false, 'default' => null]); $table->addColumn('lastupdate', 'datetime', ['notnull' => false, 'default' => null]); $table->setPrimaryKey(['guid']); $table->addIndex(['provider']); $table->addIndex(['resource_owner_id']); $table->addIndex(['refresh_token']); return $table; // @codingStandardsIgnoreEnd }); // User/client provider table $this->schemaManager->registerExtensionTable(function (DbalSchema $schema) use($tableName) { // @codingStandardsIgnoreStart $table = $schema->createTable($tableName . '_tokens'); $table->addColumn('access_token', 'string', ['length' => 128]); $table->addColumn('guid', 'guid', []); $table->addColumn('access_token_data', 'text', ['notnull' => false, 'default' => null]); $table->addColumn('expires', 'integer', ['notnull' => false, 'default' => null]); $table->setPrimaryKey(['access_token']); $table->addIndex(['guid']); $table->addIndex(['expires']); return $table; // @codingStandardsIgnoreEnd }); }
/** * Trigger database schema checks if required. * * @param GetResponseEvent $event */ protected function schemaCheck(GetResponseEvent $event) { $session = $event->getRequest()->getSession(); $validSession = $session->isStarted() && $session->get('authentication'); $expired = $this->schemaManager->isCheckRequired(); if ($validSession && $expired && $this->schemaManager->isUpdateRequired()) { $msg = Trans::__("The database needs to be updated/repaired. Go to 'Configuration' > '<a href=\"%link%\">Check Database</a>' to do this now.", ['%link%' => $this->urlGenerator->generate('dbcheck')]); $this->loggerFlash->error($msg); } }
/** * Trigger database schema checks if required. * * @param GetResponseEvent $event */ protected function schemaCheck(GetResponseEvent $event) { $session = $event->getRequest()->getSession(); $validSession = $session->isStarted() && $session->get('authentication'); $expired = $this->schemaManager->isCheckRequired(); // Don't show the check if we're in the dbcheck already. $notInCheck = !in_array($event->getRequest()->get('_route'), ['dbcheck', 'dbupdate_result', 'dbupdate']); if ($validSession && $expired && $this->schemaManager->isUpdateRequired() && $notInCheck) { $msg = Trans::__("The database needs to be updated/repaired. Go to 'Configuration' > '<a href=\"%link%\">Check Database</a>' to do this now.", ['%link%' => $this->urlGenerator->generate('dbcheck')]); $this->loggerFlash->error($msg); } }
/** * Get the field type for a given column. * * @param string $name * @param \Doctrine\DBAL\Schema\Column $column */ protected function getFieldTypeFor($name, $column) { $contentKey = $this->schemaManager->getKeyForTable($name); if ($contentKey && isset($this->contenttypes[$contentKey][$column->getName()])) { $type = $this->contenttypes[$contentKey]['fields'][$column->getName()]['type']; } elseif ($column->getType()) { $type = get_class($column->getType()); } if (isset($this->typemap[$type])) { $type = new $this->typemap[$type](); } else { $type = new $this->typemap['text'](); } return $type; }
/** * Set the taxonomy. * * @param string $contentKey * @param string $className * @param Table $table */ public function setTaxonomies($contentKey, $className, $table) { if (!isset($this->contenttypes[$contentKey]['taxonomy'])) { return; } foreach ($this->contenttypes[$contentKey]['taxonomy'] as $taxonomytype) { $taxonomyConfig = $this->taxonomies[$taxonomytype]; if (isset($taxonomyConfig['alias'])) { $taxonomy = $taxonomyConfig['alias']; } else { $taxonomy = $taxonomytype; } $mapping = ['fieldname' => $taxonomy, 'type' => 'null', 'fieldtype' => $this->typemap['taxonomy'], 'target' => $this->schemaManager->getTableName('taxonomy')]; $this->metadata[$className]['fields'][$taxonomy] = $mapping; $this->metadata[$className]['fields'][$taxonomy]['data'] = $taxonomyConfig; } }
/** * Run the checks on the tables to see if they firstly exist, then if they * require update. */ protected function checkTables() { $fromTables = $this->manager->getInstalledTables(); $toTables = $this->manager->getSchemaTables(); /** @var $fromTable Table */ foreach ($toTables as $toTableAlias => $toTable) { $tableName = $toTable->getName(); if (!isset($fromTables[$toTableAlias])) { // Table doesn't exist. Mark it for pending creation. $this->pending = true; $this->tablesCreate[$tableName] = $toTable; $this->getResponse()->addTitle($tableName, sprintf('Table `%s` is not present.', $tableName)); $this->systemLog->debug('Database table missing: ' . $tableName); continue; } // Table exists. Check for required updates. $fromTable = $fromTables[$toTableAlias]; $this->checkTable($fromTable, $toTable); } }