mirror of
https://github.com/Icinga/icingaweb2-module-director.git
synced 2025-09-26 03:09:11 +02:00
DbObject: first attempt to seriously use prefetch
This commit is contained in:
parent
f49f14376b
commit
b03f5c55ca
@ -79,6 +79,11 @@ abstract class DbObject
|
|||||||
*/
|
*/
|
||||||
protected static $prefetched = array();
|
protected static $prefetched = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* object_name => id map for prefetched objects
|
||||||
|
*/
|
||||||
|
protected static $prefetchedNames = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor is not accessible and should not be overridden
|
* Constructor is not accessible and should not be overridden
|
||||||
*/
|
*/
|
||||||
@ -112,7 +117,6 @@ abstract class DbObject
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************\
|
/************************************************************************\
|
||||||
* Nachfolgend finden sich ein paar Hooks, die bei Bedarf überschrieben *
|
* Nachfolgend finden sich ein paar Hooks, die bei Bedarf überschrieben *
|
||||||
* werden können. Wann immer möglich soll darauf verzichtet werden, *
|
* werden können. Wann immer möglich soll darauf verzichtet werden, *
|
||||||
@ -438,7 +442,7 @@ abstract class DbObject
|
|||||||
|
|
||||||
public function getKeyParams()
|
public function getKeyParams()
|
||||||
{
|
{
|
||||||
$params = array();;
|
$params = array();
|
||||||
$key = $this->getKeyName();
|
$key = $this->getKeyName();
|
||||||
if (is_array($key)) {
|
if (is_array($key)) {
|
||||||
foreach ($key as $k) {
|
foreach ($key as $k) {
|
||||||
@ -854,7 +858,7 @@ abstract class DbObject
|
|||||||
protected static function getPrefetched($key)
|
protected static function getPrefetched($key)
|
||||||
{
|
{
|
||||||
if (static::hasPrefetched($key)) {
|
if (static::hasPrefetched($key)) {
|
||||||
return static::$prefetched[get_called_class()][$id];
|
return self::$prefetched[get_called_class()][$key];
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -862,8 +866,9 @@ abstract class DbObject
|
|||||||
|
|
||||||
protected static function hasPrefetched($key)
|
protected static function hasPrefetched($key)
|
||||||
{
|
{
|
||||||
if (array_key_exists(get_called_class(), self::$prefetched)) {
|
$class = get_called_class();
|
||||||
return array_key_exists($id, self::$prefetched[get_called_class()]);
|
if (array_key_exists($class, self::$prefetched)) {
|
||||||
|
return array_key_exists($key, self::$prefetched[$class]);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -871,7 +876,9 @@ abstract class DbObject
|
|||||||
|
|
||||||
public static function loadWithAutoIncId($id, DbConnection $connection)
|
public static function loadWithAutoIncId($id, DbConnection $connection)
|
||||||
{
|
{
|
||||||
// TODO: Index for prefetch?
|
if ($prefetched = static::getPrefetched($id)) {
|
||||||
|
return $prefetched;
|
||||||
|
}
|
||||||
|
|
||||||
$class = get_called_class();
|
$class = get_called_class();
|
||||||
$obj = new $class();
|
$obj = new $class();
|
||||||
@ -921,9 +928,15 @@ abstract class DbObject
|
|||||||
return $objects;
|
return $objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function prefetchAll(DbConnection $connection)
|
public static function prefetchAll(DbConnection $connection, $force = false)
|
||||||
{
|
{
|
||||||
return self::$prefetched[get_called_class()] = static::fetchAll($connection);
|
$class = get_called_class();
|
||||||
|
|
||||||
|
if ($force || ! array_key_exists($class, self::$prefetched)) {
|
||||||
|
self::$prefetched[$class] = static::loadAll($connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$prefetched[$class];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function exists($id, DbConnection $connection)
|
public static function exists($id, DbConnection $connection)
|
||||||
|
@ -7,6 +7,7 @@ use Icinga\Exception\ProgrammingError;
|
|||||||
use Icinga\Module\Director\Util;
|
use Icinga\Module\Director\Util;
|
||||||
use Icinga\Module\Director\Objects\IcingaCommand;
|
use Icinga\Module\Director\Objects\IcingaCommand;
|
||||||
use Icinga\Module\Director\Objects\IcingaHost;
|
use Icinga\Module\Director\Objects\IcingaHost;
|
||||||
|
use Icinga\Module\Director\Objects\IcingaEndpoint;
|
||||||
use Icinga\Web\Hook;
|
use Icinga\Web\Hook;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
|
||||||
@ -240,6 +241,9 @@ throw $e;
|
|||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// TODO: combine this with real fetches, this is a test right now
|
||||||
|
IcingaEndpoint::prefetchAll($this->connection);
|
||||||
|
|
||||||
$this
|
$this
|
||||||
->createFileFromDb('zone')
|
->createFileFromDb('zone')
|
||||||
->createFileFromDb('endpoint')
|
->createFileFromDb('endpoint')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user