123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Mview\View;
- use Magento\Framework\Phrase;
- class Changelog implements ChangelogInterface
- {
- /**
- * Suffix for changelog table
- */
- const NAME_SUFFIX = 'cl';
- /**
- * Column name of changelog entity
- */
- const COLUMN_NAME = 'entity_id';
- /**
- * Database connection
- *
- * @var \Magento\Framework\DB\Adapter\AdapterInterface
- */
- protected $connection;
- /**
- * View Id identifier
- *
- * @var string
- */
- protected $viewId;
- /**
- * @var \Magento\Framework\App\ResourceConnection
- */
- protected $resource;
- /**
- * @param \Magento\Framework\App\ResourceConnection $resource
- */
- public function __construct(\Magento\Framework\App\ResourceConnection $resource)
- {
- $this->connection = $resource->getConnection();
- $this->resource = $resource;
- $this->checkConnection();
- }
- /**
- * Check DB connection
- *
- * @return void
- * @throws \Exception
- */
- protected function checkConnection()
- {
- if (!$this->connection) {
- throw new \Exception("The write connection to the database isn't available. Please try again later.");
- }
- }
- /**
- * Create changelog table
- *
- * @return void
- * @throws \Exception
- */
- public function create()
- {
- $changelogTableName = $this->resource->getTableName($this->getName());
- if (!$this->connection->isTableExists($changelogTableName)) {
- $table = $this->connection->newTable(
- $changelogTableName
- )->addColumn(
- 'version_id',
- \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
- null,
- ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
- 'Version ID'
- )->addColumn(
- $this->getColumnName(),
- \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
- null,
- ['unsigned' => true, 'nullable' => false, 'default' => '0'],
- 'Entity ID'
- );
- $this->connection->createTable($table);
- }
- }
- /**
- * Drop changelog table
- *
- * @return void
- * @throws ChangelogTableNotExistsException
- */
- public function drop()
- {
- $changelogTableName = $this->resource->getTableName($this->getName());
- if (!$this->connection->isTableExists($changelogTableName)) {
- throw new ChangelogTableNotExistsException(new Phrase("Table %1 does not exist", [$changelogTableName]));
- }
- $this->connection->dropTable($changelogTableName);
- }
- /**
- * Clear changelog table by version_id
- *
- * @param int $versionId
- * @return boolean
- * @throws ChangelogTableNotExistsException
- */
- public function clear($versionId)
- {
- $changelogTableName = $this->resource->getTableName($this->getName());
- if (!$this->connection->isTableExists($changelogTableName)) {
- throw new ChangelogTableNotExistsException(new Phrase("Table %1 does not exist", [$changelogTableName]));
- }
- $this->connection->delete($changelogTableName, ['version_id < ?' => (int)$versionId]);
- return true;
- }
- /**
- * Retrieve entity ids by range [$fromVersionId..$toVersionId]
- *
- * @param int $fromVersionId
- * @param int $toVersionId
- * @return int[]
- * @throws ChangelogTableNotExistsException
- */
- public function getList($fromVersionId, $toVersionId)
- {
- $changelogTableName = $this->resource->getTableName($this->getName());
- if (!$this->connection->isTableExists($changelogTableName)) {
- throw new ChangelogTableNotExistsException(new Phrase("Table %1 does not exist", [$changelogTableName]));
- }
- $select = $this->connection->select()->distinct(
- true
- )->from(
- $changelogTableName,
- [$this->getColumnName()]
- )->where(
- 'version_id > ?',
- (int)$fromVersionId
- )->where(
- 'version_id <= ?',
- (int)$toVersionId
- );
- return $this->connection->fetchCol($select);
- }
- /**
- * Get maximum version_id from changelog
- * @return int
- * @throws ChangelogTableNotExistsException
- * @throws \Exception
- */
- public function getVersion()
- {
- $changelogTableName = $this->resource->getTableName($this->getName());
- if (!$this->connection->isTableExists($changelogTableName)) {
- throw new ChangelogTableNotExistsException(new Phrase("Table %1 does not exist", [$changelogTableName]));
- }
- $row = $this->connection->fetchRow('SHOW TABLE STATUS LIKE ?', [$changelogTableName]);
- if (isset($row['Auto_increment'])) {
- return (int)$row['Auto_increment'] - 1;
- } else {
- throw new \Exception("Table status for `{$changelogTableName}` is incorrect. Can`t fetch version id.");
- }
- }
- /**
- * Get changlog name
- *
- * Build a changelog name by concatenating view identifier and changelog name suffix.
- *
- * @throws \Exception
- * @return string
- */
- public function getName()
- {
- if (strlen($this->viewId) == 0) {
- throw new \Exception("View's identifier is not set");
- }
- return $this->viewId . '_' . self::NAME_SUFFIX;
- }
- /**
- * Get changlog entity column name
- *
- * @return string
- */
- public function getColumnName()
- {
- return self::COLUMN_NAME;
- }
- /**
- * Set view's identifier
- *
- * @param string $viewId
- * @return Changelog
- */
- public function setViewId($viewId)
- {
- $this->viewId = $viewId;
- return $this;
- }
- /**
- * @return string
- */
- public function getViewId()
- {
- return $this->viewId;
- }
- }
|