velocity-python 0.0.108__tar.gz → 0.0.109__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.
Potentially problematic release.
This version of velocity-python might be problematic. Click here for more details.
- {velocity_python-0.0.108/src/velocity_python.egg-info → velocity_python-0.0.109}/PKG-INFO +1 -1
- {velocity_python-0.0.108 → velocity_python-0.0.109}/pyproject.toml +1 -1
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/__init__.py +1 -1
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/engine.py +66 -19
- {velocity_python-0.0.108 → velocity_python-0.0.109/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.0.108 → velocity_python-0.0.109}/LICENSE +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/README.md +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/setup.cfg +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/app/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/app/invoices.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/app/orders.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/app/payments.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/app/purchase_orders.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/exceptions.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/mysql.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/mysql_reserved.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlite.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlite_reserved.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlserver.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlserver_reserved.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/SOURCES.txt +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_db.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_db_utils.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_email_processing.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_fix.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_format.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_iconv.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_merge.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_oconv.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_original_error.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_postgres.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_response.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_result_caching.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_sql_builder.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_tablehelper.py +0 -0
- {velocity_python-0.0.108 → velocity_python-0.0.109}/tests/test_timer.py +0 -0
|
@@ -24,6 +24,38 @@ class Engine:
|
|
|
24
24
|
self.__sql = sql
|
|
25
25
|
self.__driver = driver
|
|
26
26
|
self.__connect_timeout = connect_timeout
|
|
27
|
+
|
|
28
|
+
# Set up error code mappings from the SQL class
|
|
29
|
+
self._setup_error_mappings()
|
|
30
|
+
|
|
31
|
+
def _setup_error_mappings(self):
|
|
32
|
+
"""
|
|
33
|
+
Set up error code to exception class mappings from the SQL driver.
|
|
34
|
+
"""
|
|
35
|
+
self.error_codes = {}
|
|
36
|
+
|
|
37
|
+
# Map error codes to exception class names
|
|
38
|
+
sql_attrs = [
|
|
39
|
+
('ApplicationErrorCodes', 'DbApplicationError'),
|
|
40
|
+
('DatabaseMissingErrorCodes', 'DbDatabaseMissingError'),
|
|
41
|
+
('TableMissingErrorCodes', 'DbTableMissingError'),
|
|
42
|
+
('ColumnMissingErrorCodes', 'DbColumnMissingError'),
|
|
43
|
+
('ForeignKeyMissingErrorCodes', 'DbForeignKeyMissingError'),
|
|
44
|
+
('ConnectionErrorCodes', 'DbConnectionError'),
|
|
45
|
+
('DuplicateKeyErrorCodes', 'DbDuplicateKeyError'),
|
|
46
|
+
('RetryTransactionCodes', 'DbRetryTransaction'),
|
|
47
|
+
('TruncationErrorCodes', 'DbTruncationError'),
|
|
48
|
+
('LockTimeoutErrorCodes', 'DbLockTimeoutError'),
|
|
49
|
+
('DatabaseObjectExistsErrorCodes', 'DbObjectExistsError'),
|
|
50
|
+
('DataIntegrityErrorCodes', 'DbDataIntegrityError')
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
for attr_name, exception_class in sql_attrs:
|
|
54
|
+
if hasattr(self.sql, attr_name):
|
|
55
|
+
codes = getattr(self.sql, attr_name)
|
|
56
|
+
if codes: # Only add non-empty lists
|
|
57
|
+
for code in codes:
|
|
58
|
+
self.error_codes[str(code)] = exception_class
|
|
27
59
|
|
|
28
60
|
def __str__(self):
|
|
29
61
|
return f"[{self.sql.server}] engine({self.config})"
|
|
@@ -352,7 +384,16 @@ class Engine:
|
|
|
352
384
|
|
|
353
385
|
# Safely get error code and message with fallbacks
|
|
354
386
|
try:
|
|
355
|
-
|
|
387
|
+
# Try PostgreSQL-specific error code first, then use SQL driver's get_error method
|
|
388
|
+
error_code = getattr(exception, 'pgcode', None)
|
|
389
|
+
if not error_code and hasattr(self.sql, 'get_error'):
|
|
390
|
+
try:
|
|
391
|
+
error_code, error_message_from_driver = self.sql.get_error(exception)
|
|
392
|
+
if error_message_from_driver:
|
|
393
|
+
error_message = error_message_from_driver
|
|
394
|
+
except Exception as get_error_exception:
|
|
395
|
+
logger.warning(f"⚠️ SQL driver get_error failed: {get_error_exception}")
|
|
396
|
+
error_code = None
|
|
356
397
|
except Exception as e:
|
|
357
398
|
logger.warning(f"⚠️ Unable to extract database error code: {e}")
|
|
358
399
|
error_code = None
|
|
@@ -364,18 +405,16 @@ class Engine:
|
|
|
364
405
|
error_message = f"<Error converting exception: {type(exception).__name__}>"
|
|
365
406
|
|
|
366
407
|
# Primary error classification by error code
|
|
367
|
-
if error_code and hasattr(self, 'error_codes'):
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
# Fall through to regex classification
|
|
378
|
-
break
|
|
408
|
+
if error_code and hasattr(self, 'error_codes') and str(error_code) in self.error_codes:
|
|
409
|
+
error_class = self.error_codes[str(error_code)]
|
|
410
|
+
logger.info(f"✅ Successfully classified error: {error_code} → {error_class}")
|
|
411
|
+
try:
|
|
412
|
+
raise self._create_exception_with_chaining(
|
|
413
|
+
error_class, error_message, exception, sql, parameters
|
|
414
|
+
)
|
|
415
|
+
except Exception as creation_error:
|
|
416
|
+
logger.error(f"❌ Failed to create {error_class} exception: {creation_error}")
|
|
417
|
+
# Fall through to regex classification
|
|
379
418
|
|
|
380
419
|
# Secondary error classification by message patterns (regex fallback)
|
|
381
420
|
error_message_lower = error_message.lower()
|
|
@@ -415,6 +454,13 @@ class Engine:
|
|
|
415
454
|
r'schema.*does.*not.*exist|unknown.*table'
|
|
416
455
|
]
|
|
417
456
|
|
|
457
|
+
# Enhanced column missing patterns
|
|
458
|
+
column_missing_patterns = [
|
|
459
|
+
r'column.*does.*not.*exist',
|
|
460
|
+
r'unknown.*column|column.*not.*found',
|
|
461
|
+
r'no.*such.*column|invalid.*column.*name'
|
|
462
|
+
]
|
|
463
|
+
|
|
418
464
|
# Enhanced syntax error patterns
|
|
419
465
|
syntax_patterns = [
|
|
420
466
|
r'syntax.*error|invalid.*syntax',
|
|
@@ -431,12 +477,13 @@ class Engine:
|
|
|
431
477
|
|
|
432
478
|
# Comprehensive pattern matching with error class mapping
|
|
433
479
|
pattern_mappings = [
|
|
434
|
-
(connection_patterns, '
|
|
435
|
-
(duplicate_patterns, '
|
|
436
|
-
(permission_patterns, '
|
|
437
|
-
(not_found_patterns, '
|
|
438
|
-
(
|
|
439
|
-
(
|
|
480
|
+
(connection_patterns, 'DbConnectionError'),
|
|
481
|
+
(duplicate_patterns, 'DbDuplicateKeyError'),
|
|
482
|
+
(permission_patterns, 'DbPermissionError'),
|
|
483
|
+
(not_found_patterns, 'DbTableMissingError'),
|
|
484
|
+
(column_missing_patterns, 'DbColumnMissingError'),
|
|
485
|
+
(syntax_patterns, 'DbSyntaxError'),
|
|
486
|
+
(deadlock_patterns, 'DbDeadlockError')
|
|
440
487
|
]
|
|
441
488
|
|
|
442
489
|
# Apply pattern matching
|
|
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
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/aws/handlers/sqs_handler.py
RENAMED
|
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
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/mysql_reserved.py
RENAMED
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/types.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlite_reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity/db/servers/sqlserver_reserved.py
RENAMED
|
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
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/requires.txt
RENAMED
|
File without changes
|
{velocity_python-0.0.108 → velocity_python-0.0.109}/src/velocity_python.egg-info/top_level.txt
RENAMED
|
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
|