master

laravel/framework

Last updated at: 29/12/2023 09:22

SqlServerConnection.php

TLDR

The SqlServerConnection.php file implements the Connection interface from the Doctrine\DBAL\Driver namespace. It provides methods for preparing SQL statements, executing queries, executing SQL statements, retrieving the last insert ID, managing transactions, wrapping quotes around input, getting the server version, and accessing the native PDO connection.

Methods

prepare

The prepare method prepares a new SQL statement by calling the prepare method on the underlying connection and returning a new Doctrine\DBAL\Driver\Statement instance.

query

The query method executes a new query against the connection by calling the query method on the underlying connection and returning a Doctrine\DBAL\Driver\Result instance.

exec

The exec method executes an SQL statement by calling the exec method on the underlying connection and returning the number of affected rows.

lastInsertId

The lastInsertId method retrieves the last insert ID. If a name is provided, it executes a prepared statement to retrieve the last insert ID from the database's sequences table. If no name is provided, it calls the lastInsertId method on the underlying connection.

beginTransaction

The beginTransaction method begins a new database transaction by calling the beginTransaction method on the underlying connection.

commit

The commit method commits a database transaction by calling the commit method on the underlying connection.

rollBack

The rollBack method rolls back a database transaction by calling the rollBack method on the underlying connection.

quote

The quote method wraps quotes around the given input by calling the quote method on the underlying connection. It also fixes a driver version issue where values are terminated with a null byte.

getServerVersion

The getServerVersion method gets the server version for the connection by calling the getServerVersion method on the underlying connection.

getNativeConnection

The getNativeConnection method returns the native PDO connection by calling the getWrappedConnection method on the underlying connection.

<?php

namespace Illuminate\Database\PDO;

use Doctrine\DBAL\Driver\Connection as ConnectionContract;
use Doctrine\DBAL\Driver\PDO\SQLSrv\Statement;
use Doctrine\DBAL\Driver\Result;
use Doctrine\DBAL\Driver\Statement as StatementInterface;
use Doctrine\DBAL\ParameterType;
use PDO;

class SqlServerConnection implements ConnectionContract
{
    /**
     * The underlying connection instance.
     *
     * @var \Illuminate\Database\PDO\Connection
     */
    protected $connection;

    /**
     * Create a new SQL Server connection instance.
     *
     * @param  \Illuminate\Database\PDO\Connection  $connection
     * @return void
     */
    public function __construct(Connection $connection)
    {
        $this->connection = $connection;
    }

    /**
     * Prepare a new SQL statement.
     *
     * @param  string  $sql
     * @return \Doctrine\DBAL\Driver\Statement
     */
    public function prepare(string $sql): StatementInterface
    {
        return new Statement(
            $this->connection->prepare($sql)
        );
    }

    /**
     * Execute a new query against the connection.
     *
     * @param  string  $sql
     * @return \Doctrine\DBAL\Driver\Result
     */
    public function query(string $sql): Result
    {
        return $this->connection->query($sql);
    }

    /**
     * Execute an SQL statement.
     *
     * @param  string  $statement
     * @return int
     */
    public function exec(string $statement): int
    {
        return $this->connection->exec($statement);
    }

    /**
     * Get the last insert ID.
     *
     * @param  string|null  $name
     * @return string|int
     */
    public function lastInsertId($name = null): string|int
    {
        if ($name === null) {
            return $this->connection->lastInsertId($name);
        }

        return $this->prepare('SELECT CONVERT(VARCHAR(MAX), current_value) FROM sys.sequences WHERE name = ?')
            ->execute([$name])
            ->fetchOne();
    }

    /**
     * Begin a new database transaction.
     *
     * @return void
     */
    public function beginTransaction(): void
    {
        $this->connection->beginTransaction();
    }

    /**
     * Commit a database transaction.
     *
     * @return void
     */
    public function commit(): void
    {
        $this->connection->commit();
    }

    /**
     * Rollback a database transaction.
     *
     * @return void
     */
    public function rollBack(): void
    {
        $this->connection->rollBack();
    }

    /**
     * Wrap quotes around the given input.
     *
     * @param  string  $value
     * @param  int  $type
     * @return string
     */
    public function quote($value, $type = ParameterType::STRING): string
    {
        $val = $this->connection->quote($value, $type);

        // Fix for a driver version terminating all values with null byte...
        if (\is_string($val) && str_contains($val, "\0")) {
            $val = \substr($val, 0, -1);
        }

        return $val;
    }

    /**
     * Get the server version for the connection.
     *
     * @return string
     */
    public function getServerVersion(): string
    {
        return $this->connection->getServerVersion();
    }

    /**
     * Get the native PDO connection.
     *
     * @return \PDO
     */
    public function getNativeConnection(): PDO
    {
        return $this->connection->getWrappedConnection();
    }
}