master

laravel/framework

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

SqlServerConnection.php

TLDR

The SqlServerConnection.php file is a part of the Illuminate\Database namespace and contains the SqlServerConnection class. This class extends the Connection class and provides methods for executing transactions, escaping binary values, getting default query and schema grammars, and retrieving schema builder instances.

Methods

transaction(Closure $callback, $attempts = 1)

This method executes a closure within a transaction. It accepts a closure to be executed and an optional number of attempts to retry the transaction. It starts the transaction, executes the closure, and commits the transaction if successful. If an exception is caught, it rolls back the transaction and re-throws the exception.

escapeBinary($value)

This method escapes a binary value for safe SQL embedding. It takes a string value as input and returns the escaped value.

isUniqueConstraintError(Exception $exception)

This method determines if a given database exception was caused by a unique constraint violation. It accepts an exception object and returns a boolean value indicating whether the exception message matches a pattern indicating a unique constraint violation.

getDefaultQueryGrammar()

This method returns the default query grammar instance for the connection. It creates a new instance of the QueryGrammar class, sets the connection, and returns the grammar with the table prefix applied.

getSchemaBuilder()

This method returns a schema builder instance for the connection. If the schema grammar is not set, it uses the default schema grammar. It creates a new instance of the SqlServerBuilder class and returns it.

getDefaultSchemaGrammar()

This method returns the default schema grammar instance for the connection. It creates a new instance of the SchemaGrammar class, sets the connection, and returns the grammar with the table prefix applied.

getSchemaState(Filesystem $files = null, callable $processFactory = null)

This method throws a RuntimeException with a message stating that schema dumping is not supported when using SQL Server.

getDefaultPostProcessor()

This method returns the default post processor instance for the connection. It creates a new instance of the SqlServerProcessor class and returns it.

getDoctrineDriver()

This method returns the Doctrine DBAL driver instance for SQL Server. It creates a new instance of the SqlServerDriver class and returns it.

Classes

No classes are defined in this file.

<?php

namespace Illuminate\Database;

use Closure;
use Exception;
use Illuminate\Database\PDO\SqlServerDriver;
use Illuminate\Database\Query\Grammars\SqlServerGrammar as QueryGrammar;
use Illuminate\Database\Query\Processors\SqlServerProcessor;
use Illuminate\Database\Schema\Grammars\SqlServerGrammar as SchemaGrammar;
use Illuminate\Database\Schema\SqlServerBuilder;
use Illuminate\Filesystem\Filesystem;
use RuntimeException;
use Throwable;

class SqlServerConnection extends Connection
{
    /**
     * Execute a Closure within a transaction.
     *
     * @param  \Closure  $callback
     * @param  int  $attempts
     * @return mixed
     *
     * @throws \Throwable
     */
    public function transaction(Closure $callback, $attempts = 1)
    {
        for ($a = 1; $a <= $attempts; $a++) {
            if ($this->getDriverName() === 'sqlsrv') {
                return parent::transaction($callback, $attempts);
            }

            $this->getPdo()->exec('BEGIN TRAN');

            // We'll simply execute the given callback within a try / catch block
            // and if we catch any exception we can rollback the transaction
            // so that none of the changes are persisted to the database.
            try {
                $result = $callback($this);

                $this->getPdo()->exec('COMMIT TRAN');
            }

            // If we catch an exception, we will rollback so nothing gets messed
            // up in the database. Then we'll re-throw the exception so it can
            // be handled how the developer sees fit for their applications.
            catch (Throwable $e) {
                $this->getPdo()->exec('ROLLBACK TRAN');

                throw $e;
            }

            return $result;
        }
    }

    /**
     * Escape a binary value for safe SQL embedding.
     *
     * @param  string  $value
     * @return string
     */
    protected function escapeBinary($value)
    {
        $hex = bin2hex($value);

        return "0x{$hex}";
    }

    /**
     * Determine if the given database exception was caused by a unique constraint violation.
     *
     * @param  \Exception  $exception
     * @return bool
     */
    protected function isUniqueConstraintError(Exception $exception)
    {
        return boolval(preg_match('#Cannot insert duplicate key row in object#i', $exception->getMessage()));
    }

    /**
     * Get the default query grammar instance.
     *
     * @return \Illuminate\Database\Query\Grammars\SqlServerGrammar
     */
    protected function getDefaultQueryGrammar()
    {
        ($grammar = new QueryGrammar)->setConnection($this);

        return $this->withTablePrefix($grammar);
    }

    /**
     * Get a schema builder instance for the connection.
     *
     * @return \Illuminate\Database\Schema\SqlServerBuilder
     */
    public function getSchemaBuilder()
    {
        if (is_null($this->schemaGrammar)) {
            $this->useDefaultSchemaGrammar();
        }

        return new SqlServerBuilder($this);
    }

    /**
     * Get the default schema grammar instance.
     *
     * @return \Illuminate\Database\Schema\Grammars\SqlServerGrammar
     */
    protected function getDefaultSchemaGrammar()
    {
        ($grammar = new SchemaGrammar)->setConnection($this);

        return $this->withTablePrefix($grammar);
    }

    /**
     * Get the schema state for the connection.
     *
     * @param  \Illuminate\Filesystem\Filesystem|null  $files
     * @param  callable|null  $processFactory
     *
     * @throws \RuntimeException
     */
    public function getSchemaState(Filesystem $files = null, callable $processFactory = null)
    {
        throw new RuntimeException('Schema dumping is not supported when using SQL Server.');
    }

    /**
     * Get the default post processor instance.
     *
     * @return \Illuminate\Database\Query\Processors\SqlServerProcessor
     */
    protected function getDefaultPostProcessor()
    {
        return new SqlServerProcessor;
    }

    /**
     * Get the Doctrine DBAL driver.
     *
     * @return \Illuminate\Database\PDO\SqlServerDriver
     */
    protected function getDoctrineDriver()
    {
        return new SqlServerDriver;
    }
}