Вход Регистрация
Файл: vendor/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php
Строк: 307
<?php

namespace DoctrineDBALPortability;

use 
DoctrineDBALDriverResult;
use 
DoctrineDBALDriverResultStatement;
use 
DoctrineDBALDriverStatement as DriverStatement;
use 
DoctrineDBALDriverStatementIterator;
use 
DoctrineDBALFetchMode;
use 
DoctrineDBALParameterType;
use 
IteratorAggregate;
use 
PDO;
use 
ReturnTypeWillChange;

use function 
array_change_key_case;
use function 
assert;
use function 
is_string;
use function 
rtrim;

/**
 * Portability wrapper for a Statement.
 */
class Statement implements IteratorAggregateDriverStatementResult
{
    
/** @var int */
    
private $portability;

    
/** @var DriverStatement|ResultStatement */
    
private $stmt;

    
/** @var int|null */
    
private $case;

    
/** @var int */
    
private $defaultFetchMode FetchMode::MIXED;

    
/**
     * Wraps <tt>Statement</tt> and applies portability measures.
     *
     * @param DriverStatement|ResultStatement $stmt
     */
    
public function __construct($stmtConnection $conn)
    {
        
$this->stmt        $stmt;
        
$this->portability $conn->getPortability();
        
$this->case        $conn->getFetchCase();
    }

    
/**
     * {@inheritdoc}
     */
    
public function bindParam($param, &$variable$type ParameterType::STRING$length null)
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->bindParam($param$variable$type$length);
    }

    
/**
     * {@inheritdoc}
     */
    
public function bindValue($param$value$type ParameterType::STRING)
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->bindValue($param$value$type);
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use free() instead.
     */
    
public function closeCursor()
    {
        return 
$this->stmt->closeCursor();
    }

    
/**
     * {@inheritdoc}
     */
    
public function columnCount()
    {
        return 
$this->stmt->columnCount();
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated The error information is available via exceptions.
     */
    
public function errorCode()
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->errorCode();
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated The error information is available via exceptions.
     */
    
public function errorInfo()
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->errorInfo();
    }

    
/**
     * {@inheritdoc}
     */
    
public function execute($params null)
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->execute($params);
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use one of the fetch- or iterate-related methods.
     */
    
