/**
  * Create delta for specified table
  *
  * @param string $documentName
  * @param string $deltaLogName
  * @param string $idKey
  * @return void
  */
 public function createDelta($documentName, $deltaLogName, $idKey)
 {
     if (!$this->resourceAdapter->isTableExists($deltaLogName)) {
         $triggerTable = $this->resourceAdapter->newTable($deltaLogName)->addColumn($idKey, \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['nullable' => false, 'primary' => true])->addColumn('operation', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT)->addColumn('processed', \Magento\Framework\DB\Ddl\Table::TYPE_BOOLEAN, null, ['nullable' => false, 'default' => 0]);
         $this->resourceAdapter->createTable($triggerTable);
     } else {
         $this->deleteAllRecords($deltaLogName);
     }
     foreach (Trigger::getListOfEvents() as $event) {
         $triggerName = $this->resourceAdapter->getTableName('trg_' . $documentName . '_after_' . strtolower($event));
         $statement = $this->buildStatement($event, $idKey, $deltaLogName);
         $trigger = $this->triggerFactory->create()->setTime(Trigger::TIME_AFTER)->setEvent($event)->setTable($documentName);
         $triggerKey = $documentName . $event . Trigger::TIME_AFTER;
         $triggerExists = $this->isTriggerExist($triggerKey);
         if ($triggerExists) {
             $triggerName = $this->triggers[$triggerKey]['trigger_name'];
             $oldTriggerStatement = $this->triggers[$triggerKey]['action_statement'];
             if (strpos($oldTriggerStatement, $statement) !== false) {
                 unset($trigger);
                 continue;
             }
             $trigger->addStatement($oldTriggerStatement);
             $this->resourceAdapter->dropTrigger($triggerName);
         }
         $trigger->addStatement($statement)->setName($triggerName);
         $this->resourceAdapter->createTrigger($trigger);
         if (!$triggerExists) {
             $this->triggers[$triggerKey] = 1;
         }
         unset($trigger);
     }
 }
 /**
  * Remove subscription
  *
  * @return \Magento\Framework\Mview\View\SubscriptionInterface
  */
 public function remove()
 {
     foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) {
         $triggerName = $this->getTriggerName($this->resource->getTableName($this->getTableName()), \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER, $event);
         /** @var \Magento\Framework\DB\Ddl\Trigger $trigger */
         $trigger = $this->triggerFactory->create()->setName($triggerName)->setTime(\Magento\Framework\DB\Ddl\Trigger::TIME_AFTER)->setEvent($event)->setTable($this->resource->getTableName($this->getTableName()));
         // Add statements for linked views
         foreach ($this->getLinkedViews() as $view) {
             /** @var \Magento\Framework\Mview\ViewInterface $view */
             $trigger->addStatement($this->buildStatement($event, $view->getChangelog()));
         }
         $this->write->dropTrigger($trigger->getName());
         // Re-create trigger if trigger used by linked views
         if ($trigger->getStatements()) {
             $this->write->createTrigger($trigger);
         }
     }
     return $this;
 }
Beispiel #3
0
 /**
  * Create trigger
  *
  * @param \Magento\Framework\DB\Ddl\Trigger $trigger
  * @throws ErrorException
  * @return StatementInterface
  */
 public function createTrigger(\Magento\Framework\DB\Ddl\Trigger $trigger)
 {
     if (!$trigger->getStatements()) {
         throw new ErrorException(sprintf(__('Trigger %s has not statements available'), $trigger->getName()));
     }
     $statements = implode("\n", $trigger->getStatements());
     $sql = sprintf("CREATE TRIGGER %s %s %s ON %s FOR EACH ROW\nBEGIN\n%s\nEND", $trigger->getName(), $trigger->getTime(), $trigger->getEvent(), $trigger->getTable(), $statements);
     return $this->query($sql);
 }
Beispiel #4
0
    /**
     * Create trigger
     *
     * @param \Magento\Framework\DB\Ddl\Trigger $trigger
     * @throws \Zend_Db_Exception
     * @return \Zend_Db_Statement_Pdo
     */
    public function createTrigger(\Magento\Framework\DB\Ddl\Trigger $trigger)
    {
        if (!$trigger->getStatements()) {
            throw new \Zend_Db_Exception(
                (string)new \Magento\Framework\Phrase(
                    'Trigger %1 has not statements available',
                    [$trigger->getName()]
                )
            );
        }

        $statements = implode("\n", $trigger->getStatements());

        $sql = sprintf(
            "CREATE TRIGGER %s %s %s ON %s FOR EACH ROW\nBEGIN\n%s\nEND",
            $trigger->getName(),
            $trigger->getTime(),
            $trigger->getEvent(),
            $trigger->getTable(),
            $statements
        );

        return $this->multiQuery($sql);
    }
Beispiel #5
0
 /**
  * Test getStatements method
  */
 public function testGetStatements()
 {
     $this->assertEquals([], $this->_object->getStatements());
 }