protected function lockConnection(Connection $connection)
 {
     if ($connection->getPlatform() instanceof PostgreSqlPlatform) {
         Environment::lock('data-pgsql', TEMP_DIR);
     } else {
         Environment::lock('data-mysql', TEMP_DIR);
     }
 }
예제 #2
0
 public function escapeIdentifier($value)
 {
     if (!$this->oldDriver) {
         return $this->conn->getDriver()->convertIdentifierToSql($value);
     } else {
         return $this->conn->getDriver()->convertToSql($value, IDriver::TYPE_IDENTIFIER);
     }
 }
예제 #3
0
 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;
 }
예제 #4
0
 /**
  * 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;
 }
예제 #6
0
파일: DbalMapper.php 프로젝트: nextras/orm
 public function rollback()
 {
     $hash = spl_object_hash($this->connection);
     if (isset(self::$transactions[$hash])) {
         $this->connection->rollbackTransaction();
         unset(self::$transactions[$hash]);
     }
 }
예제 #7
0
 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));
 }
예제 #8
0
    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());
     }
 }
예제 #11
0
 private function getForeignKeys($table)
 {
     return $this->cache->load($table . '.fkeys', function () use($table) {
         return $this->connection->getPlatform()->getForeignKeys($table);
     });
 }
예제 #12
0
 public function __construct(Connection $connection, Cache $cache)
 {
     $this->platform = $connection->getPlatform();
     $this->cache = $cache;
 }