add identity and lock
[m6w6/pq-gateway] / tests / setup.inc
1 <?php
2
3 const PQ_TEST_DSN = "";
4
5 const PQ_TEST_TABLE_CREATE = <<<SQL
6 drop table if exists test cascade;
7 create table test (
8 id serial primary key,
9 created timestamp,
10 counter int,
11 number decimal,
12 data text
13 )
14 SQL;
15
16 const PQ_TEST_TABLE_DROP = <<<SQL
17 drop table if exists test cascade;
18 SQL;
19
20 const PQ_TEST_REFTABLE_CREATE = <<<SQL
21 drop table if exists reftest cascade;
22 create table reftest (
23 test_id integer not null references test on delete cascade,
24 another_test_id integer not null references test on delete cascade
25 );
26 SQL;
27
28 const PQ_TEST_REFTABLE_DROP = <<<SQL
29 drop table if exists reftest cascade;
30 SQL;
31
32 const PQ_TEST_DATA = <<<SQL
33 insert into test values (default, 'yesterday', -1, -1.1, 'yesterday');
34 insert into test values (default, 'today', 0, 0, 'today');
35 insert into test values (default, 'tomorrow', 1, 1.1, 'tomorrow');
36
37 insert into reftest values (1,3);
38 insert into reftest values (2,2);
39 insert into reftest values (3,1);
40 SQL;
41
42 spl_autoload_register(function($c) {
43 if (substr($c,0,3) == "pq\\") return require_once sprintf("%s/../lib/%s.php", __DIR__, strtr($c, "\\", "/"));
44 });
45
46 function executeInConcurrentTransaction(\pq\Query\ExecutorInterface $exec, $sql, array $params = null) {
47 $conn = $exec->getConnection();
48 $exec->setConnection(new pq\Connection(PQ_TEST_DSN));
49 $exec->execute(new \pq\Query\Writer($sql, $params), function(){});
50 $exec->setConnection($conn);
51 }
52
53 class QueryLogger implements \SplObserver
54 {
55 protected $fp;
56
57 function __construct($logfile = null) {
58 if (!isset($logfile)) {
59 $logfile = __DIR__."/query.log";
60 }
61 if (!$this->fp = @fopen($logfile, "a")) {
62 throw new \RuntimeException(error_get_last()["message"]);
63 }
64 }
65
66 function __destruct() {
67 if (is_resource($this->fp)) {
68 fclose($this->fp);
69 }
70 }
71
72 function update(\SplSubject $executor) {
73 $result = $executor->getResult();
74 if (isset($result)) {
75 fprintf($this->fp, "[%s] R %s\n",
76 date_create()->format("Y-m-d H:i:s"),
77 json_encode([
78 "S" => $result->statusMessage,
79 "N" => $result->numRows,
80 "C" => $result->numCols,
81 "A" => $result->affectedRows
82 ]));
83 } elseif (($query = $executor->getQuery())) {
84 fprintf($this->fp, "[%s] Q %s %% %s\n",
85 date_create()->format("Y-m-d H:i:s"),
86 preg_replace("/\s+/", " ", $query),
87 json_encode($query->getParams()));
88 }
89 }
90 }