@@ -66,7 +66,7 @@ def __init__(self, connection):
66
66
67
67
self ._errorhandler = Error .default_errorhandler
68
68
self .messages = []
69
- self .timebomb = None
69
+ self ._timebomb = None # must be here for abort_exit method
70
70
self ._description = None
71
71
self ._column_idx_to_name = None
72
72
self ._sfqid = None
@@ -278,8 +278,9 @@ def close(self):
278
278
def is_closed (self ):
279
279
return self ._connection is None or self ._connection .is_closed ()
280
280
281
- def _execute_helper (self , query , timeout = 0 , statement_params = None ,
282
- is_internal = False , _no_results = False , _is_put_get = None ):
281
+ def _execute_helper (
282
+ self , query , timeout = 0 , statement_params = None ,
283
+ is_internal = False , _no_results = False , _is_put_get = None ):
283
284
del self .messages [:]
284
285
285
286
if statement_params is not None and not isinstance (
@@ -296,14 +297,6 @@ def _execute_helper(self, query, timeout=0, statement_params=None,
296
297
self ._sequence_counter = self ._connection ._next_sequence_counter ()
297
298
self ._request_id = uuid .uuid4 ()
298
299
299
- real_timeout = timeout if timeout and timeout > 0 \
300
- else self ._connection .connect_timeout
301
- if real_timeout is not None :
302
- self .timebomb = Timer (real_timeout , self .__cancel_query , [query ])
303
- else :
304
- self .timebomb = None
305
- if self .timebomb is not None :
306
- self .timebomb .start ()
307
300
if self .logger .getEffectiveLevel () <= logging .DEBUG :
308
301
self .logger .debug (
309
302
u'running query [%s]' ,
@@ -319,13 +312,24 @@ def _execute_helper(self, query, timeout=0, statement_params=None,
319
312
self .logger .debug (u'is_file_transfer: %s' ,
320
313
self ._is_file_transfer is not None )
321
314
315
+ real_timeout = timeout if timeout and timeout > 0 \
316
+ else self ._connection .request_timeout
317
+
318
+ if real_timeout is not None :
319
+ self ._timebomb = Timer (
320
+ real_timeout , self .__cancel_query , [query ])
321
+ self ._timebomb .start ()
322
+ else :
323
+ self ._timebomb = None
324
+
322
325
original_sigint = signal .getsignal (signal .SIGINT )
323
326
324
327
def abort_exit (signum , frame ):
325
328
signal .signal (signal .SIGINT , signal .SIG_IGN )
326
329
try :
327
- if self .timebomb is not None :
328
- self .timebomb .cancel ()
330
+ if self ._timebomb is not None :
331
+ self ._timebomb .cancel ()
332
+ self ._timebomb = None
329
333
self .__cancel_query (query )
330
334
finally :
331
335
signal .signal (signal .SIGINT , original_sigint )
@@ -334,20 +338,29 @@ def abort_exit(signum, frame):
334
338
try :
335
339
signal .signal (signal .SIGINT , abort_exit )
336
340
except ValueError :
337
- pass
338
- ret = self ._connection ._cmd_query (
339
- query ,
340
- self ._sequence_counter ,
341
- self ._request_id ,
342
- is_file_transfer = self ._is_file_transfer ,
343
- statement_params = statement_params ,
344
- is_internal = is_internal ,
345
- _no_results = _no_results )
346
-
341
+ self .logger .info (
342
+ u'Failed to set SIGINT handler. '
343
+ u'Not in main thread. Ignored...' )
347
344
try :
348
- signal .signal (signal .SIGINT , original_sigint )
349
- except ValueError :
350
- pass
345
+ ret = self ._connection ._cmd_query (
346
+ query ,
347
+ self ._sequence_counter ,
348
+ self ._request_id ,
349
+ is_file_transfer = self ._is_file_transfer ,
350
+ statement_params = statement_params ,
351
+ is_internal = is_internal ,
352
+ _no_results = _no_results )
353
+ finally :
354
+ try :
355
+ signal .signal (signal .SIGINT , original_sigint )
356
+ except ValueError :
357
+ self .logger .info (
358
+ u'Failed to reset SIGINT handler. Not in main '
359
+ u'thread. Ignored...' )
360
+ if self ._timebomb is not None :
361
+ self ._timebomb .cancel ()
362
+ self .logger .debug (u'cancelled timebomb in finally' )
363
+
351
364
if u'data' in ret and u'parameters' in ret [u'data' ]:
352
365
for kv in ret [u'data' ][u'parameters' ]:
353
366
if u'TIMESTAMP_OUTPUT_FORMAT' in kv [u'name' ]:
@@ -373,10 +386,7 @@ def abort_exit(signum, frame):
373
386
self ._connection .converter .set_parameters (
374
387
ret [u'data' ][u'parameters' ])
375
388
376
- if self .timebomb is not None :
377
- self .timebomb .cancel ()
378
389
self ._sequence_counter = - 1
379
- self .logger .debug (u'cancelled timebomb in finally' )
380
390
return ret
381
391
382
392
def execute (self , command , params = None , timeout = None ,
@@ -770,9 +780,10 @@ def __cancel_query(self, query):
770
780
self .logger .debug (u'canceled : %s, %s' ,
771
781
query , self ._sequence_counter )
772
782
with self ._lock_canceling :
773
- self ._connection ._cancel_query (query ,
774
- self ._sequence_counter ,
775
- self ._request_id )
783
+ self ._connection ._cancel_query (
784
+ query ,
785
+ self ._sequence_counter ,
786
+ self ._request_id )
776
787
777
788
def __process_params_dict (self , params ):
778
789
try :
0 commit comments