1--TEST--
2mysqli_begin_transaction()
3--EXTENSIONS--
4mysqli
5--SKIPIF--
6<?php
7require_once 'skipifconnectfailure.inc';
8
9require_once 'connect.inc';
10if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
11    die(sprintf("skip Cannot connect, [%d] %s", mysqli_connect_errno(), mysqli_connect_error()));
12
13if (!have_innodb($link))
14    die(sprintf("skip Needs InnoDB support, [%d] %s", $link->errno, $link->error));
15?>
16--FILE--
17<?php
18    require_once 'connect.inc';
19    if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
20        printf("[004] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
21            $host, $user, $db, $port, $socket);
22
23    if (!mysqli_query($link, 'DROP TABLE IF EXISTS test'))
24        printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
25
26    if (!mysqli_query($link, 'CREATE TABLE test(id INT) ENGINE = InnoDB'))
27        printf("[009] Cannot create test table, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
28
29    if (true !== ($tmp = mysqli_autocommit($link, true)))
30        printf("[010] Cannot turn on autocommit, expecting true, got %s/%s\n", gettype($tmp), $tmp);
31
32    /* overrule autocommit */
33    if (true !== ($tmp = mysqli_begin_transaction($link)))
34        printf("[011] Got %s - [%d] %s\n", var_dump($tmp, true), mysqli_errno($link), mysqli_error($link));
35
36    if (!mysqli_query($link, 'INSERT INTO test(id) VALUES (1)'))
37        printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
38
39    $tmp = mysqli_rollback($link);
40    if ($tmp !== true)
41        printf("[013] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
42
43    /* empty */
44    $res = mysqli_query($link, "SELECT * FROM test");
45    var_dump($res->fetch_assoc());
46
47    /* valid flags */
48    $flags = array(MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT);
49
50    if (mysqli_get_server_version($link) >= 50605) {
51        $flags[] = MYSQLI_TRANS_START_READ_WRITE;
52        $flags[] = MYSQLI_TRANS_START_READ_ONLY;
53    }
54
55    /* just coverage */
56    foreach ($flags as $flag) {
57        if (!mysqli_begin_transaction($link, $flag, sprintf("flag %d", $flag))) {
58            printf("[014] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
59        }
60        if (!mysqli_query($link, 'SELECT * FROM test') || !mysqli_rollback($link)) {
61            printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
62        }
63    }
64
65    /* does it really set a flag? */
66    if (mysqli_get_server_version($link) >= 50605) {
67        if (!mysqli_begin_transaction($link, MYSQLI_TRANS_START_READ_ONLY, sprintf("flag %d", $flag))) {
68            printf("[016] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
69        }
70        if (mysqli_query($link, "INSERT INTO test(id) VALUES (2)")) {
71            printf("[017] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
72        } else if (!mysqli_commit($link)) {
73            printf("[018] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
74        } else {
75            $res = mysqli_query($link, "SELECT id FROM test WHERE id = 2");
76        }
77    }
78
79    try {
80        mysqli_begin_transaction($link, -1);
81        printf("[019] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
82    } catch (\ValueError $e) {
83        echo $e->getMessage() . \PHP_EOL;
84    }
85
86    if (mysqli_get_server_version($link) >= 50605) {
87        /* does it like stupid names? */
88        if (@!$link->begin_transaction(MYSQLI_TRANS_START_READ_WRITE, "*/trick me?\n\0"))
89                printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
90
91        /* does it like stupid names? */
92        if (@!$link->begin_transaction(MYSQLI_TRANS_START_READ_WRITE, "az09"))
93            printf("[021] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
94    }
95
96    print "done!";
97?>
98--CLEAN--
99<?php
100    require_once 'clean_table.inc';
101?>
102--EXPECT--
103NULL
104mysqli_begin_transaction(): Argument #2 ($flags) must be one of the MYSQLI_TRANS_* constants
105done!
106