Skip to content

Commit 12eac38

Browse files
Copilotmykaul
andcommitted
Simplify optimization - only define decode_row differently
Per review feedback, removed code duplication: - Only define decode_row() function differently based on encryption policy - Removed separate decode_val helper functions - Keep single try/except block instead of duplicating it - Reduced from 75 lines to 57 lines (-18 lines) Still maintains the same optimization: contains_column() called once per column instead of per value. Co-authored-by: mykaul <[email protected]>
1 parent b192ca5 commit 12eac38

File tree

1 file changed

+21
-39
lines changed

1 file changed

+21
-39
lines changed

cassandra/protocol.py

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ def recv_results_rows(self, f, protocol_version, user_type_map, result_metadata,
720720
self.column_types = [c[3] for c in column_metadata]
721721
col_descs = [ColDesc(md[0], md[1], md[2]) for md in column_metadata]
722722

723-
# Optimize by checking column_encryption_policy once and creating appropriate decode path.
723+
# Optimize by checking column_encryption_policy once and defining appropriate decode_row function.
724724
# This avoids checking the policy for every single value decoded (rows × columns times).
725725
if column_encryption_policy:
726726
# Pre-compute encryption info for each column to avoid repeated lookups.
@@ -730,51 +730,33 @@ def recv_results_rows(self, f, protocol_version, user_type_map, result_metadata,
730730
for col_desc in col_descs
731731
]
732732

733-
def decode_val_with_encryption(val, col_md, uses_ce, col_desc):
734-
if uses_ce:
735-
col_type = column_encryption_policy.column_type(col_desc)
736-
raw_bytes = column_encryption_policy.decrypt(col_desc, val)
737-
else:
738-
col_type = col_md[3]
739-
raw_bytes = val
740-
return col_type.from_binary(raw_bytes, protocol_version)
741-
742733
def decode_row(row):
743734
return tuple(
744-
decode_val_with_encryption(val, col_md, uses_ce, col_desc)
735+
column_encryption_policy.column_type(col_desc).from_binary(
736+
column_encryption_policy.decrypt(col_desc, val), protocol_version
737+
) if uses_ce else col_md[3].from_binary(val, protocol_version)
745738
for val, col_md, (uses_ce, col_desc) in zip(row, column_metadata, column_encryption_info)
746739
)
747-
748-
try:
749-
self.parsed_rows = [decode_row(row) for row in rows]
750-
except Exception:
751-
for row in rows:
752-
for val, col_md, (uses_ce, col_desc) in zip(row, column_metadata, column_encryption_info):
753-
try:
754-
decode_val_with_encryption(val, col_md, uses_ce, col_desc)
755-
except Exception as e:
756-
raise DriverException('Failed decoding result column "%s" of type %s: %s' % (col_md[2],
757-
col_md[3].cql_parameterized_type(),
758-
str(e)))
759740
else:
760741
# Simple path without encryption - just decode raw bytes directly
761-
def decode_val_simple(val, col_type):
762-
return col_type.from_binary(val, protocol_version)
763-
764742
def decode_row(row):
765-
return tuple(decode_val_simple(val, col_md[3]) for val, col_md in zip(row, column_metadata))
766-
767-
try:
768-
self.parsed_rows = [decode_row(row) for row in rows]
769-
except Exception:
770-
for row in rows:
771-
for val, col_md in zip(row, column_metadata):
772-
try:
773-
decode_val_simple(val, col_md[3])
774-
except Exception as e:
775-
raise DriverException('Failed decoding result column "%s" of type %s: %s' % (col_md[2],
776-
col_md[3].cql_parameterized_type(),
777-
str(e)))
743+
return tuple(col_md[3].from_binary(val, protocol_version) for val, col_md in zip(row, column_metadata))
744+
745+
try:
746+
self.parsed_rows = [decode_row(row) for row in rows]
747+
except Exception:
748+
for row in rows:
749+
for val, col_md, col_desc in zip(row, column_metadata, col_descs):
750+
try:
751+
# Fallback to original decode_val logic for error reporting
752+
uses_ce = column_encryption_policy and column_encryption_policy.contains_column(col_desc)
753+
col_type = column_encryption_policy.column_type(col_desc) if uses_ce else col_md[3]
754+
raw_bytes = column_encryption_policy.decrypt(col_desc, val) if uses_ce else val
755+
col_type.from_binary(raw_bytes, protocol_version)
756+
except Exception as e:
757+
raise DriverException('Failed decoding result column "%s" of type %s: %s' % (col_md[2],
758+
col_md[3].cql_parameterized_type(),
759+
str(e)))
778760

779761
def recv_results_prepared(self, f, protocol_version, user_type_map):
780762
self.query_id = read_binary_string(f)

0 commit comments

Comments
 (0)