Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/Ecombricks/Inventory/Setup/SchemaSetupTrait.php
<?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;
    }
    
}

Spamworldpro Mini