protected function lockConnection(Connection $connection) { if ($connection->getPlatform() instanceof PostgreSqlPlatform) { Environment::lock('data-pgsql', TEMP_DIR); } else { Environment::lock('data-mysql', TEMP_DIR); } }
public function escapeIdentifier($value) { if (!$this->oldDriver) { return $this->conn->getDriver()->convertIdentifierToSql($value); } else { return $this->conn->getDriver()->convertToSql($value, IDriver::TYPE_IDENTIFIER); } }
public function getForeignKeys($table) { $result = $this->connection->query("\n\t\t\tSELECT\n\t\t\t\tco.conname::varchar AS name,\n\t\t\t\tal.attname::varchar AS column,\n\t\t\t\tnf.nspname || '.' || cf.relname::varchar AS ref_table,\n\t\t\t\taf.attname::varchar AS ref_column\n\t\t\tFROM\n\t\t\t\tpg_catalog.pg_constraint AS co\n\t\t\t\tJOIN pg_catalog.pg_class AS cl ON co.conrelid = cl.oid\n\t\t\t\tJOIN pg_catalog.pg_class AS cf ON co.confrelid = cf.oid\n\t\t\t\tJOIN pg_catalog.pg_namespace AS nf ON nf.oid = cf.relnamespace\n\t\t\t\tJOIN pg_catalog.pg_attribute AS al ON al.attrelid = cl.oid AND al.attnum = %raw\n\t\t\t\tJOIN pg_catalog.pg_attribute AS af ON af.attrelid = cf.oid AND af.attnum = %raw\n\t\t\tWHERE\n\t\t\t\tco.contype = 'f'\n\t\t\t\tAND cl.oid = %s::regclass\n\t\t\t\tAND nf.nspname = ANY (pg_catalog.current_schemas(FALSE))\n\t\t", 'co.conkey[1]', 'co.confkey[1]', $table); $keys = []; foreach ($result as $row) { $keys[$row->column] = $row->toArray(); } return $keys; }
/** * Imports & executes queries from sql file. * Code taken from Adminer (http://www.adminer.org) & modified, * @author Jakub Vrána * @author Jan Tvrdík * @author Michael Moravec * @author Jan Škrášek * @license Apache License * * @param Connection $connection * @param string $file path to imported file * @return int number of executed queries */ public static function executeFile(Connection $connection, $file) { $query = @file_get_contents($file); if ($query === FALSE) { throw new IOException("Cannot open file '{$file}'."); } $delimiter = ';'; $offset = $queries = 0; $space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\\n]*\\n|--\\n)"; $driver = $connection->getDriver(); if ($driver instanceof MysqliDriver) { $parse = '[\'"[]|/\\*|-- |$'; } elseif ($driver instanceof PgsqlDriver) { $parse = '[\'"]|/\\*|-- |$|\\$[^$]*\\$'; } else { // general $parse = '[\'"`#]|/\\*|-- |$'; } while ($query != '') { if (!$offset && preg_match("~^{$space}*DELIMITER\\s+(\\S+)~i", $query, $match)) { $delimiter = $match[1]; $query = substr($query, strlen($match[0])); } else { preg_match('(' . preg_quote($delimiter) . "\\s*|{$parse})", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match $found = $match[0][0]; $offset = $match[0][1] + strlen($found); if (!$found && rtrim($query) === '') { break; } if (!$found || rtrim($found) == $delimiter) { // end of a query $q = substr($query, 0, $match[0][1]); $queries++; $connection->query('%raw', $q); $query = substr($query, $offset); $offset = 0; } else { // find matching quote or comment end while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES $s = $match[0][0]; $offset = $match[0][1] + strlen($s); if ($s[0] !== '\\') { break; } } } } } return $queries; }
private function fetchCounts(QueryBuilder $builder, array $values) { $targetStoragePrimaryKey = $this->targetMapper->getStorageReflection()->getStoragePrimaryKey()[0]; $sourceTable = $builder->getFromAlias(); $builder = clone $builder; $builder->addSelect('%column', "{$sourceTable}.{$this->joinStorageKey}"); $builder->orderBy(NULL); if ($builder->hasLimitOffsetClause()) { $sqls = []; $args = []; foreach ($values as $value) { $build = clone $builder; $build->andWhere('%column = %any', "{$sourceTable}.{$this->joinStorageKey}", $value); $sqls[] = "SELECT %any AS %column, COUNT(*) AS [count] FROM (" . $build->getQuerySql() . ') [temp]'; $args[] = $value; $args[] = $this->joinStorageKey; $args = array_merge($args, $build->getQueryParameters()); } $sql = '(' . implode(') UNION ALL (', $sqls) . ')'; $result = $this->connection->queryArgs($sql, $args); } else { $builder->addSelect('COUNT(%column) AS [count]', "{$sourceTable}.{$targetStoragePrimaryKey}"); $builder->andWhere('%column IN %any', "{$sourceTable}.{$this->joinStorageKey}", $values); $builder->groupBy('%column', "{$sourceTable}.{$this->joinStorageKey}"); $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters()); } $counts = []; foreach ($result as $row) { $counts[$row->{$this->joinStorageKey}] = $row->count; } return $counts; }
public function rollback() { $hash = spl_object_hash($this->connection); if (isset(self::$transactions[$hash])) { $this->connection->rollbackTransaction(); unset(self::$transactions[$hash]); } }
public function remove(IEntity $parent, array $remove) { if (!$remove) { return; } $this->mapperOne->beginTransaction(); $list = $this->buildList($parent, $remove); $this->connection->query('DELETE FROM %table WHERE %column[] IN %any', $this->joinTable, array_keys(reset($list)), array_map('array_values', $list)); }
public function getForeignKeys($table) { $result = $this->connection->query(' SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = %s ', $table); $keys = []; foreach ($result as $row) { $keys[$row->COLUMN_NAME] = ['name' => $row->CONSTRAINT_NAME, 'column' => $row->COLUMN_NAME, 'ref_table' => $row->REFERENCED_TABLE_NAME, 'ref_column' => $row->REFERENCED_COLUMN_NAME]; } return $keys; }
protected function fetch(QueryBuilder $builder, $hasJoin, array $values, IEntityPreloadContainer $preloadContainer = NULL) { $values = array_values(array_unique(array_filter($values, function ($value) { return $value !== NULL; }))); if (count($values) === 0) { return new EntityContainer([], $preloadContainer); } $primaryKey = $this->targetRepository->getMapper()->getStorageReflection()->getStoragePrimaryKey()[0]; $builder->andWhere('%column IN %any', $primaryKey, $values); $builder->addSelect(($hasJoin ? 'DISTINCT ' : '') . '%table.*', $builder->getFromAlias()); $result = $this->connection->queryArgs($builder->getQuerySQL(), $builder->getQueryParameters()); $entities = []; while ($data = $result->fetch()) { $entity = $this->targetRepository->hydrateEntity($data->toArray()); $entities[$entity->getValue('id')] = $entity; } return new EntityContainer($entities, $preloadContainer); }
protected function execute() { $builder = clone $this->queryBuilder; $table = $builder->getFromAlias(); if (!$this->distinct) { $builder->select("[{$table}.*]"); } else { $builder->select("DISTINCT [{$table}.*]"); } $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters()); $this->result = []; while ($data = $result->fetch()) { $this->result[] = $this->repository->hydrateEntity($data->toArray()); } }
private function getForeignKeys($table) { return $this->cache->load($table . '.fkeys', function () use($table) { return $this->connection->getPlatform()->getForeignKeys($table); }); }
public function __construct(Connection $connection, Cache $cache) { $this->platform = $connection->getPlatform(); $this->cache = $cache; }