Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Db/PostgreSql/Statement.php
<?php /** @noinspection PhpComposerExtensionStubsInspection */

namespace XF\Db\PostgreSql;

use
XF\Db\AbstractStatement;

use function
count;

class
Statement extends AbstractStatement
{
   
/**
     * @var resource
     */
   
protected $statement;

   
/**
     * @var string[]
     */
   
protected $types;

   
/**
     * @var resource
     */
   
protected $result;

    public function
prepare()
    {
        if (
$this->statement)
        {
            throw new \
LogicException("Statement has already been prepared");
        }

       
$connection = $this->adapter->getConnectionForQuery($this->query);

       
$this->statement = pg_prepare($connection, '', $this->query);
        if (!
$this->statement)
        {
           
$error = pg_last_error($connection);
            throw
$this->getException("PostgreSQL statement prepare error: $error");
        }
    }

    public function
execute()
    {
        if (!
$this->statement)
        {
           
$this->prepare();
        }

       
$connection = $this->adapter->getConnectionForQuery($this->query);

       
$this->adapter->logQueryExecution($this->query, $this->params);
       
$result = pg_execute($connection, '', $this->params);
       
$this->adapter->logQueryStage('execute');

        if (
$result === false)
        {
           
$error = pg_last_error($connection);
            throw
$this->getException("PostgreSQL query error: $error");
        }

       
$this->adapter->logQueryCompletion();

       
$keys = [];

       
$count = pg_num_fields($result);
        for (
$i = 0; $i < $count; $i++)
        {
           
$keys[] = pg_field_name($result, $i);
           
$types[] = pg_field_type($result, $i);
        }

       
$this->keys = $keys;
       
$this->types = $types;
       
$this->result = $result;

        return
$this->result;
    }

    public function
fetchRowValues()
    {
       
$result = $this->result;
        if (!
$result)
        {
            return
false;
        }

       
$row = pg_fetch_row($result);

        if (
$row === false)
        {
            return
false;
        }

       
// rudimentary native type casting
       
$values = [];
        for (
$i = 0; $i < count($row); $i++)
        {
           
$value = $row[$i];
            if (
$value === null)
            {
               
$values[$i] = $value;
                continue;
            }

           
$type = $this->types[$i];
            switch (
$type)
            {
                case
'int4':
                   
$value = (int) $value;
                    break;

                case
'bool':
                   
$value = ($value === 't');
                    break;
            }

           
$values[$i] = $value;
        }

        return
$values;
    }

    public function
rowsAffected()
    {
        if (
$this->result)
        {
            return
pg_affected_rows($this->result);
        }
        else
        {
            return
0;
        }
    }

    public function
reset()
    {
        return;
    }

    protected function
closeStatement()
    {
        return;
    }
}