Browse Source

Merge pull request #3533 from dakota/3.0-sqlsrv-binary

Add SQL Server statement class for binary inserts
José Lorenzo Rodríguez 12 years ago
parent
commit
fc60537cab
2 changed files with 47 additions and 2 deletions
  1. 2 2
      src/Database/Driver/Sqlserver.php
  2. 45 0
      src/Database/Statement/SqlserverStatement.php

+ 2 - 2
src/Database/Driver/Sqlserver.php

@@ -15,7 +15,7 @@
 namespace Cake\Database\Driver;
 
 use Cake\Database\Dialect\SqlserverDialectTrait;
-use Cake\Database\Statement\PDOStatement;
+use Cake\Database\Statement\SqlserverStatement;
 use PDO;
 
 /**
@@ -100,7 +100,7 @@ class Sqlserver extends \Cake\Database\Driver {
 	public function prepare($query) {
 		$this->connect();
 		$statement = $this->_connection->prepare((string)$query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
-		return new PDOStatement($statement, $this);
+		return new SqlserverStatement($statement, $this);
 	}
 
 }

+ 45 - 0
src/Database/Statement/SqlserverStatement.php

@@ -0,0 +1,45 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         3.0.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Database\Statement;
+
+use Cake\Database\Statement\PDOStatement;
+use PDO;
+
+/**
+ * Statement class meant to be used by an Sqlserver driver
+ *
+ */
+class SqlserverStatement extends PDOStatement {
+
+/**
+ * {@inheritDoc}
+ *
+ * The SQL Server PDO driver requires that binary parameters be bound with the SQLSRV_ENCODING_BINARY attribute.
+ * This overrides the PDOStatement::bindValue method in order to bind binary columns using the required attribute.
+ */
+	public function bindValue($column, $value, $type = 'string') {
+		if ($type === null) {
+			$type = 'string';
+		}
+		if (!ctype_digit($type)) {
+			list($value, $type) = $this->cast($value, $type);
+		}
+		if ($type == PDO::PARAM_LOB) {
+			$this->_statement->bindParam($column, $value, $type, 0, PDO::SQLSRV_ENCODING_BINARY);
+		} else {
+			$this->_statement->bindValue($column, $value, $type);
+		}
+	}
+}