Skip to content

Commit

Permalink
Merge pull request #262 from v-kigos/PHP-7.0-Linux
Browse files Browse the repository at this point in the history
Test: Streaming with char encoding
  • Loading branch information
v-dareck authored Jan 31, 2017
2 parents e8a0d3e + d74537d commit bdcbc7e
Show file tree
Hide file tree
Showing 5 changed files with 267 additions and 0 deletions.
79 changes: 79 additions & 0 deletions test/pdo_sqlsrv/pdo_022_xml_bind_value.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
--TEST--
Unicode XML message using bindValue()
--SKIPIF--
--FILE--
<?php
require_once("autonomous_setup.php");

// Connect
$conn = new PDO("sqlsrv:server=$serverName;", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Create database
$conn->query("CREATE DATABASE ". $dbName) ?: die();

// Create table
$sql = "CREATE TABLE $tableName (ID INT PRIMARY KEY NOT NULL IDENTITY, XMLMessage XML)";
$stmt = $conn->query($sql);

// XML samples
$xml1 = '<?xml version="1.0" encoding="UTF-16"?>
<PTag>
<CTag01>APP_PoP_银河</CTag01>
<CTag02>Το Παρίσι (γαλλικά: Paris, ΔΦΑ [paˈʁi]), γνωστό και ως η Πόλη του φωτός (Ville lumière), από τότε που εφοδιάστηκαν οι κύριες λεωφόροι του με φανούς γκαζιού το 1828, είναι η πρωτεύουσα της Γαλλίας και της περιφέρειας Ιλ ντε Φρανς (Île-de-France) και μία από τις ιστορικότερες πόλεις της Ευρώπης.</CTag02>
</PTag>';

$xml2 = '<?xml version="1.0" encoding="utf-16"?>
<PTag>
<CTag01>NULL</CTag01>
<CTag02></CTag02>
</PTag>';

// Insert data
try
{
$stmt = $conn->prepare("INSERT INTO $tableName (XMLMessage) VALUES (:msg)");
$stmt->bindValue(':msg', $xml1);
$stmt->execute();

$stmt = $conn->prepare("INSERT INTO $tableName (XMLMessage) VALUES (?)");
$stmt->bindValue(1, $xml2);
$stmt->execute();
}
catch (PDOException $ex) {
echo "Error: " . $ex->getMessage();
}

// Get data
$stmt = $conn->query("select * from $tableName");
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($row);

// Drop database
$conn->query("DROP DATABASE ". $dbName) ?: die();

// Close connection
$stmt=null;
$conn=null;

print "Done"
?>

--EXPECT--
array(2) {
[0]=>
array(2) {
["ID"]=>
string(1) "1"
["XMLMessage"]=>
string(553) "<PTag><CTag01>APP_PoP_银河</CTag01><CTag02>Το Παρίσι (γαλλικά: Paris, ΔΦΑ [paˈʁi]), γνωστό και ως η Πόλη του φωτός (Ville lumière), από τότε που εφοδιάστηκαν οι κύριες λεωφόροι του με φανούς γκαζιού το 1828, είναι η πρωτεύουσα της Γαλλίας και της περιφέρειας Ιλ ντε Φρανς (Île-de-France) και μία από τις ιστορικότερες πόλεις της Ευρώπης.</CTag02></PTag>"
}
[1]=>
array(2) {
["ID"]=>
string(1) "2"
["XMLMessage"]=>
string(43) "<PTag><CTag01>NULL</CTag01><CTag02/></PTag>"
}
}
Done
48 changes: 48 additions & 0 deletions test/sqlsrv/srv_013_sqlsrv_get_field.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
--TEST--
sqlsrv_get_field() using SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR)
--SKIPIF--
--FILE--
<?php

require_once("autonomous_setup.php");

// Connect
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( !$conn ) { die( print_r( sqlsrv_errors(), true)); }

// Create table
$query = "CREATE TABLE #TA1 (ID NVARCHAR(10))";
$stmt = sqlsrv_query($conn, $query);

// Insert data
$query = "INSERT INTO #TA1 VALUES ('1998.1'),('-2004.2436'),('4.2 EUR')";
$stmt = sqlsrv_query($conn, $query) ?: die( print_r( sqlsrv_errors(), true) );

// Fetch data
$query = "SELECT * FROM #TA1";
$stmt = sqlsrv_query( $conn, $query ) ?: die( print_r( sqlsrv_errors(), true) );

while(sqlsrv_fetch($stmt)) {
$field = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR));
var_dump($field);

while(!feof($field))
{
echo fread($field, 100)."\n";
}
}

// Close connection
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
print "Done"
?>

--EXPECT--
resource(9) of type (stream)
1998.1
resource(10) of type (stream)
-2004.2436
resource(11) of type (stream)
4.2 EUR
Done
55 changes: 55 additions & 0 deletions test/sqlsrv/srv_047_stream_nvarchar.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
--TEST--
Streaming nvarchar(max) unicode (Russian) with CharacterSet=utf-8
--SKIPIF--
--FILE--
<?php

require_once("autonomous_setup.php");

