Skip to content

Commit fd04f97

Browse files
committed
feat: implement getServerInfo method to retrieve server metadata from driver and fixed testkit tests for connectivity check
1 parent 1035b15 commit fd04f97

File tree

9 files changed

+62
-44
lines changed

9 files changed

+62
-44
lines changed

psalm.xml

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/Basic/Driver.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Laudis\Neo4j\Contracts\AuthenticateInterface;
1717
use Laudis\Neo4j\Contracts\DriverInterface;
1818
use Laudis\Neo4j\Databags\DriverConfiguration;
19+
use Laudis\Neo4j\Databags\ServerInfo;
1920
use Laudis\Neo4j\Databags\SessionConfiguration;
2021
use Laudis\Neo4j\DriverFactory;
2122
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
@@ -44,6 +45,11 @@ public function verifyConnectivity(?SessionConfiguration $config = null): bool
4445
return $this->driver->verifyConnectivity($config);
4546
}
4647

48+
public function getServerInfo(?SessionConfiguration $config = null): ServerInfo
49+
{
50+
return $this->driver->getServerInfo($config);
51+
}
52+
4753
public static function create(string|UriInterface $uri, ?DriverConfiguration $configuration = null, ?AuthenticateInterface $authenticate = null): self
4854
{
4955
$driver = DriverFactory::create($uri, $configuration, $authenticate, SummarizedResultFormatter::create());

src/Bolt/BoltDriver.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Laudis\Neo4j\Contracts\DriverInterface;
2626
use Laudis\Neo4j\Contracts\SessionInterface;
2727
use Laudis\Neo4j\Databags\DriverConfiguration;
28+
use Laudis\Neo4j\Databags\ServerInfo;
2829
use Laudis\Neo4j\Databags\SessionConfiguration;
2930
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
3031
use Psr\Http\Message\UriInterface;
@@ -97,6 +98,23 @@ public function verifyConnectivity(?SessionConfiguration $config = null): bool
9798
return true;
9899
}
99100

101+
public function getServerInfo(?SessionConfiguration $config = null): ServerInfo
102+
{
103+
$config ??= SessionConfiguration::default();
104+
105+
$connection = GeneratorHelper::getReturnFromGenerator($this->pool->acquire($config));
106+
107+
$serverInfo = new ServerInfo(
108+
$connection->getServerAddress(),
109+
$connection->getProtocol(),
110+
$connection->getServerAgent()
111+
);
112+
113+
$this->pool->release($connection);
114+
115+
return $serverInfo;
116+
}
117+
100118
public function closeConnections(): void
101119
{
102120
$this->pool->close();

src/Bolt/ProtocolFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function createProtocol(IConnection $connection): V4_4|V5|V5_1|V5_2|V5_3|
3333
}
3434

3535
$bolt = new Bolt($connection);
36+
// Offer protocol versions from newest to oldest (only 4.4 and above are supported)
3637
$bolt->setProtocolVersions('5.4.4', 4.4);
3738
$protocol = $bolt->build();
3839

src/Contracts/DriverInterface.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Laudis\Neo4j\Contracts;
1515

16+
use Laudis\Neo4j\Databags\ServerInfo;
1617
use Laudis\Neo4j\Databags\SessionConfiguration;
1718
use Laudis\Neo4j\Types\CypherList;
1819
use Laudis\Neo4j\Types\CypherMap;
@@ -35,6 +36,11 @@ public function createSession(?SessionConfiguration $config = null): SessionInte
3536
*/
3637
public function verifyConnectivity(?SessionConfiguration $config = null): bool;
3738

39+
/**
40+
* Returns server information by establishing a connection.
41+
*/
42+
public function getServerInfo(?SessionConfiguration $config = null): ServerInfo;
43+
3844
/**
3945
* Closes all connections in the pool.
4046
*/

src/Neo4j/Neo4jDriver.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
use Laudis\Neo4j\Contracts\DriverInterface;
2929
use Laudis\Neo4j\Contracts\SessionInterface;
3030
use Laudis\Neo4j\Databags\DriverConfiguration;
31+
use Laudis\Neo4j\Databags\ServerInfo;
3132
use Laudis\Neo4j\Databags\SessionConfiguration;
33+
use Laudis\Neo4j\Enum\AccessMode;
3234
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
3335
use Psr\Http\Message\UriInterface;
3436
use Psr\Log\LogLevel;
@@ -99,6 +101,28 @@ public function verifyConnectivity(?SessionConfiguration $config = null): bool
99101
return true;
100102
}
101103

104+
public function getServerInfo(?SessionConfiguration $config = null): ServerInfo
105+
{
106+
$config ??= SessionConfiguration::default();
107+
108+
// Use READ access mode to connect to a follower (read server)
109+
if ($config->getAccessMode() === null) {
110+
$config = $config->withAccessMode(AccessMode::READ());
111+
}
112+
113+
$connection = GeneratorHelper::getReturnFromGenerator($this->pool->acquire($config));
114+
115+
$serverInfo = new ServerInfo(
116+
$connection->getServerAddress(),
117+
$connection->getProtocol(),
118+
$connection->getServerAgent()
119+
);
120+
121+
$this->pool->release($connection);
122+
123+
return $serverInfo;
124+
}
125+
102126
public function closeConnections(): void
103127
{
104128
$this->pool->close();

testkit-backend/src/MainRepository.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public function addDriver(Uuid $id, DriverInterface $driver): void
6868

6969
public function removeDriver(Uuid $id): void
7070
{
71+
$driver = $this->drivers[$id->toRfc4122()] ?? null;
72+
if ($driver !== null) {
73+
$driver->closeConnections();
74+
}
7175
unset($this->drivers[$id->toRfc4122()]);
7276
}
7377

testkit-backend/src/RequestFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Laudis\Neo4j\TestkitBackend\Requests\ForcedRoutingTableUpdateRequest;
2323
use Laudis\Neo4j\TestkitBackend\Requests\GetFeaturesRequest;
2424
use Laudis\Neo4j\TestkitBackend\Requests\GetRoutingTableRequest;
25+
use Laudis\Neo4j\TestkitBackend\Requests\GetServerInfoRequest;
2526
use Laudis\Neo4j\TestkitBackend\Requests\NewDriverRequest;
2627
use Laudis\Neo4j\TestkitBackend\Requests\NewSessionRequest;
2728
use Laudis\Neo4j\TestkitBackend\Requests\ResolverResolutionCompletedRequest;
@@ -70,6 +71,7 @@ final class RequestFactory
7071
'RetryableNegative' => RetryableNegativeRequest::class,
7172
'ForcedRoutingTableUpdate' => ForcedRoutingTableUpdateRequest::class,
7273
'GetRoutingTable' => GetRoutingTableRequest::class,
74+
'GetServerInfo' => GetServerInfoRequest::class,
7375
];
7476

7577
/**

testkit-backend/testkit.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,8 @@ python3 -m unittest -v \
137137
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_direct_raises_error \
138138
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_direct \
139139
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_routing_no_server \
140-
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_routing_fail_when_no_reader_are_available \
141140
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_routing_raises_error \
142-
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_routing
141+
tests.stub.connectivity_check.test_get_server_info.TestGetServerInfo.test_routing \
143142

144143
EXIT_CODE=$?
145144

0 commit comments

Comments
 (0)