diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 13:17:31 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 13:17:31 +0000 |
commit | f66ab8dae2f3d0418759f81a3a64dc9517a62449 (patch) | |
tree | fbff2135e7013f196b891bbde54618eb050e4aaf /library/Director/Objects/DirectorDatalist.php | |
parent | Initial commit. (diff) | |
download | icingaweb2-module-director-f66ab8dae2f3d0418759f81a3a64dc9517a62449.tar.xz icingaweb2-module-director-f66ab8dae2f3d0418759f81a3a64dc9517a62449.zip |
Adding upstream version 1.10.2.upstream/1.10.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | library/Director/Objects/DirectorDatalist.php | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/library/Director/Objects/DirectorDatalist.php b/library/Director/Objects/DirectorDatalist.php new file mode 100644 index 0000000..ae5c983 --- /dev/null +++ b/library/Director/Objects/DirectorDatalist.php @@ -0,0 +1,225 @@ +<?php + +namespace Icinga\Module\Director\Objects; + +use Exception; +use Icinga\Module\Director\Data\Db\DbObject; +use Icinga\Module\Director\Db; +use Icinga\Module\Director\DirectorObject\Automation\ExportInterface; +use Icinga\Module\Director\Exception\DuplicateKeyException; + +class DirectorDatalist extends DbObject implements ExportInterface +{ + protected $table = 'director_datalist'; + + protected $keyName = 'list_name'; + + protected $autoincKeyName = 'id'; + + protected $defaultProperties = array( + 'id' => null, + 'list_name' => null, + 'owner' => null + ); + + /** @var DirectorDatalistEntry[] */ + protected $storedEntries; + + public function getUniqueIdentifier() + { + return $this->get('list_name'); + } + + /** + * @param $plain + * @param Db $db + * @param bool $replace + * @return static + * @throws \Icinga\Exception\NotFoundError + * @throws DuplicateKeyException + */ + public static function import($plain, Db $db, $replace = false) + { + $properties = (array) $plain; + if (isset($properties['originalId'])) { + unset($properties['originalId']); + } else { + $id = null; + } + $name = $properties['list_name']; + + if ($replace && static::exists($name, $db)) { + $object = static::load($name, $db); + } elseif (static::exists($name, $db)) { + throw new DuplicateKeyException( + 'Data List %s already exists', + $name + ); + } else { + $object = static::create([], $db); + } + $object->setProperties($properties); + + return $object; + } + + public function setEntries($entries) + { + $existing = $this->getStoredEntries(); + + $new = []; + $seen = []; + $modified = false; + + foreach ($entries as $entry) { + $name = $entry->entry_name; + $entry = DirectorDatalistEntry::create((array) $entry); + $seen[$name] = true; + if (isset($existing[$name])) { + $existing[$name]->replaceWith($entry); + if (! $modified && $existing[$name]->hasBeenModified()) { + $modified = true; + } + } else { + $modified = true; + $new[] = $entry; + } + } + + foreach (array_keys($existing) as $key) { + if (! isset($seen[$key])) { + $existing[$key]->markForRemoval(); + $modified = true; + } + } + + foreach ($new as $entry) { + $existing[$entry->get('entry_name')] = $entry; + } + + if ($modified) { + $this->hasBeenModified = true; + } + + $this->storedEntries = $existing; + ksort($this->storedEntries); + + return $this; + } + + protected function beforeDelete() + { + if ($this->hasBeenUsed()) { + throw new Exception( + sprintf( + "Cannot delete '%s', as the datalist '%s' is currently being used.", + $this->get('list_name'), + $this->get('list_name') + ) + ); + } + } + + protected function hasBeenUsed() + { + $datalistType = 'Icinga\\Module\\Director\\DataType\\DataTypeDatalist'; + $db = $this->getDb(); + + $dataFieldsCheck = $db->select() + ->from(['df' =>'director_datafield'], ['varname']) + ->join( + ['dfs' => 'director_datafield_setting'], + 'dfs.datafield_id = df.id AND dfs.setting_name = \'datalist_id\'', + [] + ) + ->join( + ['l' => 'director_datalist'], + 'l.id = dfs.setting_value', + [] + ) + ->where('datatype = ?', $datalistType) + ->where('setting_value = ?', $this->get('id')); + + if ($db->fetchOne($dataFieldsCheck)) { + return true; + } + + $syncCheck = $db->select() + ->from(['sp' =>'sync_property'], ['source_expression']) + ->where('sp.destination_field = ?', 'list_id') + ->where('sp.source_expression = ?', $this->get('id')); + + if ($db->fetchOne($syncCheck)) { + return true; + } + + return false; + } + + /** + * @throws DuplicateKeyException + */ + public function onStore() + { + if ($this->storedEntries) { + $db = $this->getConnection(); + $removedKeys = []; + $myId = $this->get('id'); + + foreach ($this->storedEntries as $key => $entry) { + if ($entry->shouldBeRemoved()) { + $entry->delete(); + $removedKeys[] = $key; + } else { + if (! $entry->hasBeenLoadedFromDb()) { + $entry->set('list_id', $myId); + } + $entry->set('list_id', $myId); + $entry->store($db); + } + } + + foreach ($removedKeys as $key) { + unset($this->storedEntries[$key]); + } + } + } + + /** + * @deprecated please use \Icinga\Module\Director\Data\Exporter + * @return object + */ + public function export() + { + $plain = (object) $this->getProperties(); + $plain->originalId = $plain->id; + unset($plain->id); + + $plain->entries = []; + foreach ($this->getStoredEntries() as $key => $entry) { + if ($entry->shouldBeRemoved()) { + continue; + } + $plainEntry = (object) $entry->getProperties(); + unset($plainEntry->list_id); + + $plain->entries[] = $plainEntry; + } + + return $plain; + } + + protected function getStoredEntries() + { + if ($this->storedEntries === null) { + if ($id = $this->get('id')) { + $this->storedEntries = DirectorDatalistEntry::loadAllForList($this); + ksort($this->storedEntries); + } else { + $this->storedEntries = []; + } + } + + return $this->storedEntries; + } +} |