summaryrefslogtreecommitdiffstats
path: root/library/Director/Db/MembershipHousekeeping.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Db/MembershipHousekeeping.php')
-rw-r--r--library/Director/Db/MembershipHousekeeping.php135
1 files changed, 135 insertions, 0 deletions
diff --git a/library/Director/Db/MembershipHousekeeping.php b/library/Director/Db/MembershipHousekeeping.php
new file mode 100644
index 0000000..4d1ae88
--- /dev/null
+++ b/library/Director/Db/MembershipHousekeeping.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Icinga\Module\Director\Db;
+
+use Icinga\Module\Director\Application\MemoryLimit;
+use Icinga\Module\Director\Data\Db\DbConnection;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Db\Cache\PrefetchCache;
+use Icinga\Module\Director\Objects\GroupMembershipResolver;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaObjectGroup;
+
+abstract class MembershipHousekeeping
+{
+ protected $type;
+
+ protected $groupType;
+
+ protected $connection;
+
+ /** @var GroupMembershipResolver */
+ protected $resolver;
+
+ /** @var IcingaObject[] */
+ protected $objects;
+
+ /** @var IcingaObjectGroup[] */
+ protected $groups;
+
+ protected $prepared = false;
+
+ protected static $instances = [];
+
+ public function __construct(Db $connection)
+ {
+ $this->connection = $connection;
+
+ if ($this->groupType === null) {
+ $this->groupType = $this->type . 'Group';
+ }
+ }
+
+ /**
+ * @param string $type
+ * @param DbConnection $connection
+ *
+ * @return static
+ */
+ public static function instance($type, $connection)
+ {
+ if (! array_key_exists($type, self::$instances)) {
+ /** @var MembershipHousekeeping $class */
+ $class = 'Icinga\\Module\\Director\\Db\\' . ucfirst($type) . 'MembershipHousekeeping';
+
+ /** @var MembershipHousekeeping $helper */
+ self::$instances[$type] = new $class($connection);
+ }
+
+ return self::$instances[$type];
+ }
+
+ protected function prepare()
+ {
+ if ($this->prepared) {
+ return $this;
+ }
+
+ $this->prepareCache();
+ $this->resolver()->defer();
+
+ $this->objects = IcingaObject::loadAllByType($this->type, $this->connection);
+ $this->resolver()->addObjects($this->objects);
+
+ $this->groups = IcingaObject::loadAllByType($this->groupType, $this->connection);
+ $this->resolver()->addGroups($this->groups);
+
+ MemoryLimit::raiseTo('1024M');
+
+ $this->prepared = true;
+
+ return $this;
+ }
+
+ public function check()
+ {
+ $this->prepare();
+
+ $resolver = $this->resolver()->checkDb();
+
+ return array($resolver->getNewMappings(), $resolver->getOutdatedMappings());
+ }
+
+ public function update()
+ {
+ $this->prepare();
+
+ $this->resolver()->refreshDb(true);
+
+ return true;
+ }
+
+ protected function prepareCache()
+ {
+ PrefetchCache::initialize($this->connection);
+
+ IcingaObject::prefetchAllRelationsByType($this->type, $this->connection);
+ }
+
+ protected function resolver()
+ {
+ if ($this->resolver === null) {
+ /** @var GroupMembershipResolver $class */
+ $class = 'Icinga\\Module\\Director\\Objects\\' . ucfirst($this->type) . 'GroupMembershipResolver';
+ $this->resolver = new $class($this->connection);
+ }
+
+ return $this->resolver;
+ }
+
+ /**
+ * @return IcingaObject[]
+ */
+ public function getObjects()
+ {
+ return $this->objects;
+ }
+
+ /**
+ * @return IcingaObjectGroup[]
+ */
+ public function getGroups()
+ {
+ return $this->groups;
+ }
+}