PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/hphp/test/zend/bad/ext/pdo_mysql/tests/pdo_mysql_begintransaction.php

http://github.com/facebook/hiphop-php
PHP | 175 lines | 160 code | 13 blank | 2 comment | 19 complexity | f5b9f353dc598d987c6868be59ca198f MD5 | raw file
Possible License(s): LGPL-2.1, BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, MIT, LGPL-2.0, Apache-2.0
  1. <?php
  2. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  3. $db = MySQLPDOTest::factory();
  4. MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
  5. if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  6. printf("[001] Autocommit should be on by default\n");
  7. if (false == $db->beginTransaction())
  8. printf("[002] Cannot start a transaction, [%s] [%s]\n",
  9. $db->errorCode(), implode(' ', $db->errorInfo()));
  10. if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  11. printf("[003] Autocommit should be on by default, beginTransaction() shall not impact it\n");
  12. if (0 == $db->exec('DELETE FROM test'))
  13. printf("[004] No rows deleted, can't be true.\n");
  14. /* This is the PDO way to close a connection */
  15. $db = null;
  16. $db = MySQLPDOTest::factory();
  17. /* Autocommit was off - by definition. Commit was not issued. DELETE should have been rolled back. */
  18. if (!($stmt = $db->query('SELECT id, label FROM test ORDER BY id ASC')))
  19. printf("[005] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  20. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  21. var_dump($row);
  22. if (!$db->beginTransaction())
  23. printf("[006] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  24. if (1 !== $db->exec(sprintf('DELETE FROM test WHERE id = %d', $row['id'])))
  25. printf("[007] DELETE should have indicated 1 deleted row, [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  26. if (!$db->commit())
  27. printf("[008] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  28. if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  29. printf("[009] Autocommit should be on after commit()\n");
  30. if (!($stmt = $db->query(sprintf('SELECT id, label FROM test WHERE id = %d', $row['id']))))
  31. printf("[010] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  32. var_dump($stmt->fetch(PDO::FETCH_ASSOC));
  33. if (!$db->beginTransaction())
  34. printf("[011] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  35. $db->exec(sprintf("INSERT INTO test(id, label) VALUES (%d, 'z')", $row['id']));
  36. if (!($stmt = $db->query(sprintf('SELECT id, label FROM test WHERE id = %d', $row['id']))))
  37. printf("[012] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  38. $new_row1 = $stmt->fetch(PDO::FETCH_ASSOC);
  39. var_dump($new_row1);
  40. if (!$db->commit())
  41. printf("[013] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  42. if (!($stmt = $db->query(sprintf('SELECT id, label FROM test WHERE id = %d', $row['id']))))
  43. printf("[014] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  44. $new_row2 = $stmt->fetch(PDO::FETCH_ASSOC);
  45. if ($new_row1 != $new_row2) {
  46. printf("[015] Results must not differ!\n");
  47. var_dump($new_row1);
  48. var_dump($new_row2);
  49. }
  50. if (!$db->beginTransaction())
  51. printf("[016] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  52. if (1 !== $db->exec(sprintf('DELETE FROM test WHERE id = %d', $row['id'])))
  53. printf("[017] DELETE should have indicated 1 deleted row, [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  54. if (!$db->rollback())
  55. printf("[018] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  56. if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  57. printf("[019] Autocommit should be on after rollback\n");
  58. if (!($stmt = $db->query(sprintf('SELECT id, label FROM test WHERE id = %d', $row['id']))))
  59. printf("[020] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  60. $new_row2 = $stmt->fetch(PDO::FETCH_ASSOC);
  61. if ($new_row1 != $new_row2) {
  62. printf("[021] Results must not differ!\n");
  63. var_dump($new_row1);
  64. var_dump($new_row2);
  65. }
  66. // now, lets check the server variables
  67. if (!($stmt = $db->query('SELECT @@autocommit as auto_commit')))
  68. printf("[022] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  69. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  70. if ($tmp['auto_commit'] != 1)
  71. printf("[023] MySQL Server should indicate autocommit mode, expecting 1, got '%s', [%d] %s\n",
  72. $tmp['auto_commit'], $stmt->errorCode(), $stmt->errorInfo());
  73. if (!$db->beginTransaction())
  74. printf("[024] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  75. if (!($stmt = $db->query('SELECT @@autocommit as auto_commit')))
  76. printf("[025] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  77. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  78. if ($tmp['auto_commit'] != 0)
  79. printf("[026] Autocommit mode of the MySQL Server should be off, got '%s', [%d] %s\n",
  80. $tmp['auto_commit'], $stmt->errorCode(), trim(implode(' ', $stmt->errorInfo())));
  81. $db->commit();
  82. // Now we should be back to autocommit - we've issues a commit
  83. if ($tmp['auto_commit'] != 1)
  84. printf("[027] MySQL Server should indicate autocommit mode, expecting 1, got '%s', [%d] %s\n",
  85. $tmp['auto_commit'], $stmt->errorCode(), $stmt->errorInfo());
  86. // Turn off autocommit using a server variable
  87. $db->exec('SET @@autocommit = 0');
  88. if (1 === $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  89. printf("[028] I'm confused, how can autocommit be on? Didn't I say I want to manually control transactions?\n");
  90. if (!$db->beginTransaction())
  91. printf("[029] Cannot start a transaction, [%d] %s\n",
  92. $db->errorCode(), implode(' ', $db->errorInfo()));
  93. try {
  94. if (false !== $db->beginTransaction()) {
  95. printf("[030] No false and no exception - that's wrong.\n");
  96. }
  97. } catch (PDOException $e) {
  98. assert($e->getMessage() != '');
  99. }
  100. // TODO: What about an engine that does not support transactions?
  101. $db = MySQLPDOTest::factory();
  102. MySQLPDOTest::createTestTable($db, 'MyISAM');
  103. if (false == $db->beginTransaction())
  104. printf("[031] Cannot start a transaction, [%s] [%s]\n",
  105. $db->errorCode(), implode(' ', $db->errorInfo()));
  106. if (1 !== $db->getAttribute(PDO::ATTR_AUTOCOMMIT))
  107. printf("[032] Autocommit should be on my default, beginTransaction() should not change that\n");
  108. if (0 == $db->exec('DELETE FROM test'))
  109. printf("[033] No rows deleted, can't be true.\n");
  110. if (!$db->commit())
  111. printf("[034] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  112. if (false == $db->beginTransaction())
  113. printf("[035] Cannot start a transaction, [%s] [%s]\n",
  114. $db->errorCode(), implode(' ', $db->errorInfo()));
  115. if (0 == $db->exec("INSERT INTO test(id, label) VALUES (1, 'a')"))
  116. printf("[036] Cannot insert data, [%s] [%s]\n",
  117. $db->errorCode(), implode(' ', $db->errorInfo()));
  118. // Should cause a Server warning but no error
  119. if (!$db->rollback())
  120. printf("[037] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
  121. var_dump($db->errorCode());
  122. if (1 != $db->exec('DELETE FROM test'))
  123. printf("[038] No rows deleted, can't be true.\n");
  124. print "done!";
  125. ?>
  126. <?php
  127. require dirname(__FILE__) . '/mysql_pdo_test.inc';
  128. MySQLPDOTest::dropTestTable();
  129. ?>