Skip to content

Commit 9bff14d

Browse files
committed
Added db to RUN message
1 parent d12f951 commit 9bff14d

File tree

6 files changed

+48
-6
lines changed

6 files changed

+48
-6
lines changed

neo4j/io/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,20 @@ def __enter__(self):
163163
def __exit__(self, exc_type, exc_value, traceback):
164164
self.close()
165165

166-
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None, timeout=None, **handlers):
167-
raise NotImplementedError
166+
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None,
167+
timeout=None, db=None, **handlers):
168+
""" Appends a RUN message to the output stream.
169+
170+
:param statement: Cypher query string
171+
:param parameters: dictionary of Cypher parameters
172+
:param mode: access mode for routing - "READ" or "WRITE" (default)
173+
:param bookmarks: iterable of bookmark values after which this transaction should begin
174+
:param metadata: custom metadata dictionary to attach to the transaction
175+
:param timeout: timeout for transaction execution (seconds)
176+
:param db: name of the database against which to begin the transaction
177+
:param handlers: handler functions passed into the returned Response object
178+
:return: :class:`neo4j.io._bolt3.Response` object
179+
"""
168180

169181
def discard_all(self, **handlers):
170182
raise NotImplementedError

neo4j/io/_bolt3.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,10 @@ def hello(self):
142142
self.send_all()
143143
self.fetch_all()
144144

145-
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None, timeout=None, **handlers):
145+
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None,
146+
timeout=None, db=None, **handlers):
147+
if db is not None:
148+
raise ValueError("Database selection is not supported in Bolt 3")
146149
if not parameters:
147150
parameters = {}
148151
extra = {}

neo4j/io/_bolt4x0.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,15 @@ def hello(self):
142142
self.send_all()
143143
self.fetch_all()
144144

145-
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None, timeout=None, **handlers):
145+
def run(self, statement, parameters=None, mode=None, bookmarks=None, metadata=None,
146+
timeout=None, db=None, **handlers):
146147
if not parameters:
147148
parameters = {}
148149
extra = {}
149150
if mode:
150151
extra["mode"] = mode
152+
if db:
153+
extra["db"] = db
151154
if bookmarks:
152155
try:
153156
extra["bookmarks"] = list(bookmarks)

neo4j/work/simple.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,9 +200,12 @@ def done(summary_metadata):
200200
raise ValueError("Metadata can only be attached at transaction level")
201201
if statement_timeout:
202202
raise ValueError("Timeouts only apply at transaction level")
203+
# TODO: fail if explicit database name has been set
203204
else:
204205
run_metadata["bookmarks"] = self._bookmarks_in
205206

207+
# TODO: capture ValueError and surface as SessionError/TransactionError if
208+
# TODO: explicit database selection has been made
206209
cx.run(statement_text, parameters, **run_metadata)
207210
cx.pull_all(
208211
on_records=lambda records: result._records.extend(

tests/unit/io/test_class_bolt3.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,15 @@ def test_conn_not_timed_out(fake_socket):
4242
assert connection.timedout() is False
4343

4444

45-
def test_db_extra_not_supported(fake_socket):
45+
def test_db_extra_not_supported_in_begin(fake_socket):
4646
address = ("127.0.0.1", 7687)
4747
connection = Bolt3(address, fake_socket(address))
4848
with pytest.raises(ValueError):
4949
connection.begin(db="something")
50+
51+
52+
def test_db_extra_not_supported_in_run(fake_socket):
53+
address = ("127.0.0.1", 7687)
54+
connection = Bolt3(address, fake_socket(address))
55+
with pytest.raises(ValueError):
56+
connection.run("", db="something")

tests/unit/io/test_class_bolt4x0.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_conn_not_timed_out(fake_socket):
4040
assert connection.timedout() is False
4141

4242

43-
def test_db_extra(fake_socket):
43+
def test_db_extra_in_begin(fake_socket):
4444
address = ("127.0.0.1", 7687)
4545
socket = fake_socket(address)
4646
connection = Bolt4x0(address, socket)
@@ -50,3 +50,17 @@ def test_db_extra(fake_socket):
5050
assert tag == b"\x11"
5151
assert len(fields) == 1
5252
assert fields[0] == {"db": "something"}
53+
54+
55+
def test_db_extra_in_run(fake_socket):
56+
address = ("127.0.0.1", 7687)
57+
socket = fake_socket(address)
58+
connection = Bolt4x0(address, socket)
59+
connection.run("", {}, db="something")
60+
connection.send_all()
61+
tag, fields = socket.pop_message()
62+
assert tag == b"\x10"
63+
assert len(fields) == 3
64+
assert fields[0] == ""
65+
assert fields[1] == {}
66+
assert fields[2] == {"db": "something"}

0 commit comments

Comments
 (0)