Skip to content

Commit cf7cd9e

Browse files
committed
Timeout configuration option works with transaction functions
references #64
1 parent 84cb974 commit cf7cd9e

File tree

7 files changed

+35
-14
lines changed

7 files changed

+35
-14
lines changed

src/Bolt/BoltConnectionPool.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Laudis\Neo4j\Common\TransactionHelper;
2020
use Laudis\Neo4j\Contracts\AuthenticateInterface;
2121
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
22+
use Laudis\Neo4j\Databags\TransactionConfiguration;
2223
use Laudis\Neo4j\Enum\AccessMode;
2324
use Psr\Http\Message\UriInterface;
2425
use function str_starts_with;
@@ -31,10 +32,10 @@ final class BoltConnectionPool implements ConnectionPoolInterface
3132
/**
3233
* @throws Exception
3334
*/
34-
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): StreamSocket
35+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate, TransactionConfiguration $config): StreamSocket
3536
{
3637
$host = $uri->getHost();
37-
$socket = new StreamSocket($host, $uri->getPort() ?? 7687);
38+
$socket = new StreamSocket($host, $uri->getPort() ?? 7687, $config->getTimeout());
3839

3940
$scheme = $uri->getScheme();
4041
$explosion = explode('+', $scheme, 2);

src/Bolt/Session.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
use Bolt\Bolt;
1717
use Bolt\connection\StreamSocket;
18-
use Closure;
1918
use Ds\Vector;
2019
use Exception;
2120
use Laudis\Neo4j\Common\TransactionHelper;
@@ -92,7 +91,7 @@ public function run(string $statement, iterable $parameters = [], ?TransactionCo
9291
public function writeTransaction(callable $tsxHandler, ?TransactionConfiguration $config = null)
9392
{
9493
return TransactionHelper::retry(
95-
Closure::fromCallable([$this, 'beginTransaction']),
94+
fn () => $this->beginTransaction([], $config),
9695
$tsxHandler,
9796
$config ?? TransactionConfiguration::default()
9897
);
@@ -110,8 +109,9 @@ public function transaction(callable $tsxHandler, ?TransactionConfiguration $con
110109

111110
public function beginTransaction(?iterable $statements = null, ?TransactionConfiguration $config = null): UnmanagedTransactionInterface
112111
{
112+
$config ??= TransactionConfiguration::default();
113113
try {
114-
$bolt = $this->acquireBolt();
114+
$bolt = $this->acquireBolt($config);
115115

116116
$begin = $bolt->begin(['db' => $this->config->getDatabase()]);
117117

@@ -137,12 +137,12 @@ public function beginTransaction(?iterable $statements = null, ?TransactionConfi
137137
*/
138138
private function beginInstantTransaction(): TransactionInterface
139139
{
140-
return new BoltUnmanagedTransaction($this->config->getDatabase(), $this->formatter, $this->acquireBolt());
140+
return new BoltUnmanagedTransaction($this->config->getDatabase(), $this->formatter, $this->acquireBolt(TransactionConfiguration::default()));
141141
}
142142

143-
private function acquireBolt(): Bolt
143+
private function acquireBolt(TransactionConfiguration $config): Bolt
144144
{
145-
$bolt = new Bolt($this->pool->acquire($this->uri, $this->config->getAccessMode(), $this->auth));
145+
$bolt = new Bolt($this->pool->acquire($this->uri, $this->config->getAccessMode(), $this->auth, $config));
146146
$this->auth->authenticateBolt($bolt, $this->uri, $this->userAgent);
147147

148148
return $bolt;

src/Contracts/ConnectionPoolInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Laudis\Neo4j\Contracts;
1515

16+
use Laudis\Neo4j\Databags\TransactionConfiguration;
1617
use Laudis\Neo4j\Enum\AccessMode;
1718
use Psr\Http\Message\UriInterface;
1819

@@ -24,5 +25,5 @@ interface ConnectionPoolInterface
2425
/**
2526
* @return T
2627
*/
27-
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate);
28+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate, TransactionConfiguration $config);
2829
}

src/Http/HttpConnectionPool.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use Laudis\Neo4j\Contracts\AuthenticateInterface;
1717
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
18+
use Laudis\Neo4j\Databags\TransactionConfiguration;
1819
use Laudis\Neo4j\Enum\AccessMode;
1920
use Psr\Http\Client\ClientInterface;
2021
use Psr\Http\Message\UriInterface;
@@ -31,7 +32,7 @@ public function __construct(ClientInterface $client)
3132
$this->client = $client;
3233
}
3334

34-
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): ClientInterface
35+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate, TransactionConfiguration $config): ClientInterface
3536
{
3637
return $this->client;
3738
}

src/Http/HttpSession.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,10 @@ public function __construct(
7373
*/
7474
public function runStatements(iterable $statements, ?TransactionConfiguration $config = null): CypherList
7575
{
76+
$config ??= TransactionConfiguration::default();
77+
7678
$request = $this->requestFactory->createRequest('POST', $this->uri);
77-
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth);
79+
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth, $config);
7880
$content = HttpHelper::statementsToString($this->formatter, $statements);
7981
$request = $this->instantCommitRequest($request)->withBody($this->streamFactory->createStream($content));
8082

@@ -137,9 +139,11 @@ public function run(string $statement, iterable $parameters = [], ?TransactionCo
137139
*/
138140
public function beginTransaction(?iterable $statements = null, ?TransactionConfiguration $config = null): UnmanagedTransactionInterface
139141
{
142+
$config ??= TransactionConfiguration::default();
143+
140144
$request = $this->requestFactory->createRequest('POST', $this->uri);
141145
$request->getBody()->write(HttpHelper::statementsToString($this->formatter, $statements ?? []));
142-
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth);
146+
$client = $this->pool->acquire($request->getUri(), $this->config->getAccessMode(), $this->auth, $config);
143147
$response = $client->sendRequest($request);
144148

145149
/** @var array{commit: string} $data */

src/Neo4j/Neo4jConnectionPool.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Laudis\Neo4j\Common\Uri;
2222
use Laudis\Neo4j\Contracts\AuthenticateInterface;
2323
use Laudis\Neo4j\Contracts\ConnectionPoolInterface;
24+
use Laudis\Neo4j\Databags\TransactionConfiguration;
2425
use Laudis\Neo4j\Enum\AccessMode;
2526
use Laudis\Neo4j\Enum\RoutingRoles;
2627
use Laudis\Neo4j\Types\CypherList;
@@ -51,12 +52,12 @@ public function __construct(ConnectionPoolInterface $pool)
5152
/**
5253
* @throws Exception
5354
*/
54-
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate): StreamSocket
55+
public function acquire(UriInterface $uri, AccessMode $mode, AuthenticateInterface $authenticate, TransactionConfiguration $config): StreamSocket
5556
{
5657
$table = $this->routingTable($uri, $authenticate);
5758
$server = $this->getNextServer($table, $mode);
5859

59-
$socket = $this->pool->acquire($server, $mode, $authenticate);
60+
$socket = $this->pool->acquire($server, $mode, $authenticate, $config);
6061

6162
$scheme = $uri->getScheme();
6263
$explosion = explode('+', $scheme, 2);

tests/Integration/ComplexQueryTests.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use function getenv;
1818
use InvalidArgumentException;
1919
use Laudis\Neo4j\Contracts\FormatterInterface;
20+
use Laudis\Neo4j\Contracts\TransactionInterface;
21+
use Laudis\Neo4j\Databags\TransactionConfiguration;
2022
use Laudis\Neo4j\Exception\Neo4jException;
2123
use Laudis\Neo4j\Formatter\BasicFormatter;
2224
use Laudis\Neo4j\ParameterHelper;
@@ -264,4 +266,15 @@ public function testPeriodicCommitFail(string $alias): void
264266
CYPHER);
265267
$tsx->commit();
266268
}
269+
270+
/**
271+
* @dataProvider connectionAliases
272+
*/
273+
public function testLongQuery(string $alias): void
274+
{
275+
$this->client->writeTransaction(static function (TransactionInterface $tsx) {
276+
$tsx->run('UNWIND range(1, 10000) AS x MERGE (:Number {value: x})');
277+
}, $alias, TransactionConfiguration::default()->withTimeout(100000));
278+
self::assertTrue(true);
279+
}
267280
}

0 commit comments

Comments
 (0)