3 const PQ_TEST_DSN = "";
5 const PQ_TEST_SETUP_SQL = <<<SQL
6 create extension if not exists hstore;
8 drop table if exists test cascade;
10 id serial primary key,
19 drop table if exists reftest cascade;
20 create table reftest (
21 test_id integer not null references test on delete cascade,
22 another_test_id integer not null references test on delete cascade
25 insert into test values (default, 'yesterday', -1, -1.1, 'yesterday', '{-1,0,1}');
26 insert into test values (default, 'today', 0, 0, 'today', '{0,1,2}');
27 insert into test values (default, 'tomorrow', 1, 1.1, 'tomorrow', '{1,2,3}');
29 insert into reftest values (1,3);
30 insert into reftest values (2,2);
31 insert into reftest values (3,1);
34 const PQ_TEST_TEARDOWN_SQL = <<<SQL
35 drop table if exists test cascade;
36 drop table if exists reftest cascade;
39 include_once __DIR__ . "/../lib/autoload.php";
41 function executeInConcurrentTransaction(\pq\Query\ExecutorInterface $exec, $sql, array $params = null) {
42 $conn = $exec->getConnection();
43 $exec->setConnection(new pq\Connection(PQ_TEST_DSN));
44 $exec->execute(new \pq\Query\Writer($sql, $params), function(){});
45 $exec->setConnection($conn);
48 class QueryLogger implements \SplObserver
52 function __construct($logfile = null) {
53 if (!isset($logfile)) {
54 $logfile = __DIR__."/query.log";
56 if (!$this->fp = @fopen($logfile, "a")) {
57 throw new \RuntimeException(error_get_last()["message"]);
61 function __destruct() {
62 if (is_resource($this->fp)) {
67 function update(\SplSubject $executor) {
68 $result = $executor->getResult();
70 fprintf($this->fp, "[%s] R %s\n",
71 date_create()->format("Y-m-d H:i:s"),
72 json_encode($result));
73 } elseif (($query = $executor->getQuery())) {
74 fprintf($this->fp, "[%s] Q %s %% %s\n",
75 date_create()->format("Y-m-d H:i:s"),
76 preg_replace("/\s+/", " ", $query),
77 json_encode($query->getParams()));