/** * @param Insert $insert */ public function preInsert(Insert $insert) { $metaColumns = $this->tableGateway->getColumns(); if (count($metaColumns)) { $metaColumns = array_flip($metaColumns); $columns = array_flip($insert->getRawState('columns')); $columns = array_flip(array_intersect_key($columns, $metaColumns)); $values = $insert->getRawState('values'); $values = array_intersect_key($values, $columns); $insert->values(array_values($values)); $insert->columns(array_values($columns)); } }
/** * @param Insert $insert */ public function preInsert(Insert $insert) { $columns = $insert->getRawState('columns'); $values = $insert->getRawState('values'); $key = array_search($this->primaryKeyField, $columns); if ($key !== false) { $this->sequenceValue = $values[$key]; return $insert; } $this->sequenceValue = $this->nextSequenceId(); if ($this->sequenceValue === null) { return $insert; } $insert->values(array($this->primaryKeyField => $this->sequenceValue), Insert::VALUES_MERGE); return $insert; }
public function preInsert(Insert $insert) { $columns = $insert->getRawState('columns'); $values = $insert->getRawState('values'); $key = array_search($this->primaryKeyField, $columns); if ($key !== false) { $this->sequenceValue = $values[$key]; return $insert; } $this->sequenceValue = $this->nextSequenceId(); if ($this->sequenceValue === null) { return $insert; } array_push($columns, $this->primaryKeyField); array_push($values, $this->sequenceValue); $insert->columns($columns); $insert->values($values); return $insert; }
/** * @param Insert $insert * @return mixed * @throws \Directus\Acl\Exception\UnauthorizedTableAddException * @throws \Directus\Acl\Exception\UnauthorizedFieldWriteException */ protected function executeInsert(Insert $insert) { /** * ACL Enforcement */ $insertState = $insert->getRawState(); $insertTable = $this->getRawTableNameFromQueryStateTable($insertState['table']); if (!$this->acl->hasTablePrivilege($insertTable, 'add')) { $aclErrorPrefix = $this->acl->getErrorMessagePrefix(); throw new UnauthorizedTableAddException($aclErrorPrefix . "Table add access forbidden on table {$insertTable}"); } // Enforce write field blacklist (if user lacks bigedit privileges on this table) if (!$this->acl->hasTablePrivilege($insertTable, 'bigedit')) { $this->acl->enforceBlacklist($insertTable, $insertState['columns'], Acl::FIELD_WRITE_BLACKLIST); } try { return parent::executeInsert($insert); } catch (\Zend\Db\Adapter\Exception\InvalidQueryException $e) { if ('production' !== DIRECTUS_ENV) { if (strpos(strtolower($e->getMessage()), 'duplicate entry') !== FALSE) { throw new DuplicateEntryException($e->getMessage()); } throw new \RuntimeException("This query failed: " . $this->dumpSql($insert), 0, $e); } // @todo send developer warning throw $e; } }
/** * @todo add $columns support * * @param Insert $insert * @return mixed * @throws Exception\RuntimeException */ protected function executeInsert(Insert $insert) { $insertState = $insert->getRawState(); if ($insertState['table'] != $this->table) { throw new Exception\RuntimeException('The table name of the provided Insert object must match that of the table'); } // apply preInsert features $this->featureSet->apply('preInsert', array($insert)); $statement = $this->sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $this->lastInsertValue = $this->adapter->getDriver()->getConnection()->getLastGeneratedValue(); // apply postInsert features $this->featureSet->apply('postInsert', array($statement, $result)); return $result->getAffectedRows(); }
/** * @todo add $columns support * * @param Insert $insert * @return int * @throws Exception\RuntimeException */ protected function executeInsert(Insert $insert) { $insertState = $insert->getRawState(); if ($insertState['table'] != $this->table) { throw new Exception\RuntimeException('The table name of the provided Insert object must match that of the table'); } // apply preInsert features $this->featureSet->apply(EventFeatureEventsInterface::EVENT_PRE_INSERT, [$insert]); // Most RDBMS solutions do not allow using table aliases in INSERTs // See https://github.com/zendframework/zf2/issues/7311 $unaliasedTable = false; if (is_array($insertState['table'])) { $tableData = array_values($insertState['table']); $unaliasedTable = array_shift($tableData); $insert->into($unaliasedTable); } $statement = $this->sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $this->lastInsertValue = $this->adapter->getDriver()->getConnection()->getLastGeneratedValue(); // apply postInsert features $this->featureSet->apply(EventFeatureEventsInterface::EVENT_POST_INSERT, [$statement, $result]); // Reset original table information in Insert instance, if necessary if ($unaliasedTable) { $insert->into($insertState['table']); } return $result->getAffectedRows(); }
/** * @param Insert $insert * @return mixed * @throws \Directus\Acl\Exception\UnauthorizedTableAddException * @throws \Directus\Acl\Exception\UnauthorizedFieldWriteException */ protected function executeInsert(Insert $insert) { /** * ACL Enforcement */ $insertState = $insert->getRawState(); $insertTable = $this->getRawTableNameFromQueryStateTable($insertState['table']); $insertData = $insertState['values']; if (!$this->acl->hasTablePrivilege($insertTable, 'add')) { $aclErrorPrefix = $this->acl->getErrorMessagePrefix(); throw new UnauthorizedTableAddException($aclErrorPrefix . 'Table add access forbidden on table ' . $insertTable); } // Enforce write field blacklist $this->acl->enforceBlacklist($insertTable, $insertState['columns'], Acl::FIELD_WRITE_BLACKLIST); try { // Data to be inserted with the column name as assoc key. $insertDataAssoc = array_combine($insertState['columns'], $insertData); $this->emitter->run('table.insert:before', [$insertTable, $insertDataAssoc]); $this->emitter->run('table.insert.' . $insertTable . ':before', [$insertDataAssoc]); $result = parent::executeInsert($insert); $insertTableGateway = new self($this->acl, $insertTable, $this->adapter); $resultData = $insertTableGateway->find($this->getLastInsertValue()); $this->emitter->run('table.insert', [$insertTable, $resultData]); $this->emitter->run('table.insert.' . $insertTable, [$resultData]); $this->emitter->run('table.insert:after', [$insertTable, $resultData]); $this->emitter->run('table.insert.' . $insertTable . ':after', [$resultData]); return $result; } catch (\Zend\Db\Adapter\Exception\InvalidQueryException $e) { // @todo send developer warning if (strpos(strtolower($e->getMessage()), 'duplicate entry') !== FALSE) { throw new DuplicateEntryException($e->getMessage()); } if ('production' !== DIRECTUS_ENV) { throw new \RuntimeException('This query failed: ' . $this->dumpSql($insert), 0, $e); } throw $e; } }