diff options
Diffstat (limited to 'library/Director/Objects/ImportRun.php')
-rw-r--r-- | library/Director/Objects/ImportRun.php | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/library/Director/Objects/ImportRun.php b/library/Director/Objects/ImportRun.php new file mode 100644 index 0000000..d3bdb7c --- /dev/null +++ b/library/Director/Objects/ImportRun.php @@ -0,0 +1,159 @@ +<?php + +namespace Icinga\Module\Director\Objects; + +use Icinga\Module\Director\Data\Db\DbObject; +use Icinga\Module\Director\Db; + +class ImportRun extends DbObject +{ + protected $table = 'import_run'; + + protected $keyName = 'id'; + + protected $autoincKeyName = 'id'; + + /** @var ImportSource */ + protected $importSource = null; + + protected $defaultProperties = [ + 'id' => null, + 'source_id' => null, + 'rowset_checksum' => null, + 'start_time' => null, + 'end_time' => null, + // TODO: Check whether succeeded could be dropped + 'succeeded' => null, + ]; + + protected $binaryProperties = [ + 'rowset_checksum', + ]; + + public function prepareImportedObjectQuery($columns = array('object_name')) + { + return $this->getDb()->select()->from( + array('r' => 'imported_row'), + $columns + )->joinLeft( + array('rsr' => 'imported_rowset_row'), + 'rsr.row_checksum = r.checksum', + array() + )->where( + 'rsr.rowset_checksum = ?', + $this->getConnection()->quoteBinary($this->rowset_checksum) + ); + } + + public function listColumnNames() + { + $db = $this->getDb(); + + $query = $db->select()->distinct()->from( + array('p' => 'imported_property'), + 'property_name' + )->join( + array('rp' => 'imported_row_property'), + 'rp.property_checksum = p.checksum', + array() + )->join( + array('rsr' => 'imported_rowset_row'), + 'rsr.row_checksum = rp.row_checksum', + array() + )->where('rsr.rowset_checksum = ?', $this->getConnection()->quoteBinary($this->rowset_checksum)); + + return $db->fetchCol($query); + } + + public function fetchRows($columns, $filter = null, $keys = null) + { + $db = $this->getDb(); + /** @var Db $connection */ + $connection = $this->getConnection(); + $binchecksum = $this->rowset_checksum; + + $query = $db->select()->from( + array('rsr' => 'imported_rowset_row'), + array( + 'object_name' => 'r.object_name', + 'property_name' => 'p.property_name', + 'property_value' => 'p.property_value', + 'format' => 'p.format' + ) + )->join( + array('r' => 'imported_row'), + 'rsr.row_checksum = r.checksum', + array() + )->join( + array('rp' => 'imported_row_property'), + 'r.checksum = rp.row_checksum', + array() + )->join( + array('p' => 'imported_property'), + 'p.checksum = rp.property_checksum', + array() + )->order('r.object_name'); + if ($connection->isMysql()) { + $query->where('rsr.rowset_checksum = :checksum')->bind([ + 'checksum' => $binchecksum + ]); + } else { + $query->where( + 'rsr.rowset_checksum = ?', + $connection->quoteBinary($binchecksum) + ); + } + + if ($columns === null) { + $columns = $this->listColumnNames(); + } else { + $query->where('p.property_name IN (?)', $columns); + } + + $result = array(); + $empty = (object) array(); + foreach ($columns as $k => $v) { + $empty->$k = null; + } + + if ($keys !== null) { + $query->where('r.object_name IN (?)', $keys); + } + + foreach ($db->fetchAll($query) as $row) { + if (! array_key_exists($row->object_name, $result)) { + $result[$row->object_name] = clone($empty); + } + + if ($row->format === 'json') { + $result[$row->object_name]->{$row->property_name} = json_decode($row->property_value); + } else { + $result[$row->object_name]->{$row->property_name} = $row->property_value; + } + } + + if ($filter) { + $filtered = array(); + foreach ($result as $key => $row) { + if ($filter->matches($row)) { + $filtered[$key] = $row; + } + } + + return $filtered; + } + + return $result; + } + + public function importSource() + { + if ($this->importSource === null) { + $this->importSource = ImportSource::loadWithAutoIncId( + (int) $this->get('source_id'), + $this->connection + ); + } + return $this->importSource; + } +} |