public function setFetchMode($fetchMode$arg2 null$arg3 null)
    {
        
$this->defaultFetchMode $fetchMode;

        return 
$this->stmt->setFetchMode($fetchMode$arg2$arg3);
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use iterateNumeric(), iterateAssociative() or iterateColumn() instead.
     */
    #[ReturnTypeWillChange]
    
public function getIterator()
    {
        return new 
StatementIterator($this);
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use fetchNumeric(), fetchAssociative() or fetchOne() instead.
     */
    
public function fetch($fetchMode null$cursorOrientation PDO::FETCH_ORI_NEXT$cursorOffset 0)
    {
        
$fetchMode $fetchMode ?: $this->defaultFetchMode;

        
$row $this->stmt->fetch($fetchMode);

        
$iterateRow = (
            
$this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL Connection::PORTABILITY_RTRIM)
        ) !== 
0;

        
$fixCase $this->case !== null
            
&& ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED)
            && (
$this->portability Connection::PORTABILITY_FIX_CASE);

        
$row $this->fixRow($row$iterateRow$fixCase);

        return 
$row;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use fetchAllNumeric(), fetchAllAssociative() or fetchFirstColumn() instead.
     */
    
public function fetchAll($fetchMode null$fetchArgument null$ctorArgs null)
    {
        
$fetchMode $fetchMode ?: $this->defaultFetchMode;

        if (
$fetchArgument) {
            
$rows $this->stmt->fetchAll($fetchMode$fetchArgument);
        } else {
            
$rows $this->stmt->fetchAll($fetchMode);
        }

        
$fixCase $this->case !== null
            
&& ($fetchMode === FetchMode::ASSOCIATIVE || $fetchMode === FetchMode::MIXED)
            && (
$this->portability Connection::PORTABILITY_FIX_CASE);

        return 
$this->fixResultSet($rows$fixCase$fetchMode !== FetchMode::COLUMN);
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchNumeric()
    {
        if (
$this->stmt instanceof Result) {
            
$row $this->stmt->fetchNumeric();
        } else {
            
$row $this->stmt->fetch(FetchMode::NUMERIC);
        }

        return 
$this->fixResult($rowfalse);
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchAssociative()
    {
        if (
$this->stmt instanceof Result) {
            
$row $this->stmt->fetchAssociative();
        } else {
            
$row $this->stmt->fetch(FetchMode::ASSOCIATIVE);
        }

        return 
$this->fixResult($rowtrue);
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchOne()
    {
        if (
$this->stmt instanceof Result) {
            
$value $this->stmt->fetchOne();
        } else {
            
$value $this->stmt->fetch(FetchMode::COLUMN);
        }

        if ((
$this->portability Connection::PORTABILITY_EMPTY_TO_NULL) !== && $value === '') {
            
$value null;
        } elseif ((
$this->portability Connection::PORTABILITY_RTRIM) !== && is_string($value)) {
            
$value rtrim($value);
        }

        return 
$value;
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchAllNumeric(): array
    {
        if (
$this->stmt instanceof Result) {
            
$data $this->stmt->fetchAllNumeric();
        } else {
            
$data $this->stmt->fetchAll(FetchMode::NUMERIC);
        }

        return 
$this->fixResultSet($datafalsetrue);
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchAllAssociative(): array
    {
        if (
$this->stmt instanceof Result) {
            
$data $this->stmt->fetchAllAssociative();
        } else {
            
$data $this->stmt->fetchAll(FetchMode::ASSOCIATIVE);
        }

        return 
$this->fixResultSet($datatruetrue);
    }

    
/**
     * {@inheritdoc}
     */
    
public function fetchFirstColumn(): array
    {
        if (
$this->stmt instanceof Result) {
            
$data $this->stmt->fetchFirstColumn();
        } else {
            
$data $this->stmt->fetchAll(FetchMode::COLUMN);
        }

        return 
$this->fixResultSet($datatruefalse);
    }

    public function 
free(): void
    
{
        if (
$this->stmt instanceof Result) {
            
$this->stmt->free();

            return;
        }

        
$this->stmt->closeCursor();
    }

    
/**
     * @param mixed $result
     *
     * @return mixed
     */
    
private function fixResult($resultbool $fixCase)
    {
        
$iterateRow = (
            
$this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL Connection::PORTABILITY_RTRIM)
        ) !== 
0;

        
$fixCase $fixCase && $this->case !== null && ($this->portability Connection::PORTABILITY_FIX_CASE) !== 0;

        return 
$this->fixRow($result$iterateRow$fixCase);
    }

    
/**
     * @param array<int,mixed> $resultSet
     *
     * @return array<int,mixed>
     */
    
private function fixResultSet(array $resultSetbool $fixCasebool $isArray): array
    {
        
$iterateRow = (
            
$this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL Connection::PORTABILITY_RTRIM)
        ) !== 
0;

        
$fixCase $fixCase && $this->case !== null && ($this->portability Connection::PORTABILITY_FIX_CASE) !== 0;

        if (! 
$iterateRow && ! $fixCase) {
            return 
$resultSet;
        }

        if (! 
$isArray) {
            foreach (
$resultSet as $num => $value) {
                
$resultSet[$num] = [$value];
            }
        }

        foreach (
$resultSet as $num => $row) {
            
$resultSet[$num] = $this->fixRow($row$iterateRow$fixCase);
        }

        if (! 
$isArray) {
            foreach (
$resultSet as $num => $row) {
                
$resultSet[$num] = $row[0];
            }
        }

        return 
$resultSet;
    }

    
/**
     * @param mixed $row
     * @param bool  $iterateRow
     * @param bool  $fixCase
     *
     * @return mixed
     */
    
protected function fixRow($row$iterateRow$fixCase)
    {
        if (! 
$row) {
            return 
$row;
        }

        if (
$fixCase) {
            
assert($this->case !== null);
            
$row array_change_key_case($row$this->case);
        }

        if (
$iterateRow) {
            foreach (
$row as $k => $v) {
                if ((
$this->portability Connection::PORTABILITY_EMPTY_TO_NULL) && $v === '') {
                    
$row[$k] = null;
                } elseif ((
$this->portability Connection::PORTABILITY_RTRIM) && is_string($v)) {
                    
$row[$k] = rtrim($v);
                }
            }
        }

        return 
$row;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use fetchOne() instead.
     */
    
public function fetchColumn($columnIndex 0)
    {
        
$value $this->stmt->fetchColumn($columnIndex);

        if (
$this->portability & (Connection::PORTABILITY_EMPTY_TO_NULL Connection::PORTABILITY_RTRIM)) {
            if ((
$this->portability Connection::PORTABILITY_EMPTY_TO_NULL) && $value === '') {
                
$value null;
            } elseif ((
$this->portability Connection::PORTABILITY_RTRIM) && is_string($value)) {
                
$value rtrim($value);
            }
        }

        return 
$value;
    }

    
/**
     * {@inheritdoc}
     */
    
public function rowCount()
    {
        
assert($this->stmt instanceof DriverStatement);

        return 
$this->stmt->rowCount();
    }
}
Онлайн: 0
Реклама