/** * 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; }
/** * 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); }
/** * 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); }
/** * Test getStatements method */ public function testGetStatements() { $this->assertEquals([], $this->_object->getStatements()); }