File: odbc_persistent_close.phpt

package info (click to toggle)
php8.4 8.4.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 208,108 kB
  • sloc: ansic: 1,060,628; php: 35,345; sh: 11,866; cpp: 7,201; pascal: 4,913; javascript: 3,091; asm: 2,810; yacc: 2,411; makefile: 689; xml: 446; python: 301; awk: 148
file content (69 lines) | stat: -rw-r--r-- 1,919 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
--TEST--
odbc_pconnect(): Make sure closing a persistent connection works
--EXTENSIONS--
odbc
--SKIPIF--
<?php

if (getenv('SKIP_ASAN')) {
    die('skip libmsodbcsql leaks, see https://github.com/php/php-src/pull/12132#issuecomment-1710392299.');
}

include 'skipif.inc';

// The test can affect multiple drivers, but testing it is driver-specific.
// Since CI runs ODBC tests with SQL Server, just use an SQL Server specific way of testing.
$conn = odbc_connect($dsn, $user, $pass);
$result = @odbc_exec($conn, "SELECT @@Version");
if ($result) {
    $array = odbc_fetch_array($result);
    $info = (string) reset($array);
    if (!str_contains($info, "Microsoft SQL Server")) {
       echo "skip MS SQL specific test";
    }
}
?>
--FILE--
<?php

include 'config.inc';

// set a session specific variable via CONTEXT_INFO, if we get the same connection again, it should be identical
function set_context_info($conn, $string) {
	$hexstring = bin2hex($string);
	return odbc_exec($conn, "SET CONTEXT_INFO 0x$hexstring");
}

function fetch_context_info($conn) {
	$stmt = odbc_exec($conn, "SELECT CONTEXT_INFO() AS CONTEXT_INFO");
	if (!$stmt) {
		return false;
	}
	$res = odbc_fetch_array($stmt);
	if ($res) {
		// this is a binary, so we get a bunch of nulls at the end
		return $res["CONTEXT_INFO"] ? trim($res["CONTEXT_INFO"]) : null;
	} else {
		return false;
	}
}

// run 1: set expectations
$conn = odbc_pconnect($dsn, $user, $pass);
set_context_info($conn, "PHP odbc_pconnect test");
var_dump(fetch_context_info($conn));

// run 2: reuse same connection (imagine this is another request)
$conn = odbc_pconnect($dsn, $user, $pass);
var_dump(fetch_context_info($conn));

// run 3: close it and see if it's the same connection
odbc_close($conn);
$conn = odbc_pconnect($dsn, $user, $pass);
var_dump(fetch_context_info($conn));

?>
--EXPECT--
string(22) "PHP odbc_pconnect test"
string(22) "PHP odbc_pconnect test"
NULL