icingaweb2-module-director/library/Director/Data/Db/DbObjectStore.php

95 lines
2.7 KiB
PHP

<?php
namespace Icinga\Module\Director\Data\Db;
use Icinga\Module\Director\Db;
use Icinga\Module\Director\Db\Branch\Branch;
use Icinga\Module\Director\Db\Branch\BranchActivity;
use Icinga\Module\Director\Db\Branch\BranchedObject;
use Ramsey\Uuid\UuidInterface;
/**
* Loader for Icinga/DbObjects
*
* Is aware of branches and prefetching. I would prefer to see a StoreInterface,
* with one of the above wrapping the other. But for now, this helps to clean things
* up
*/
class DbObjectStore
{
/** @var Db */
protected $connection;
/** @var ?Branch */
protected $branch;
public function __construct(Db $connection, Branch $branch = null)
{
$this->connection = $connection;
$this->branch = $branch;
}
/**
* @param $tableName
* @param UuidInterface $uuid
* @return DbObject|null
* @throws \Icinga\Exception\NotFoundError
*/
public function load($tableName, UuidInterface $uuid)
{
$branchedObject = BranchedObject::load($this->connection, $tableName, $uuid, $this->branch);
$object = $branchedObject->getBranchedDbObject($this->connection);
if ($object === null) {
return null;
}
$object->setBeingLoadedFromDb();
return $object;
}
public function exists($tableName, UuidInterface $uuid)
{
return BranchedObject::exists($this->connection, $tableName, $uuid, $this->branch->getUuid());
}
public function store(DbObject $object)
{
if ($this->branch && $this->branch->isBranch()) {
$activity = BranchActivity::forDbObject($object, $this->branch);
$this->connection->runFailSafeTransaction(function () use ($activity) {
$activity->store($this->connection);
BranchedObject::withActivity($activity, $this->connection)->store($this->connection);
});
return true;
} else {
return $object->store($this->connection);
}
}
public function delete(DbObject $object)
{
if ($this->branch && $this->branch->isBranch()) {
$activity = BranchActivity::deleteObject($object, $this->branch);
$this->connection->runFailSafeTransaction(function () use ($activity) {
$activity->store($this->connection);
BranchedObject::load(
$this->connection,
$activity->getObjectTable(),
$activity->getObjectUuid(),
$this->branch
)->delete($this->connection);
});
return true;
}
return $object->delete();
}
public function getBranch()
{
return $this->branch;
}
}