-
-
Notifications
You must be signed in to change notification settings - Fork 506
/
Copy pathCommandLogger.php
102 lines (81 loc) · 2.44 KB
/
CommandLogger.php
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
91
92
93
94
95
96
97
98
99
100
101
102
<?php
declare(strict_types=1);
namespace Doctrine\ODM\MongoDB\APM;
use Countable;
use MongoDB\Driver\Monitoring\CommandFailedEvent;
use MongoDB\Driver\Monitoring\CommandStartedEvent;
use MongoDB\Driver\Monitoring\CommandSubscriber;
use MongoDB\Driver\Monitoring\CommandSucceededEvent;
use function count;
use function MongoDB\Driver\Monitoring\addSubscriber;
use function MongoDB\Driver\Monitoring\removeSubscriber;
final class CommandLogger implements Countable, CommandSubscriber
{
/** @var Command[] */
private $commands = [];
/** @var CommandStartedEvent[] */
private $startedCommands = [];
/** @var bool */
private $registered = false;
public function register() : void
{
if ($this->registered) {
return;
}
$this->registered = true;
addSubscriber($this);
}
public function unregister() : void
{
if (! $this->registered) {
return;
}
removeSubscriber($this);
$this->registered = false;
}
public function commandStarted(CommandStartedEvent $event)
{
$this->startedCommands[$event->getRequestId()] = $event;
}
public function commandSucceeded(CommandSucceededEvent $event)
{
$commandStartedEvent = $this->findAndRemoveCommandStartedEvent($event->getRequestId());
if (! $commandStartedEvent) {
return;
}
$this->logCommand(Command::createForSucceededCommand($commandStartedEvent, $event));
}
public function commandFailed(CommandFailedEvent $event)
{
$commandStartedEvent = $this->findAndRemoveCommandStartedEvent($event->getRequestId());
if (! $commandStartedEvent) {
return;
}
$this->logCommand(Command::createForFailedCommand($commandStartedEvent, $event));
}
public function clear() : void
{
$this->commands = [];
}
public function count() : int
{
return count($this->commands);
}
/**
* @return Command[]
*/
public function getAll() : array
{
return $this->commands;
}
private function findAndRemoveCommandStartedEvent(string $requestId) : ?CommandStartedEvent
{
$startedEvent = $this->startedCommands[$requestId] ?? null;
unset($this->startedCommands[$requestId]);
return $startedEvent;
}
private function logCommand(Command $command) : void
{
$this->commands[] = $command;
}
}