Browse Source

Replace regex with instanceof check.

The hexadecimal check could get very expensive with big blobs. Instead
we can sniff out the Sqlserver class and change behavior based on that.

In order for the SQLServer driver to be loadable in environments where
pdo_sqlsrv is not installed a constant needed to be replaced with an
integer.
Mark Story 11 years ago
parent
commit
2d6ab89201

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

@@ -39,7 +39,8 @@ class Sqlserver extends \Cake\Database\Driver
         'username' => '',
         'password' => '',
         'database' => 'cake',
-        'encoding' => PDO::SQLSRV_ENCODING_UTF8,
+        // PDO::SQLSRV_ENCODING_UTF8
+        'encoding' => 65001,
         'flags' => [],
         'init' => [],
         'settings' => [],

+ 2 - 1
src/Database/Type/BinaryType.php

@@ -16,6 +16,7 @@ namespace Cake\Database\Type;
 
 use Cake\Core\Exception\Exception;
 use Cake\Database\Driver;
+use Cake\Database\Driver\Sqlserver;
 use Cake\Database\Type;
 use PDO;
 
@@ -55,7 +56,7 @@ class BinaryType extends Type
         if ($value === null) {
             return null;
         }
-        if (is_string($value) && preg_match('/^[a-zA-Z0-9]+$/', $value)) {
+        if (is_string($value) && $driver instanceof Sqlserver) {
             $value = pack('H*', $value);
         }
         if (is_string($value)) {

+ 14 - 4
tests/TestCase/Database/Type/BinaryTypeTest.php

@@ -46,10 +46,6 @@ class BinaryTypeTest extends TestCase
     {
         $this->assertNull($this->type->toPHP(null, $this->driver));
 
-        $result = $this->type->toPHP('536F6D652076616C7565', $this->driver);
-        $this->assertInternalType('resource', $result);
-        $this->assertSame('Some value', stream_get_contents($result));
-
         $result = $this->type->toPHP('some data', $this->driver);
         $this->assertInternalType('resource', $result);
 
@@ -60,6 +56,20 @@ class BinaryTypeTest extends TestCase
     }
 
     /**
+     * SQLServer returns binary fields as hexidecimal
+     * Ensure decoding happens for SQLServer drivers
+     *
+     * @return void
+     */
+    public function testToPHPSqlserver()
+    {
+        $driver = $this->getMock('Cake\Database\Driver\Sqlserver', [], [], '', false);
+        $result = $this->type->toPHP('536F6D652076616C7565', $driver);
+        $this->assertInternalType('resource', $result);
+        $this->assertSame('Some value', stream_get_contents($result));
+    }
+
+    /**
      * Test exceptions on invalid data.
      *
      * @expectedException \Cake\Core\Exception\Exception