blob: 9f0e8ab566e110f0f0f18fdfaac4ec23e1e870b7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
<?php
namespace Icinga\Module\Director\Import\PurgeStrategy;
use Icinga\Module\Director\Import\SyncUtils;
use Icinga\Module\Director\Objects\ImportRun;
use Icinga\Module\Director\Objects\ImportSource;
class ImportRunBasedPurgeStrategy extends PurgeStrategy
{
public function listObjectsToPurge()
{
$remove = array();
foreach ($this->getSyncRule()->fetchInvolvedImportSources() as $source) {
$remove += $this->checkImportSource($source);
}
return $remove;
}
protected function getLastSync()
{
return strtotime($this->getSyncRule()->getLastSyncTimestamp());
}
// TODO: NAMING!
protected function checkImportSource(ImportSource $source)
{
if (null === ($lastSync = $this->getLastSync())) {
// No last sync, nothing to purge
return array();
}
$runA = $source->fetchLastRunBefore($lastSync);
if ($runA === null) {
// Nothing to purge for this source
return array();
}
$runB = $source->fetchLastRun();
if ($runA->rowset_checksum === $runB->rowset_checksum) {
// Same source data, nothing to purge
return array();
}
return $this->listKeysRemovedBetween($runA, $runB);
}
public function listKeysRemovedBetween(ImportRun $runA, ImportRun $runB)
{
$rule = $this->getSyncRule();
$db = $rule->getDb();
$selectA = $runA->prepareImportedObjectQuery();
$selectB = $runB->prepareImportedObjectQuery();
$query = $db->select()->from(
array('a' => $selectA),
'a.object_name'
)->where('a.object_name NOT IN (?)', $selectB);
$result = $db->fetchCol($query);
if (empty($result)) {
return array();
}
if ($rule->hasCombinedKey()) {
$pattern = $rule->getSourceKeyPattern();
$columns = SyncUtils::getRootVariables(
SyncUtils::extractVariableNames($pattern)
);
$resultForCombinedKey = array();
foreach (array_chunk($result, 1000) as $keys) {
$rows = $runA->fetchRows($columns, null, $keys);
foreach ($rows as $row) {
$resultForCombinedKey[] = SyncUtils::fillVariables($pattern, $row);
}
}
$result = $resultForCombinedKey;
}
if (empty($result)) {
return array();
}
return array_combine($result, $result);
}
}
|