mirror of
https://github.com/Icinga/icingaweb2-module-director.git
synced 2025-07-31 01:34:12 +02:00
Db/Cache: first step to externalize lookup caches
This commit is contained in:
parent
1f5f34cea5
commit
b09c4f8ef0
65
library/Director/Db/Cache/CustomVariableCache.php
Normal file
65
library/Director/Db/Cache/CustomVariableCache.php
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Icinga\Module\Director\Db\Cache;
|
||||||
|
|
||||||
|
use Icinga\Module\Director\CustomVariable\CustomVariables;
|
||||||
|
use Icinga\Module\Director\Db;
|
||||||
|
use Icinga\Module\Director\Objects\IcingaObject;
|
||||||
|
|
||||||
|
class CustomVariableCache
|
||||||
|
{
|
||||||
|
protected $type;
|
||||||
|
|
||||||
|
protected $rowsById = array();
|
||||||
|
|
||||||
|
protected $varsById = array();
|
||||||
|
|
||||||
|
public function __construct(IcingaObject $object)
|
||||||
|
{
|
||||||
|
$db = $object->getConnection()->getDbAdapter();
|
||||||
|
|
||||||
|
$query = $db->select()->from(
|
||||||
|
array('v' => $object->getVarsTableName()),
|
||||||
|
array(
|
||||||
|
'id' => sprintf('v.%s', $object->getVarsIdColumn()),
|
||||||
|
'varname' => 'v.varname',
|
||||||
|
'varvalue' => 'v.varvalue',
|
||||||
|
'format' => 'v.format',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($db->fetchAll($query) as $row) {
|
||||||
|
|
||||||
|
$id = $row->id;
|
||||||
|
unset($row->id);
|
||||||
|
|
||||||
|
if (array_key_exists($id, $this->rowsById)) {
|
||||||
|
$this->rowsById[$id][] = $row;
|
||||||
|
} else {
|
||||||
|
$this->rowsById[$id] = array($row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getVarsForObject(IcingaObject $object)
|
||||||
|
{
|
||||||
|
$id = $object->id;
|
||||||
|
|
||||||
|
if (array_key_exists($id, $this->rowsById)) {
|
||||||
|
if (! array_key_exists($id, $this->varsById)) {
|
||||||
|
$this->varsById[$id] = CustomVariables::forStoredRows(
|
||||||
|
$this->rowsById[$id]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->varsById[$id];
|
||||||
|
} else {
|
||||||
|
return new CustomVariables();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
unset($this->db);
|
||||||
|
}
|
||||||
|
}
|
97
library/Director/Db/Cache/PrefetchCache.php
Normal file
97
library/Director/Db/Cache/PrefetchCache.php
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Icinga\Module\Director\Db\Cache;
|
||||||
|
|
||||||
|
use Icinga\Exception\ProgrammingError;
|
||||||
|
use Icinga\Module\Director\Db;
|
||||||
|
use Icinga\Module\Director\Objects\IcingaObject;
|
||||||
|
|
||||||
|
class PrefetchCache
|
||||||
|
{
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
protected static $instance;
|
||||||
|
|
||||||
|
protected $caches = array();
|
||||||
|
|
||||||
|
protected $varsCaches = array();
|
||||||
|
|
||||||
|
protected $groupsCaches = array();
|
||||||
|
|
||||||
|
public static function initialize(Db $db)
|
||||||
|
{
|
||||||
|
self::$instance = new static($db);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function __construct(Db $db)
|
||||||
|
{
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function instance()
|
||||||
|
{
|
||||||
|
if (static::$instance === null) {
|
||||||
|
throw new ProgrammingError('Prefetch cache has not been loaded');
|
||||||
|
}
|
||||||
|
|
||||||
|
return static::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function forget()
|
||||||
|
{
|
||||||
|
self::$instance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function shouldBeUsed()
|
||||||
|
{
|
||||||
|
return self::$instance !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function vars(IcingaObject $object)
|
||||||
|
{
|
||||||
|
return $this->varsCache($object)->getVarsForObject($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function groups(IcingaObject $object)
|
||||||
|
{
|
||||||
|
return $this->groupsCache($object)->getGroupsForObject($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function byObjectType($type)
|
||||||
|
{
|
||||||
|
if (! array_key_exists($type, $this->caches)) {
|
||||||
|
$this->caches[$type] = new ObjectCache($type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->caches[$type];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function varsCache(IcingaObject $object)
|
||||||
|
{
|
||||||
|
$key = $object->getShortTableName();
|
||||||
|
|
||||||
|
if (! array_key_exists($key, $this->varsCaches)) {
|
||||||
|
$this->varsCaches[$key] = new CustomVariableCache($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->varsCaches[$key];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function groupsCache(IcingaObject $object)
|
||||||
|
{
|
||||||
|
$key = $object->getShortTableName();
|
||||||
|
|
||||||
|
if (! array_key_exists($key, $this->groupsCaches)) {
|
||||||
|
$this->groupsCaches[$key] = new GroupMembershipCache($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->groupsCaches[$key];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
unset($this->caches);
|
||||||
|
unset($this->groupsCaches);
|
||||||
|
unset($this->varsCaches);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user