6 use pq\Mapper\MapInterface;
8 use pq\Query\ExecutorInterface;
11 ini_set("date.timezone", "UTC");
12 ini_set("error_reporting", E_ALL);
14 define("PQ_TEST_DSN", getenv("PQ_TEST_DSN"));
16 const PQ_TEST_SETUP_SQL = <<<SQL
17 create extension if not exists hstore;
19 drop table if exists test cascade;
21 id serial primary key,
30 drop table if exists reftest cascade;
31 create table reftest (
32 test_id integer not null references test on delete cascade,
33 another_test_id integer not null references test on delete cascade,
34 primary key(test_id, another_test_id)
37 insert into test values (default, 'yesterday', -1, -1.1, 'yesterday', '{-1,0,1}');
38 insert into test values (default, 'today', 0, 0, 'today', '{0,1,2}');
39 insert into test values (default, 'tomorrow', 1, 1.1, 'tomorrow', '{1,2,3}');
41 insert into reftest values (1,3);
42 insert into reftest values (2,2);
43 insert into reftest values (3,1);
46 const PQ_TEST_TEARDOWN_SQL = <<<SQL
47 drop table if exists test cascade;
48 drop table if exists reftest cascade;
51 require_once __DIR__ . "/../vendor/autoload.php";
53 function executeInConcurrentTransaction(ExecutorInterface $exec, $sql, array $params = null) {
54 $conn = $exec->getConnection();
55 $exec->setConnection(new Connection(PQ_TEST_DSN));
56 $exec->execute(new Writer($sql, $params), function(){});
57 $exec->setConnection($conn);
60 class QueryLogger implements SplObserver
64 function __construct($logfile = null) {
65 if (!isset($logfile)) {
66 $logfile = __DIR__."/query.log";
68 if (!$this->fp = @fopen($logfile, "a")) {
69 throw new RuntimeException(error_get_last()["message"]);
73 function __destruct() {
74 if (is_resource($this->fp)) {
79 function update(SplSubject $executor) {
80 $result = $executor->getResult();
82 fprintf($this->fp, "[%s] R %s\n",
83 date_create()->format("Y-m-d H:i:s"),
84 json_encode($result));
85 } elseif (($query = $executor->getQuery())) {
86 fprintf($this->fp, "[%s] Q %s %% %s\n",
87 date_create()->format("Y-m-d H:i:s"),
88 preg_replace("/\s+/", " ", $query),
89 json_encode($query->getParams()));
94 class TestModel implements JsonSerializable {
95 private $id, $created, $counter, $number, $data, $list, $prop;
98 function jsonSerialize() {
99 return get_object_vars($this);
106 function __set($p, $v) {
111 * @param Mapper $mapper
112 * @return MapInterface
114 static function mapAs(Mapper $mapper) {
118 $mapper->mapField("id"),
119 $mapper->mapField("created"),
120 $mapper->mapField("counter"),
121 $mapper->mapField("number"),
122 $mapper->mapField("data"),
123 $mapper->mapField("list"),
124 $mapper->mapField("prop"),
125 $mapper->mapAll("ref1")->to(RefTestModel::class)->by("test"),
126 $mapper->mapAll("ref2")->to(RefTestModel::class)->by("another_test")
140 function __set($p, $v) {
144 static function mapAs($mapper) {
147 new Table("reftest"),
148 $mapper->mapField("pk1", "test_id"),
149 $mapper->mapField("pk2", "another_test_id"),
150 $mapper->mapRef("one")->to(TestModel::class)->by("test"),
151 $mapper->mapRef("two")->to(TestModel::class)->by("another_test")