storage enhancements
[m6w6/pq-gateway] / tests / setup.inc
index 3a639a5af0f8ca13c65c3450f665b11e3f4b2809..753cb370c50b052f31820e7ac3020da48a2be31d 100644 (file)
@@ -30,7 +30,8 @@ const PQ_TEST_SETUP_SQL = <<<SQL
        drop table if exists reftest cascade;
        create table reftest (
                test_id integer not null references test on delete cascade,
-               another_test_id integer not null references test on delete cascade
+               another_test_id integer not null references test on delete cascade,
+               primary key(test_id, another_test_id)
        );
        
        insert into test values (default, 'yesterday', -1, -1.1, 'yesterday', '{-1,0,1}');
@@ -49,11 +50,13 @@ SQL;
 
 require_once __DIR__ . "/../vendor/autoload.php";
 
-function executeInConcurrentTransaction(ExecutorInterface $exec, $sql, array $params = null) {
+function executeInConcurrentTransaction(ExecutorInterface $exec, $sql, array $params = array()) {
        $conn = $exec->getConnection();
-       $exec->setConnection(new Connection(PQ_TEST_DSN));
-       $exec->execute(new Writer($sql, $params), function(){});
+       $xact = (new Connection(PQ_TEST_DSN))->startTransaction();
+       $exec->setConnection($xact->connection);
+       $exec->execute(new Writer($sql, $params));
        $exec->setConnection($conn);
+       return $xact;
 }
 
 class QueryLogger implements SplObserver
@@ -82,21 +85,32 @@ class QueryLogger implements SplObserver
                                date_create()->format("Y-m-d H:i:s"),
                                json_encode($result));
                } elseif (($query = $executor->getQuery())) {
-                       fprintf($this->fp, "[%s] Q %s %% %s\n", 
+                       $executor->getConnection()->exec("SELECT pg_backend_pid()")->fetchCol($pid);
+                       fprintf($this->fp, "[%s] Q %s %% %s @%d\n",
                                date_create()->format("Y-m-d H:i:s"),
                                preg_replace("/\s+/", " ", $query), 
-                               json_encode($query->getParams()));
+                               json_encode($query->getParams()),
+                               $pid);
                }
        }
 }
 
 class TestModel implements JsonSerializable {
        private $id, $created, $counter, $number, $data, $list, $prop;
+       private $ref1, $ref2;
 
        function jsonSerialize() {
                return get_object_vars($this);
        }
 
+       function __get($p) {
+               return $this->$p;
+       }
+
+       function __set($p, $v) {
+               $this->$p = $v;
+       }
+
        /**
         * @param Mapper $mapper
         * @return MapInterface
@@ -111,7 +125,34 @@ class TestModel implements JsonSerializable {
                        $mapper->mapField("number"),
                        $mapper->mapField("data"),
                        $mapper->mapField("list"),
-                       $mapper->mapField("prop")
+                       $mapper->mapField("prop"),
+                       $mapper->mapAll("ref1")->to(RefTestModel::class)->by("test"),
+                       $mapper->mapAll("ref2")->to(RefTestModel::class)->by("another_test")
                );
        }
 }
+
+class RefTestModel
+{
+       private $pk1, $pk2;
+       private $one, $two;
+
+       function __get($p) {
+               return $this->$p;
+       }
+
+       function __set($p, $v) {
+               $this->$p = $v;
+       }
+       
+       static function mapAs($mapper) {
+               return new Map(
+                       __CLASS__,
+                       new Table("reftest"),
+                       $mapper->mapField("pk1", "test_id"),
+                       $mapper->mapField("pk2", "another_test_id"),
+                       $mapper->mapRef("one")->to(TestModel::class)->by("test"),
+                       $mapper->mapRef("two")->to(TestModel::class)->by("another_test")
+               );
+       }
+}
\ No newline at end of file