3 ini_set("date.timezone", "UTC");
4 ini_set("error_reporting", E_ALL);
6 const PQ_TEST_DSN = "";
8 const PQ_TEST_SETUP_SQL = <<<SQL
9 create extension if not exists hstore;
11 drop table if exists test cascade;
13 id serial primary key,
22 drop table if exists reftest cascade;
23 create table reftest (
24 test_id integer not null references test on delete cascade,
25 another_test_id integer not null references test on delete cascade
28 insert into test values (default, 'yesterday', -1, -1.1, 'yesterday', '{-1,0,1}');
29 insert into test values (default, 'today', 0, 0, 'today', '{0,1,2}');
30 insert into test values (default, 'tomorrow', 1, 1.1, 'tomorrow', '{1,2,3}');
32 insert into reftest values (1,3);
33 insert into reftest values (2,2);
34 insert into reftest values (3,1);
37 const PQ_TEST_TEARDOWN_SQL = <<<SQL
38 drop table if exists test cascade;
39 drop table if exists reftest cascade;
42 include_once __DIR__ . "/../lib/autoload.php";
44 function executeInConcurrentTransaction(\pq\Query\ExecutorInterface $exec, $sql, array $params = null) {
45 $conn = $exec->getConnection();
46 $exec->setConnection(new pq\Connection(PQ_TEST_DSN));
47 $exec->execute(new \pq\Query\Writer($sql, $params), function(){});
48 $exec->setConnection($conn);
51 class QueryLogger implements \SplObserver
55 function __construct($logfile = null) {
56 if (!isset($logfile)) {
57 $logfile = __DIR__."/query.log";
59 if (!$this->fp = @fopen($logfile, "a")) {
60 throw new \RuntimeException(error_get_last()["message"]);
64 function __destruct() {
65 if (is_resource($this->fp)) {
70 function update(\SplSubject $executor) {
71 $result = $executor->getResult();
73 fprintf($this->fp, "[%s] R %s\n",
74 date_create()->format("Y-m-d H:i:s"),
75 json_encode($result));
76 } elseif (($query = $executor->getQuery())) {
77 fprintf($this->fp, "[%s] Q %s %% %s\n",
78 date_create()->format("Y-m-d H:i:s"),
79 preg_replace("/\s+/", " ", $query),
80 json_encode($query->getParams()));