Skip to content

Commit

Permalink
add timeout parameter to conduit.wai() #35
Browse files Browse the repository at this point in the history
  • Loading branch information
nakagami committed Dec 13, 2012
1 parent 52a63af commit 4850713
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 14 deletions.
21 changes: 13 additions & 8 deletions firebirdsql/fbcore.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,17 +661,22 @@ def __init__(self, conn, names):
assert event_id == self.event_id # treat only one event_id
self.event_names.update(event_names)

def wait(self):
def wait(self, timeout=None):
self.connection._op_que_events(self.event_names, 0, 0, self.event_id)
(h, oid, buf) = self.connection._op_response()

(event_id, event_names) = self._wait_for_event()
assert event_id == self.event_id # treat only one event_id

r = {}
for k in event_names:
r[k] = event_names[k]-self.event_names[k]
self.event_names[k] = event_names[k]
r = self._wait_for_event(timeout=timeout)
if r:
(event_id, event_names) = r
assert event_id == self.event_id # treat only one event_id
r = {}
for k in event_names:
r[k] = event_names[k]-self.event_names[k]
self.event_names[k] = event_names[k]
else:
r = {}
for k in self.event_names:
r[k] = 0
return r

def close(self):
Expand Down
7 changes: 5 additions & 2 deletions firebirdsql/wireprotocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -808,11 +808,14 @@ def _op_sql_response(self, xsqlda):

return r

def _wait_for_event(self):
def _wait_for_event(self, timeout=None):
event_names = {}
event_id = 0
while True:
op = bytes_to_bint(recv_channel(self.sock, 4))
b4 = recv_channel(self.sock, 4, timeout=timeout)
if b4 is None:
return None
op = bytes_to_bint(b4)
if op == self.op_dummy:
pass
elif op == self.op_exit or op == self.op_disconnect:
Expand Down
11 changes: 7 additions & 4 deletions tests/tests_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,16 @@ def handle_event():
conn = connect(dsn=TEST_DSN, user=TEST_USER, password=TEST_PASS)
conduit = conn.event_conduit(['event_a', 'event_b', 'event_d'])

result = conduit.wait(timeout=1)
assert result == {'event_b': 0, 'event_a': 0, 'event_d': 0}

result = conduit.wait()
print('event has arrived 1:', result)
assert result == {'event_b': 1, 'event_a': 2, 'event_d': 0}

produce()
result = conduit.wait()
print('event has arrived 2:', result)

while result == {'event_b': 0, 'event_a': 0, 'event_d': 0}:
result = conduit.wait()
assert result == {'event_b': 1, 'event_a': 2, 'event_d': 0}

conduit.close()
Expand All @@ -69,5 +72,5 @@ def handle_event():
if pid == 0:
handle_event()
else:
time.sleep(1)
time.sleep(3)
produce()

0 comments on commit 4850713

Please sign in to comment.