// Connect
$connectionInfo = array("UID"=>$username, "PWD"=>$password, "CharacterSet"=>"utf-8");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if( !$conn ) { die( print_r( sqlsrv_errors(), true)); }

// Create table
$sql = "CREATE TABLE #Table (c1 NVARCHAR(max))";
$stmt = sqlsrv_query($conn, $sql);
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); }

// Insert data, 4538 characters
$data = "Первые публикации об объектно-ориентированных базах данных появились в середине 80-х годов. Поддержка сложных объектов. В системе должна быть предусмотрена возможность создания составных объектов за счет применения конструкторов составных объектов. Необходимо, чтобы конструкторы объектов были ортогональны, то есть любой конструктор можно было применять к любому объекту. Поддержка индивидуальности объектов. Все объекты должны иметь уникальный идентификатор, который не зависит от значений их атрибутов. Поддержка инкапсуляции. Корректная инкапсуляция достигается за счет того, что программисты обладают правом доступа только к спецификации интерфейса методов, а данные и реализация методов скрыты внутри объектов. Поддержка типов и классов. Требуется, чтобы в ООБД поддерживалась хотя бы одна концепция различия между типами и классами. (Термин «тип» более соответствует понятию абстрактного типа данных. В языках программирования переменная объявляется с указанием её типа. Компилятор может использовать эту информацию для проверки выполняемых с переменной операций на совместимость с её типом, что позволяет гарантировать корректность программного обеспечения. С другой стороны класс является неким шаблоном для создания объектов и предоставляет методы, которые могут применяться к этим объектам. Таким образом, понятие «класс» в большей степени относится ко времени исполнения, чем ко времени компиляции.) Поддержка наследования типов и классов от их предков. Подтип, или подкласс, должен наследовать атрибуты и методы от его супертипа, или суперкласса, соответственно. Перегрузка в сочетании с полным связыванием. Методы должны применяться к объектам разных типов. Реализация метода должна зависеть от типа объектов, к которым данный метод применяется. Для обеспечения этой функциональности связывание имен методов в системе не должно выполняться до времени выполнения программы. Вычислительная полнота. Язык манипулирования данными должен быть языком программирования общего назначения. Набор типов данных должен быть расширяемым. Пользователь должен иметь средства создания новых типов данных на основе набора предопределенных системных типов. Более того, между способами использования системных и пользовательских типов данных не должно быть никаких различий.Первые публикации об объектно-ориентированных базах данных появились в середине 80-х годов. Поддержка сложных объектов. В системе должна быть предусмотрена возможность создания составных объектов за счет применения конструкторов составных объектов. Необходимо, чтобы конструкторы объектов были ортогональны, то есть любой конструктор можно было применять к любому объекту. Поддержка индивидуальности объектов. Все объекты должны иметь уникальный идентификатор, который не зависит от значений их атрибутов. Поддержка инкапсуляции. Корректная инкапсуляция достигается за счет того, что программисты обладают правом доступа только к спецификации интерфейса методов, а данные и реализация методов скрыты внутри объектов. Поддержка типов и классов. Требуется, чтобы в ООБД поддерживалась хотя бы одна концепция различия между типами и классами. (Термин «тип» более соответствует понятию абстрактного типа данных. В языках программирования переменная объявляется с указанием её типа. Компилятор может использовать эту информацию для проверки выполняемых с переменной операций на совместимость с её типом, что позволяет гарантировать корректность программного обеспечения. С другой стороны класс является неким шаблоном для создания объектов и предоставляет методы, которые могут применяться к этим объектам. Таким образом, понятие «класс» в большей степени относится ко времени исполнения, чем ко времени компиляции.) Поддержка наследования типов и классов от их предков. Подтип, или подкласс, должен наследовать атрибуты и методы от его супертипа, или суперкласса, соответственно. Перегрузка в сочетании с полным связыванием. Методы должны применяться к объектам разных типов. Реализация метода должна зависеть от типа объектов, к которым данный метод применяется. Для обеспечения этой функциональности связывание имен методов в системе не должно выполняться до времени выполнения программы. Вычислительная полнота. Язык манипулирования данными должен быть языком программирования общего назначения. Набор типов данных должен быть расширяемым. Пользователь должен иметь средства создания новых типов данных на основе набора предопределенных системных типов. Более того, между способами использования системных и пользовательских типов данных не должно быть никаких различий.";
$sql = "INSERT INTO #Table VALUES (N'$data')";
$stmt = sqlsrv_query($conn, $sql);
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); }

// Query and fetch
$sql = "SELECT * FROM #Table";
$stmt = sqlsrv_query($conn, $sql);
if( !$stmt ) { die( print_r( sqlsrv_errors(), true)); }
sqlsrv_fetch($stmt);

// Get the data
$field = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STREAM('utf-8'));
$out = "";
while(!feof($field))
{
$out .= fread($field, 512);
}

// Output string length
var_dump(strlen($out));

// Compare output
echo ($out === $data) ? "True\n" : "False\n";

// Close connection
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);

print "Done";
?>

--EXPECT--
int(8408)
True
Done
Loading

0 comments on commit bdcbc7e

Please sign in to comment.