![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/Ecombricks/Inventory/Setup/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See LICENSE.txt for license details. */ namespace Ecombricks\Inventory\Setup; /** * Schema setup trait */ trait SchemaSetupTrait { /** * Source column * * @var array */ protected $sourceColumn; /** * Table mapper * * @var \Magento\Framework\Module\TableMapperInterface */ protected $tableMapper; /** * Constructor * * @param \Ecombricks\Framework\App\ResourceConnection\TableMapperInterface $tableMapper * @return void */ public function __construct(\Ecombricks\Framework\App\ResourceConnection\TableMapperInterface $tableMapper) { $this->tableMapper = $tableMapper; } /** * Get primary column * * @param string $tableName * @return array */ protected function getPrimaryColumn($tableName) { $primaryColumn = null; foreach ($this->getColumns($tableName) as $column) { $options =& $column['options']; if (!isset($options['primary'])) { continue; } if (array_key_exists('identity', $options)) { unset($options['identity']); } if (array_key_exists('primary', $options)) { unset($options['primary']); } $primaryColumn = $column; break; } return $primaryColumn; } /** * Prepare source column options * * @param array $options * @param array $sourceColumnConfig * @return array */ protected function prepareSourceColumnOptions($options, $sourceColumnConfig = []) { if (array_key_exists('primary', $options)) { unset($options['primary']); } if (array_key_exists('primary', $sourceColumnConfig)) { $options['primary'] = $sourceColumnConfig['primary']; } if (array_key_exists('nullable', $sourceColumnConfig)) { $options['nullable'] = $sourceColumnConfig['nullable']; } if (array_key_exists('default', $sourceColumnConfig)) { $options['default'] = $sourceColumnConfig['default']; } return $options; } /** * Get source column * * @param array $sourceColumnConfig * @return array */ protected function getSourceColumn($sourceColumnConfig = []) { if ($this->sourceColumn !== null) { return $this->sourceColumn; } foreach ($this->getColumns('inventory_source') as $column) { if ($column['name'] !== \Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE) { continue; } $column['options'] = $this->prepareSourceColumnOptions($column['options'], $sourceColumnConfig); $this->sourceColumn = $column; break; } return $this->sourceColumn; } /** * Add source replica table columns * * @param \Magento\Framework\DB\Ddl\Table $sourceReplicaTable * @param string $tableName * @param array $sourceColumnConfig * @return $this */ protected function addSourceReplicaTableColumns($sourceReplicaTable, $tableName, $sourceColumnConfig = []) { $sourceColumn = $this->getSourceColumn($sourceColumnConfig); $sourceColumnReplace = isset($sourceColumnConfig['replace']) ? $sourceColumnConfig['replace'] : null; $sourceColumnAfter = isset($sourceColumnConfig['after']) ? $sourceColumnConfig['after'] : null; $sourceColumnAdded = false; foreach ($this->getColumns($tableName) as $column) { $columnName = $column['name']; if ($sourceColumnReplace && $sourceColumnReplace === $columnName) { $this->addTableColumn($sourceReplicaTable, $sourceColumn); $sourceColumnAdded = true; continue; } $this->addTableColumn($sourceReplicaTable, $column); if ($sourceColumnAfter && $sourceColumnAfter === $columnName) { $this->addTableColumn($sourceReplicaTable, $sourceColumn); $sourceColumnAdded = true; } } if (!$sourceColumnAdded) { $this->addTableColumn($sourceReplicaTable, $sourceColumn); } return $this; } /** * Add source replica table indexes * * @param \Magento\Framework\DB\Ddl\Table $sourceReplicaTable * @param string $tableName * @param string $sourceReplicaTableName * @param array $sourceColumnConfig * @return $this */ protected function addSourceReplicaTableIndexes($sourceReplicaTable, $tableName, $sourceReplicaTableName, $sourceColumnConfig = []) { $indexes = $this->getConnection()->getIndexList($this->getTable($tableName)); $sourceColumnReplace = isset($sourceColumnConfig['replace']) ? $sourceColumnConfig['replace'] : null; $sourceColumnIndexType = isset($sourceColumnConfig['index']) ? $sourceColumnConfig['index'] : null; $sourceColumnIndexAdded = false; $primaryIndexType = \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY; $uniqueIndexType = \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE; foreach ($indexes as $index) { $indexColumns = $index['COLUMNS_LIST']; $indexType = $index['INDEX_TYPE']; if (($index['KEY_NAME'] == 'PRIMARY') || ($indexType == $primaryIndexType)) { continue; } if ($sourceColumnReplace) { foreach ($indexColumns as &$indexColumn) { if ($indexColumn === $sourceColumnReplace) { $indexColumn = \Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE; $sourceColumnIndexAdded = true; } } } else { if (($indexType == $uniqueIndexType) && ($sourceColumnIndexType == $uniqueIndexType)) { array_unshift($indexColumns, \Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE); $sourceColumnIndexAdded = true; } } $this->addTableIndex( $sourceReplicaTable, $sourceReplicaTableName, $indexColumns, $indexType ); } if ($sourceColumnIndexAdded || !$sourceColumnIndexType) { return $this; } $this->addTableIndex( $sourceReplicaTable, $sourceReplicaTableName, [\Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE], $sourceColumnIndexType ); return $this; } /** * Add source replica table foreign keys * * @param \Magento\Framework\DB\Ddl\Table $sourceReplicaTable * @param string $tableName * @param string $sourceReplicaTableName * @param array $sourceColumnConfig * @return $this */ protected function addSourceReplicaTableForeignKeys($sourceReplicaTable, $tableName, $sourceReplicaTableName, $sourceColumnConfig = []) { $foreignKeys = $this->getConnection()->getForeignKeys($this->getTable($tableName)); $sourceColumnReplace = isset($sourceColumnConfig['replace']) ? $sourceColumnConfig['replace'] : null; foreach ($foreignKeys as $foreignKey) { $foreignKeyColumnName = $foreignKey['COLUMN_NAME']; if ($sourceColumnReplace && $sourceColumnReplace === $foreignKeyColumnName) { continue; } $this->addTableForeignKey( $sourceReplicaTable, $sourceReplicaTableName, $foreignKeyColumnName, $foreignKey['REF_TABLE_NAME'], $foreignKey['REF_COLUMN_NAME'], $foreignKey['ON_DELETE'] ); } $sourceColumnForeignKey = isset($sourceColumnConfig['foreign_key']) ? true : false; if (!$sourceColumnForeignKey) { return $this; } $this->addTableForeignKey( $sourceReplicaTable, $sourceReplicaTableName, \Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE, 'inventory_source', \Magento\InventoryApi\Api\Data\SourceInterface::SOURCE_CODE, \Magento\Framework\DB\Adapter\AdapterInterface::FK_ACTION_CASCADE ); return $this; } /** * Create source replica table * * @param string $tableName * @param string $sourceReplicaTableName * @param array $sourceColumnConfig * @return $this */ protected function createSourceReplicaTable($tableName, $sourceReplicaTableName, $sourceColumnConfig = []) { $this->tableMapper->setIsEnabled(false); $connection = $this->getConnection(); $tableData = $connection->showTableStatus($this->getTable($tableName)); $sourceReplicaTable = $connection->newTable($this->getTable($sourceReplicaTableName)) ->setOption('type', $tableData['Engine']) ->setComment('Source '.$tableData['Comment']); $this->addSourceReplicaTableColumns($sourceReplicaTable, $tableName, $sourceColumnConfig); $this->addSourceReplicaTableIndexes($sourceReplicaTable, $tableName, $sourceReplicaTableName, $sourceColumnConfig); $this->addSourceReplicaTableForeignKeys($sourceReplicaTable, $tableName, $sourceReplicaTableName, $sourceColumnConfig); $this->createTable($sourceReplicaTable); $this->tableMapper->setIsEnabled(true); return $this; } /** * Create source table * * @param string $tableName * @param string $sourceTableName * @return $this */ protected function createSourceTable($tableName, $sourceTableName) { $connection = $this->getConnection(); $tableData = $connection->showTableStatus($this->getTable($tableName)); $sourceTable = $connection->newTable($this->getTable($sourceTableName)) ->setOption('type', $tableData['Engine']) ->setComment($tableData['Comment'].' Source'); $primaryColumn = $this->getPrimaryColumn($tableName); $sourceColumn = $this->getSourceColumn(); if (!$primaryColumn || !$sourceColumn) { return $this; } $this ->addTableColumn($sourceTable, $primaryColumn) ->addTableColumn($sourceTable, $sourceColumn) ->addTableIndex( $sourceTable, $sourceTableName, $primaryColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE ) ->addTableIndex( $sourceTable, $sourceTableName, $sourceColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX ) ->addTableForeignKey( $sourceTable, $sourceTableName, $primaryColumn['name'], $tableName, $primaryColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::FK_ACTION_CASCADE ) ->addTableForeignKey( $sourceTable, $sourceTableName, $sourceColumn['name'], 'inventory_source', $sourceColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::FK_ACTION_CASCADE ) ->createTable($sourceTable); return $this; } /** * Create source additional table * * @param string $tableName * @param string $sourceAdditionalTableName * @param array $additionalColumns * @return $this */ protected function createSourceAdditionalTable($tableName, $sourceAdditionalTableName, $additionalColumns) { $connection = $this->getConnection(); $tableData = $connection->showTableStatus($this->getTable($tableName)); $sourceAdditionalTable = $connection->newTable($this->getTable($sourceAdditionalTableName)) ->setOption('type', $tableData['Engine']) ->setComment('Source '.$tableData['Comment']); $primaryColumn = $this->getPrimaryColumn($tableName); $sourceColumn = $this->getSourceColumn(); if (!$primaryColumn || !$sourceColumn) { return $this; } $this ->addTableColumn($sourceAdditionalTable, $primaryColumn) ->addTableColumn($sourceAdditionalTable, $sourceColumn); foreach ($additionalColumns as $column) { $this->addTableColumn($sourceAdditionalTable, $column); } $this ->addTableIndex( $sourceAdditionalTable, $sourceAdditionalTableName, $primaryColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX ) ->addTableIndex( $sourceAdditionalTable, $sourceAdditionalTableName, $sourceColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX ) ->addTableIndex( $sourceAdditionalTable, $sourceAdditionalTableName, [$primaryColumn['name'], $sourceColumn['name']], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE ) ->addTableForeignKey( $sourceAdditionalTable, $sourceAdditionalTableName, $primaryColumn['name'], $tableName, $primaryColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::FK_ACTION_CASCADE ) ->addTableForeignKey( $sourceAdditionalTable, $sourceAdditionalTableName, $sourceColumn['name'], 'inventory_source', $sourceColumn['name'], \Magento\Framework\DB\Adapter\AdapterInterface::FK_ACTION_CASCADE ) ->createTable($sourceAdditionalTable); return $this; } }