From 9d3d955173995603e8721b203ae7802236c2600f Mon Sep 17 00:00:00 2001 From: Wolfy-J Date: Thu, 24 Jan 2019 18:27:23 +0300 Subject: [PATCH] binary values for SQLServer --- src/Driver/SQLServer/SQLServerDriver.php | 44 +++++++++++++++++++++--- src/Driver/Traits/PDOTrait.php | 4 +-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/Driver/SQLServer/SQLServerDriver.php b/src/Driver/SQLServer/SQLServerDriver.php index f491fbeb..5fd3443f 100644 --- a/src/Driver/SQLServer/SQLServerDriver.php +++ b/src/Driver/SQLServer/SQLServerDriver.php @@ -16,6 +16,8 @@ use Spiral\Database\Driver\SQLServer\Schema\SQLServerTable; use Spiral\Database\Exception\DriverException; use Spiral\Database\Exception\StatementException; +use Spiral\Database\Injection\ParameterInterface; +use Spiral\Database\Statement; class SQLServerDriver extends AbstractDriver { @@ -30,7 +32,7 @@ class SQLServerDriver extends AbstractDriver protected $pdoOptions = [ PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_STRINGIFY_FETCHES => false, + PDO::ATTR_STRINGIFY_FETCHES => false ]; /** @@ -96,12 +98,46 @@ public function getHandler(): HandlerInterface return new SQLServerHandler($this); } + /** + * Bind parameters into statement. SQLServer need encoding to be specified for binary parameters. + * + * @param Statement $statement + * @param ParameterInterface[] $parameters Named hash of ParameterInterface. + * @return Statement + */ + protected function bindParameters(Statement $statement, array $parameters): Statement + { + foreach ($parameters as $index => $parameter) { + if (is_numeric($index)) { + if ($parameter->getType() == PDO::PARAM_LOB) { + $value = $parameter->getValue(); + $statement->bindParam( + $index + 1, + $value, + $parameter->getType(), + 0, + PDO::SQLSRV_ENCODING_BINARY + ); + continue; + } + + //Numeric, @see http://php.net/manual/en/pdostatement.bindparam.php + $statement->bindValue($index + 1, $parameter->getValue(), $parameter->getType()); + } else { + //Named + $statement->bindValue($index, $parameter->getValue(), $parameter->getType()); + } + } + + return $statement; + } + /** * Create nested transaction save point. * * @link http://en.wikipedia.org/wiki/Savepoint * - * @param int $level Savepoint name/id, must not contain spaces and be valid database + * @param int $level Savepoint name/id, must not contain spaces and be valid database * identifier. */ protected function savepointCreate(int $level) @@ -115,7 +151,7 @@ protected function savepointCreate(int $level) * * @link http://en.wikipedia.org/wiki/Savepoint * - * @param int $level Savepoint name/id, must not contain spaces and be valid database + * @param int $level Savepoint name/id, must not contain spaces and be valid database * identifier. */ protected function savepointRelease(int $level) @@ -129,7 +165,7 @@ protected function savepointRelease(int $level) * * @link http://en.wikipedia.org/wiki/Savepoint * - * @param int $level Savepoint name/id, must not contain spaces and be valid database + * @param int $level Savepoint name/id, must not contain spaces and be valid database * identifier. */ protected function savepointRollback(int $level) diff --git a/src/Driver/Traits/PDOTrait.php b/src/Driver/Traits/PDOTrait.php index 1b3a38eb..ae6bac51 100644 --- a/src/Driver/Traits/PDOTrait.php +++ b/src/Driver/Traits/PDOTrait.php @@ -202,7 +202,7 @@ protected function getPDO(): PDO * * @throws DriverException */ - private function flattenParameters(array $parameters): array + protected function flattenParameters(array $parameters): array { $flatten = []; foreach ($parameters as $key => $parameter) { @@ -263,7 +263,7 @@ private function flattenParameters(array $parameters): array * @param ParameterInterface[] $parameters Named hash of ParameterInterface. * @return Statement */ - private function bindParameters(Statement $statement, array $parameters): Statement + protected function bindParameters(Statement $statement, array $parameters): Statement { foreach ($parameters as $index => $parameter) { if (is_numeric($index)) {