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}');
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
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
$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