e6data-python-connector 2.3.10rc1__tar.gz → 2.3.10rc3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {e6data_python_connector-2.3.10rc1/e6data_python_connector.egg-info → e6data_python_connector-2.3.10rc3}/PKG-INFO +2 -2
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/README.md +1 -1
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/e6data_grpc.py +34 -19
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3/e6data_python_connector.egg-info}/PKG-INFO +2 -2
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/setup.py +1 -1
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/LICENSE +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/MANIFEST.in +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/__init__.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/cluster_manager.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/cluster_server/__init__.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/cluster_server/cluster_pb2.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/cluster_server/cluster_pb2_grpc.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/common.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/constants.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/datainputstream.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/date_time_utils.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/dialect.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/e6x_vector/__init__.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/e6x_vector/constants.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/e6x_vector/ttypes.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/exceptions.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/QueryEngineService.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/__init__.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/constants.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/e6x_engine_pb2.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/e6x_engine_pb2.pyi +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/e6x_engine_pb2_grpc.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/server/ttypes.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/strategy.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector/typeId.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector.egg-info/SOURCES.txt +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector.egg-info/dependency_links.txt +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector.egg-info/entry_points.txt +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector.egg-info/requires.txt +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/e6data_python_connector.egg-info/top_level.txt +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/pyproject.toml +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/setup.cfg +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/__init__.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_38_nines.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_all_cases.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_binary.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_correct_value.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_fields.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/check_decimal_errors.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/cleanup_test_files.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/debug_38_nines.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/debug_binary.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/final_test.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/move_tests.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/quick_test.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_38_nines.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_all_decimal128_cases.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_cluster_manager_efficiency.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_cluster_manager_none_strategy.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_cluster_manager_strategy.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_comprehensive.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_current_implementation.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_decimal128_binary_parsing.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_decimal128_parsing.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_fix.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_improved_parsing.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_known_case.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_manual_analysis.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_mock_server.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_multiprocessing_fix.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_new_implementation.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_specific_binary.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy_logic.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy_persistence_fix.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy_sharing_fix.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_user_binary_value.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/tests.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/tests_grpc.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/validate_decimal128.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/validate_implementation.py +0 -0
- {e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/verify_decimal_fix.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: e6data-python-connector
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.10rc3
|
|
4
4
|
Summary: Client for the e6data distributed SQL Engine.
|
|
5
5
|
Home-page: https://github.com/e6x-labs/e6data-python-connector
|
|
6
6
|
Author: e6data, Inc.
|
|
@@ -38,7 +38,7 @@ Dynamic: summary
|
|
|
38
38
|
|
|
39
39
|
# e6data Python Connector
|
|
40
40
|
|
|
41
|
-

|
|
42
42
|
|
|
43
43
|
## Introduction
|
|
44
44
|
|
|
@@ -14,7 +14,6 @@ from decimal import Decimal
|
|
|
14
14
|
from io import BytesIO
|
|
15
15
|
from ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
|
|
16
16
|
import threading
|
|
17
|
-
import multiprocessing
|
|
18
17
|
|
|
19
18
|
import grpc
|
|
20
19
|
from grpc._channel import _InactiveRpcError
|
|
@@ -26,6 +25,9 @@ from e6data_python_connector.constants import *
|
|
|
26
25
|
from e6data_python_connector.datainputstream import get_query_columns_info, read_rows_from_chunk
|
|
27
26
|
from e6data_python_connector.server import e6x_engine_pb2_grpc, e6x_engine_pb2
|
|
28
27
|
from e6data_python_connector.typeId import *
|
|
28
|
+
import logging
|
|
29
|
+
|
|
30
|
+
_logger = logging.getLogger(__name__)
|
|
29
31
|
|
|
30
32
|
apilevel = '2.0'
|
|
31
33
|
threadsafety = 2 # Threads may share the e6xdb and connections.
|
|
@@ -134,7 +136,7 @@ _debug_connections = set()
|
|
|
134
136
|
def _strategy_debug_log(message):
|
|
135
137
|
"""Log strategy debug messages if any connection has debug enabled."""
|
|
136
138
|
if _debug_connections:
|
|
137
|
-
|
|
139
|
+
_logger.debug(f"[E6DATA_STRATEGY_DEBUG] {time.strftime('%Y-%m-%d %H:%M:%S')} - {message}")
|
|
138
140
|
|
|
139
141
|
|
|
140
142
|
def _get_shared_strategy():
|
|
@@ -241,7 +243,7 @@ def _invalidate_all_sessions():
|
|
|
241
243
|
shared_strategy['session_invalidated'] = True
|
|
242
244
|
|
|
243
245
|
|
|
244
|
-
def _register_query_strategy(query_id, strategy):
|
|
246
|
+
def _register_query_strategy(query_id, strategy, session_id=None):
|
|
245
247
|
"""Register the strategy used for a specific query."""
|
|
246
248
|
if not query_id or not strategy:
|
|
247
249
|
return
|
|
@@ -255,7 +257,8 @@ def _register_query_strategy(query_id, strategy):
|
|
|
255
257
|
query_map = shared_strategy.get('query_strategy_map', {})
|
|
256
258
|
query_map[query_id] = normalized_strategy
|
|
257
259
|
shared_strategy['query_strategy_map'] = query_map
|
|
258
|
-
|
|
260
|
+
session_info = f", session: {session_id}" if session_id else ""
|
|
261
|
+
_strategy_debug_log(f"Query {query_id} registered with strategy: {normalized_strategy}{session_info}")
|
|
259
262
|
|
|
260
263
|
|
|
261
264
|
def _get_query_strategy(query_id):
|
|
@@ -269,7 +272,7 @@ def _get_query_strategy(query_id):
|
|
|
269
272
|
return query_map.get(query_id, current_active_strategy)
|
|
270
273
|
|
|
271
274
|
|
|
272
|
-
def _cleanup_query_strategy(query_id):
|
|
275
|
+
def _cleanup_query_strategy(query_id, session_id=None):
|
|
273
276
|
"""Remove the strategy mapping for a completed query."""
|
|
274
277
|
if not query_id:
|
|
275
278
|
return
|
|
@@ -281,7 +284,8 @@ def _cleanup_query_strategy(query_id):
|
|
|
281
284
|
del query_map[query_id]
|
|
282
285
|
shared_strategy['query_strategy_map'] = query_map
|
|
283
286
|
remaining_queries = len(query_map)
|
|
284
|
-
|
|
287
|
+
session_info = f", session: {session_id}" if session_id else ""
|
|
288
|
+
_strategy_debug_log(f"Query {query_id} completed (was using {strategy}{session_info}). Remaining active queries: {remaining_queries}")
|
|
285
289
|
|
|
286
290
|
|
|
287
291
|
def _get_strategy_debug_info():
|
|
@@ -516,9 +520,11 @@ class Connection(object):
|
|
|
516
520
|
# Check if session strategy matches current active strategy
|
|
517
521
|
elif self._session_id and self._session_strategy and self._session_strategy != _get_active_strategy():
|
|
518
522
|
# Session was created with different strategy, need to re-authenticate
|
|
519
|
-
_strategy_debug_log(f"Session strategy mismatch: session created with {self._session_strategy}, current active is {_get_active_strategy()}")
|
|
523
|
+
_strategy_debug_log(f"Session strategy mismatch: session {self._session_id} created with {self._session_strategy}, current active is {_get_active_strategy()}")
|
|
524
|
+
old_session_id = self._session_id
|
|
520
525
|
self._session_id = None
|
|
521
526
|
self._session_strategy = None
|
|
527
|
+
_strategy_debug_log(f"Invalidating session {old_session_id} due to strategy mismatch")
|
|
522
528
|
self.close()
|
|
523
529
|
self._create_client()
|
|
524
530
|
|
|
@@ -536,7 +542,7 @@ class Connection(object):
|
|
|
536
542
|
|
|
537
543
|
if active_strategy and not pending_strategy:
|
|
538
544
|
# Use cached strategy only if there's no pending strategy
|
|
539
|
-
_strategy_debug_log(f"Authenticating with cached strategy: {active_strategy}")
|
|
545
|
+
_strategy_debug_log(f"Authenticating with cached strategy: {active_strategy} (session: {self._session_id})")
|
|
540
546
|
try:
|
|
541
547
|
authenticate_response = self._client.authenticate(
|
|
542
548
|
authenticate_request,
|
|
@@ -547,21 +553,25 @@ class Connection(object):
|
|
|
547
553
|
raise ValueError("Invalid credentials.")
|
|
548
554
|
# Track which strategy was used for this session
|
|
549
555
|
self._session_strategy = active_strategy
|
|
556
|
+
_strategy_debug_log(f"Authentication successful with strategy: {active_strategy}, session: {self._session_id}")
|
|
550
557
|
# Check for new strategy in authenticate response
|
|
551
558
|
if hasattr(authenticate_response, 'new_strategy') and authenticate_response.new_strategy:
|
|
552
559
|
new_strategy = authenticate_response.new_strategy.lower()
|
|
553
560
|
if new_strategy != active_strategy:
|
|
561
|
+
_strategy_debug_log(f"Strategy changed from {active_strategy} to {new_strategy} in authenticate response, session: {self._session_id}")
|
|
554
562
|
_set_pending_strategy(new_strategy)
|
|
555
563
|
_apply_pending_strategy()
|
|
564
|
+
old_session_id = self._session_id
|
|
556
565
|
self._session_id = None
|
|
557
566
|
self._session_strategy = None
|
|
567
|
+
_strategy_debug_log(f"Resetting session {old_session_id} due to new strategy: {new_strategy}")
|
|
558
568
|
self.close()
|
|
559
569
|
self._create_client()
|
|
560
570
|
return self.get_session_id
|
|
561
571
|
except _InactiveRpcError as e:
|
|
562
572
|
if e.code() == grpc.StatusCode.UNKNOWN and 'status: 456' in e.details():
|
|
563
573
|
# Strategy changed, clear cache and retry
|
|
564
|
-
_strategy_debug_log(f"Got 456 error with strategy {active_strategy}, clearing cache and retrying")
|
|
574
|
+
_strategy_debug_log(f"Got 456 error with strategy {active_strategy}, session: {self._session_id}, clearing cache and retrying")
|
|
565
575
|
_clear_strategy_cache()
|
|
566
576
|
active_strategy = None
|
|
567
577
|
else:
|
|
@@ -583,7 +593,7 @@ class Connection(object):
|
|
|
583
593
|
_strategy_debug_log(f"No cached strategy, will try strategies in order: {strategies}")
|
|
584
594
|
last_error = None
|
|
585
595
|
for strategy in strategies:
|
|
586
|
-
_strategy_debug_log(f"Attempting authentication with strategy: {strategy}")
|
|
596
|
+
_strategy_debug_log(f"Attempting authentication with strategy: {strategy} (no session yet)")
|
|
587
597
|
try:
|
|
588
598
|
authenticate_response = self._client.authenticate(
|
|
589
599
|
authenticate_request,
|
|
@@ -592,7 +602,7 @@ class Connection(object):
|
|
|
592
602
|
self._session_id = authenticate_response.sessionId
|
|
593
603
|
if self._session_id:
|
|
594
604
|
# Success! Cache this strategy
|
|
595
|
-
_strategy_debug_log(f"Authentication successful with strategy: {strategy}")
|
|
605
|
+
_strategy_debug_log(f"Authentication successful with strategy: {strategy}, session: {self._session_id}")
|
|
596
606
|
_set_active_strategy(strategy)
|
|
597
607
|
# Track which strategy was used for this session
|
|
598
608
|
self._session_strategy = strategy
|
|
@@ -601,9 +611,12 @@ class Connection(object):
|
|
|
601
611
|
if hasattr(authenticate_response, 'new_strategy') and authenticate_response.new_strategy:
|
|
602
612
|
new_strategy = authenticate_response.new_strategy.lower()
|
|
603
613
|
if new_strategy != strategy:
|
|
614
|
+
_strategy_debug_log(f"Strategy changed from {strategy} to {new_strategy} in authenticate response, session: {self._session_id}")
|
|
604
615
|
_set_pending_strategy(new_strategy)
|
|
605
616
|
_apply_pending_strategy()
|
|
617
|
+
old_session_id = self._session_id
|
|
606
618
|
self.close()
|
|
619
|
+
_strategy_debug_log(f"Resetting session {old_session_id} due to new strategy: {new_strategy}")
|
|
607
620
|
self._create_client()
|
|
608
621
|
self._session_id = None
|
|
609
622
|
self._session_strategy = None
|
|
@@ -612,7 +625,7 @@ class Connection(object):
|
|
|
612
625
|
except _InactiveRpcError as e:
|
|
613
626
|
if e.code() == grpc.StatusCode.UNKNOWN and 'status: 456' in e.details():
|
|
614
627
|
# Wrong strategy, try the next one
|
|
615
|
-
_strategy_debug_log(f"Strategy {strategy} failed with 456 error, trying next")
|
|
628
|
+
_strategy_debug_log(f"Strategy {strategy} failed with 456 error (session attempt failed), trying next")
|
|
616
629
|
last_error = e
|
|
617
630
|
continue
|
|
618
631
|
else:
|
|
@@ -680,6 +693,7 @@ class Connection(object):
|
|
|
680
693
|
|
|
681
694
|
This method ensures that the gRPC channel is properly closed and the session ID is reset to None.
|
|
682
695
|
"""
|
|
696
|
+
old_session = self._session_id
|
|
683
697
|
if self._channel is not None:
|
|
684
698
|
self._channel.close()
|
|
685
699
|
self._channel = None
|
|
@@ -689,7 +703,8 @@ class Connection(object):
|
|
|
689
703
|
# Remove from debug connections if debug was enabled
|
|
690
704
|
if self._debug:
|
|
691
705
|
_debug_connections.discard(id(self))
|
|
692
|
-
|
|
706
|
+
session_info = f", session was: {old_session}" if old_session else ""
|
|
707
|
+
_strategy_debug_log(f"Debug mode disabled for connection {id(self)}{session_info}")
|
|
693
708
|
|
|
694
709
|
def check_connection(self):
|
|
695
710
|
"""
|
|
@@ -1134,7 +1149,7 @@ class Cursor(DBAPICursor):
|
|
|
1134
1149
|
|
|
1135
1150
|
# Clean up query strategy mapping
|
|
1136
1151
|
if query_id:
|
|
1137
|
-
_cleanup_query_strategy(query_id)
|
|
1152
|
+
_cleanup_query_strategy(query_id, self.connection.get_session_id)
|
|
1138
1153
|
|
|
1139
1154
|
# Check if this was the last query and we have a pending strategy
|
|
1140
1155
|
shared_strategy = _get_shared_strategy()
|
|
@@ -1142,7 +1157,7 @@ class Cursor(DBAPICursor):
|
|
|
1142
1157
|
query_map = shared_strategy.get('query_strategy_map', {})
|
|
1143
1158
|
|
|
1144
1159
|
if pending_strategy and len(query_map) == 0:
|
|
1145
|
-
_strategy_debug_log(f"Last query cleared, triggering pending strategy transition")
|
|
1160
|
+
_strategy_debug_log(f"Last query cleared for session {self.connection.get_session_id}, triggering pending strategy transition from {_get_active_strategy()} to {pending_strategy}")
|
|
1146
1161
|
_apply_pending_strategy()
|
|
1147
1162
|
|
|
1148
1163
|
return clear_response
|
|
@@ -1158,7 +1173,7 @@ class Cursor(DBAPICursor):
|
|
|
1158
1173
|
self.connection.query_cancel(engine_ip=self._engine_ip, query_id=query_id)
|
|
1159
1174
|
|
|
1160
1175
|
if query_id:
|
|
1161
|
-
_cleanup_query_strategy(query_id)
|
|
1176
|
+
_cleanup_query_strategy(query_id, self.connection.get_session_id)
|
|
1162
1177
|
|
|
1163
1178
|
# Check if this was the last query and we have a pending strategy
|
|
1164
1179
|
shared_strategy = _get_shared_strategy()
|
|
@@ -1166,7 +1181,7 @@ class Cursor(DBAPICursor):
|
|
|
1166
1181
|
query_map = shared_strategy.get('query_strategy_map', {})
|
|
1167
1182
|
|
|
1168
1183
|
if pending_strategy and len(query_map) == 0:
|
|
1169
|
-
_strategy_debug_log(f"Last query cleared, triggering pending strategy transition")
|
|
1184
|
+
_strategy_debug_log(f"Last query cleared for session {self.connection.get_session_id}, triggering pending strategy transition from {_get_active_strategy()} to {pending_strategy}")
|
|
1170
1185
|
_apply_pending_strategy()
|
|
1171
1186
|
|
|
1172
1187
|
def status(self, query_id):
|
|
@@ -1240,7 +1255,7 @@ class Cursor(DBAPICursor):
|
|
|
1240
1255
|
# Register this query with the current strategy
|
|
1241
1256
|
current_strategy = _get_active_strategy()
|
|
1242
1257
|
if current_strategy:
|
|
1243
|
-
_register_query_strategy(self._query_id, current_strategy)
|
|
1258
|
+
_register_query_strategy(self._query_id, current_strategy, self.connection.get_session_id)
|
|
1244
1259
|
|
|
1245
1260
|
execute_statement_request = e6x_engine_pb2.ExecuteStatementRequest(
|
|
1246
1261
|
engineIP=self._engine_ip,
|
|
@@ -1287,7 +1302,7 @@ class Cursor(DBAPICursor):
|
|
|
1287
1302
|
current_strategy = _get_active_strategy()
|
|
1288
1303
|
|
|
1289
1304
|
if current_strategy:
|
|
1290
|
-
_register_query_strategy(self._query_id, current_strategy)
|
|
1305
|
+
_register_query_strategy(self._query_id, current_strategy, self.connection.get_session_id)
|
|
1291
1306
|
|
|
1292
1307
|
execute_statement_request = e6x_engine_pb2.ExecuteStatementV2Request(
|
|
1293
1308
|
engineIP=self._engine_ip,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: e6data-python-connector
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.10rc3
|
|
4
4
|
Summary: Client for the e6data distributed SQL Engine.
|
|
5
5
|
Home-page: https://github.com/e6x-labs/e6data-python-connector
|
|
6
6
|
Author: e6data, Inc.
|
|
@@ -38,7 +38,7 @@ Dynamic: summary
|
|
|
38
38
|
|
|
39
39
|
# e6data Python Connector
|
|
40
40
|
|
|
41
|
-

|
|
42
42
|
|
|
43
43
|
## Introduction
|
|
44
44
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_38_nines.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_all_cases.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_binary.py
RENAMED
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/analyze_fields.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/check_decimal_errors.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/cleanup_test_files.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/debug_38_nines.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/debug_binary.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_38_nines.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_comprehensive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_known_case.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_manual_analysis.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_mock_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_specific_binary.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy.py
RENAMED
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/test_strategy_logic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/validate_decimal128.py
RENAMED
|
File without changes
|
|
File without changes
|
{e6data_python_connector-2.3.10rc1 → e6data_python_connector-2.3.10rc3}/test/verify_decimal_fix.py
RENAMED
|
File without changes
|