Skip to content

Commit 1acd98a

Browse files
pratikshazalte69transistive
authored andcommitted
Correctly pass bookmarks from transaction
1 parent bbac545 commit 1acd98a

File tree

6 files changed

+40
-21
lines changed

6 files changed

+40
-21
lines changed

src/Bolt/BoltConnection.php

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -258,20 +258,6 @@ public function run(
258258
return $response->content;
259259
}
260260

261-
/**
262-
* Commits a transaction.
263-
*
264-
* Any of the preconditioned states are: 'TX_READY', 'INTERRUPTED'.
265-
*/
266-
public function commit(): void
267-
{
268-
$this->consumeResults();
269-
270-
$message = $this->messageFactory->createCommitMessage();
271-
$response = $message->send()->getResponse();
272-
$this->assertNoFailure($response);
273-
}
274-
275261
/**
276262
* Rolls back a transaction.
277263
*

src/Bolt/BoltMessageFactory.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Laudis\Neo4j\Bolt\Messages\BoltRollbackMessage;
3232
use Laudis\Neo4j\Bolt\Messages\BoltRunMessage;
3333
use Laudis\Neo4j\Common\Neo4jLogger;
34+
use Laudis\Neo4j\Databags\BookmarkHolder;
3435

3536
/**
3637
* Factory class for creating Bolt protocol messages.
@@ -63,9 +64,9 @@ public function createRunMessage(string $text, array $parameters, array $extra):
6364
return new BoltRunMessage($this->protocol, $text, $parameters, $extra, $this->logger);
6465
}
6566

66-
public function createCommitMessage(): BoltCommitMessage
67+
public function createCommitMessage(BookmarkHolder $bookmarkHolder): BoltCommitMessage
6768
{
68-
return new BoltCommitMessage($this->protocol, $this->logger);
69+
return new BoltCommitMessage($this->protocol, $this->logger, $bookmarkHolder);
6970
}
7071

7172
public function createRollbackMessage(): BoltRollbackMessage

src/Bolt/BoltUnmanagedTransaction.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function __construct(
5151
private readonly SessionConfiguration $config,
5252
private readonly TransactionConfiguration $tsxConfig,
5353
private readonly BookmarkHolder $bookmarkHolder,
54+
private readonly BoltMessageFactory $messageFactory,
5455
) {
5556
}
5657

@@ -83,7 +84,7 @@ public function commit(iterable $statements = []): CypherList
8384
$list->preload();
8485
});
8586

86-
$this->connection->commit();
87+
$this->messageFactory->createCommitMessage($this->bookmarkHolder)->send();
8788
$this->state = TransactionState::COMMITTED;
8889

8990
return $tbr;
@@ -105,7 +106,7 @@ public function rollback(): void
105106
}
106107
}
107108

108-
$this->connection->rollback();
109+
$this->messageFactory->createRollbackMessage()->send();
109110
$this->state = TransactionState::ROLLED_BACK;
110111
}
111112

src/Bolt/Messages/BoltCommitMessage.php

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

1414
namespace Laudis\Neo4j\Bolt\Messages;
1515

16+
use Bolt\enum\ServerState;
1617
use Bolt\protocol\V4_4;
1718
use Bolt\protocol\V5;
1819
use Bolt\protocol\V5_1;
@@ -21,21 +22,34 @@
2122
use Bolt\protocol\V5_4;
2223
use Laudis\Neo4j\Common\Neo4jLogger;
2324
use Laudis\Neo4j\Contracts\BoltMessage;
25+
use Laudis\Neo4j\Databags\Bookmark;
26+
use Laudis\Neo4j\Databags\BookmarkHolder;
2427
use Psr\Log\LogLevel;
2528

2629
final class BoltCommitMessage extends BoltMessage
2730
{
2831
public function __construct(
2932
private readonly V4_4|V5|V5_1|V5_2|V5_3|V5_4 $protocol,
3033
private readonly ?Neo4jLogger $logger,
34+
private readonly BookmarkHolder $bookmarks,
3135
) {
3236
parent::__construct($protocol);
3337
}
3438

3539
public function send(): BoltCommitMessage
3640
{
3741
$this->logger?->log(LogLevel::DEBUG, 'COMMIT');
38-
$this->protocol->commit();
42+
$response = $this->protocol->commit()->getResponse();
43+
44+
/** @var array{bookmark?: string} $content */
45+
$content = $response->content;
46+
$bookmark = $content['bookmark'] ?? '';
47+
48+
if (trim($bookmark) !== '') {
49+
$this->bookmarks->setBookmark(new Bookmark([$bookmark]));
50+
}
51+
52+
$this->protocol->serverState = ServerState::READY;
3953

4054
return $this;
4155
}

src/Bolt/Session.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,15 @@ private function beginInstantTransaction(
146146
$this->getLogger()?->log(LogLevel::INFO, 'Starting instant transaction', ['config' => $tsxConfig]);
147147
$connection = $this->acquireConnection($tsxConfig, $config);
148148

149-
return new BoltUnmanagedTransaction($this->config->getDatabase(), $this->formatter, $connection, $this->config, $tsxConfig, $this->bookmarkHolder);
149+
return new BoltUnmanagedTransaction(
150+
$this->config->getDatabase(),
151+
$this->formatter,
152+
$connection,
153+
$this->config,
154+
$tsxConfig,
155+
$this->bookmarkHolder,
156+
new BoltMessageFactory($connection->protocol(), $this->getLogger()),
157+
);
150158
}
151159

152160
/**
@@ -184,7 +192,15 @@ private function startTransaction(TransactionConfiguration $config, SessionConfi
184192
throw $e;
185193
}
186194

187-
return new BoltUnmanagedTransaction($this->config->getDatabase(), $this->formatter, $connection, $this->config, $config, $this->bookmarkHolder);
195+
return new BoltUnmanagedTransaction(
196+
$this->config->getDatabase(),
197+
$this->formatter,
198+
$connection,
199+
$this->config,
200+
$config,
201+
$this->bookmarkHolder,
202+
new BoltMessageFactory($connection->protocol(), $this->getLogger()),
203+
);
188204
}
189205

190206
private function mergeTsxConfig(?TransactionConfiguration $config): TransactionConfiguration

tests/Integration/TransactionIntegrationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public function testCommitValidEmpty(): void
184184
self::assertTrue($tsx->isFinished());
185185
self::assertFalse($tsx->isRolledBack());
186186
self::assertTrue($tsx->isCommitted());
187+
self::assertFalse($this->getSession()->getLastBookmark()->isEmpty());
187188
}
188189

189190
public function testCommitValidFilled(): void

0 commit comments

Comments
 (0)