Skip to content

Commit 192493c

Browse files
committed
Add Server.mode to fetch output by LINE or TO_EOF
1 parent 91c4483 commit 192493c

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

firebird/driver/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
DbAccessMode, DbSpaceReservation, DbWriteMode, ShutdownMode, OnlineMode, \
4848
ShutdownMethod, \
4949
ServerCapability, SrvRepairFlag, SrvStatFlag, SrvBackupFlag, \
50-
SrvRestoreFlag, SrvNBackupFlag, \
50+
SrvRestoreFlag, SrvNBackupFlag, SrvInfoCode, \
5151
apilevel, threadsafety, paramstyle, DESCRIPTION_NAME, DESCRIPTION_TYPE_CODE, \
5252
DESCRIPTION_DISPLAY_SIZE, DESCRIPTION_INTERNAL_SIZE, DESCRIPTION_PRECISION, \
5353
DESCRIPTION_SCALE, DESCRIPTION_NULL_OK, Date, Time, Timestamp, DateFromTicks, \

firebird/driver/core.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4720,6 +4720,8 @@ def __init__(self, svc: iService, spb: bytes, host: str):
47204720
self.spb: bytes = spb
47214721
#: Server host
47224722
self.host: str = host
4723+
#: Service output mode (line or eof)
4724+
self.mode: SrvInfoCode = SrvInfoCode.TO_EOF
47234725
#: Response buffer used to comunicate with service
47244726
self.response: CBuffer = CBuffer(USHRT_MAX)
47254727
self._eof: bool = False
@@ -4778,13 +4780,19 @@ def _fetch_line(self, timeout: int=-1) -> Optional[str]:
47784780
def _read_output(self, *, init: str='', timeout: int=-1) -> None:
47794781
assert self._svc is not None
47804782
self.response.clear()
4781-
self._svc.query(self._make_request(timeout), bytes([SrvInfoCode.TO_EOF]), self.response.raw)
4783+
self._svc.query(self._make_request(timeout), bytes([self.mode]), self.response.raw)
47824784
tag = self.response.get_tag()
4783-
if tag != SrvInfoCode.TO_EOF: # pragma: no cover
4785+
if tag != self.mode: # pragma: no cover
47844786
raise InterfaceError(f"Service responded with error code: {tag}")
4785-
init += self.response.read_sized_string()
4787+
data = self.response.read_sized_string()
4788+
init += data
4789+
if data and self.mode is SrvInfoCode.LINE:
4790+
init += '\n'
47864791
self.__line_buffer = init.splitlines(keepends=True)
4787-
self._eof = self.response.get_tag() == isc_info_end
4792+
if self.mode is SrvInfoCode.TO_EOF:
4793+
self._eof = self.response.get_tag() == isc_info_end
4794+
else:
4795+
self._eof = not data
47884796
def _read_all_binary_output(self, *, timeout: int=-1) -> bytes:
47894797
assert self._svc is not None
47904798
send = self._make_request(timeout)
@@ -4793,8 +4801,7 @@ def _read_all_binary_output(self, *, timeout: int=-1) -> bytes:
47934801
while not eof:
47944802
self.response.clear()
47954803
self._svc.query(send, bytes([SrvInfoCode.TO_EOF]), self.response.raw)
4796-
tag = self.response.get_tag()
4797-
if tag != SrvInfoCode.TO_EOF: # pragma: no cover
4804+
if (tag := self.response.get_tag()) != SrvInfoCode.TO_EOF: # pragma: no cover
47984805
raise InterfaceError(f"Service responded with error code: {tag}")
47994806
result.append(self.response.read_bytes())
48004807
eof = self.response.get_tag() == isc_info_end
@@ -4806,12 +4813,10 @@ def _read_next_binary_output(self, *, timeout: int=-1) -> bytes:
48064813
send = self._make_request(timeout)
48074814
self.response.clear()
48084815
self._svc.query(send, bytes([SrvInfoCode.TO_EOF]), self.response.raw)
4809-
tag = self.response.get_tag()
4810-
if tag != SrvInfoCode.TO_EOF: # pragma: no cover
4816+
if (tag := self.response.get_tag()) != SrvInfoCode.TO_EOF: # pragma: no cover
48114817
raise InterfaceError(f"Service responded with error code: {tag}")
48124818
result = self.response.read_bytes()
4813-
tag = self.response.get_tag()
4814-
self._eof = tag == isc_info_end
4819+
self._eof = self.response.get_tag() == isc_info_end
48154820
return result
48164821
def is_running(self) -> bool:
48174822
"""Returns True if service is running.

test/test_driver.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,13 @@ def tearDown(self):
15791579
os.remove(self.fbk)
15801580
if os.path.exists(self.fbk2):
15811581
os.remove(self.fbk2)
1582-
def test_log(self):
1582+
def test_01_output_by_line(self):
1583+
self.svc.mode = SrvInfoCode.LINE
1584+
self.test_03_log()
1585+
def test_02_output_to_eof(self):
1586+
self.svc.mode = SrvInfoCode.TO_EOF
1587+
self.test_03_log()
1588+
def test_03_log(self):
15831589
def fetchline(line):
15841590
output.append(line)
15851591

@@ -1598,11 +1604,11 @@ def fetchline(line):
15981604
self.svc.info.get_log(callback=fetchline)
15991605
self.assertGreater(len(output), 0)
16001606
self.assertEqual(output, log)
1601-
def test_get_limbo_transaction_ids(self):
1607+
def test_04_get_limbo_transaction_ids(self):
16021608
self.skipTest('Not implemented yet')
16031609
ids = self.svc.get_limbo_transaction_ids(database='employee')
16041610
self.assertIsInstance(ids, type(list()))
1605-
def test_trace(self):
1611+
def test_05_trace(self):
16061612
#self.skipTest('Not implemented yet')
16071613
trace_config = """database = %s
16081614
{
@@ -1648,12 +1654,12 @@ def test_trace(self):
16481654
self.assertNotIn(trace2_id, svcx.trace.sessions)
16491655
# Finalize
16501656
svcx.trace.stop(session_id=trace1_id)
1651-
def test_get_users(self):
1657+
def test_06_get_users(self):
16521658
users = self.svc.user.get_all()
16531659
self.assertIsInstance(users, type(list()))
16541660
self.assertIsInstance(users[0], driver.core.UserInfo)
16551661
self.assertEqual(users[0].user_name, 'SYSDBA')
1656-
def test_manage_user(self):
1662+
def test_07_manage_user(self):
16571663
USER_NAME = 'DRIVER_TEST'
16581664
try:
16591665
self.svc.user.delete(USER_NAME)

0 commit comments

Comments
 (0)