Handle and utilize MD5 prepared query ID

This commit is contained in:
Tyler Hobbs
2013-06-26 12:47:22 -05:00
parent 0ddc388a70
commit 3743029c9d
2 changed files with 19 additions and 10 deletions

View File

@@ -429,8 +429,9 @@ class ResultMessage(_MessageType):
@classmethod @classmethod
def recv_results_prepared(cls, f): def recv_results_prepared(cls, f):
query_id = read_short(f) query_id = read_short(f)
md5_id = f.read(16)
column_metadata = cls.recv_results_metadata(f) column_metadata = cls.recv_results_metadata(f)
return (query_id, column_metadata) return (query_id, md5_id, column_metadata)
@classmethod @classmethod
def recv_results_metadata(cls, f): def recv_results_metadata(cls, f):
@@ -492,10 +493,11 @@ class PrepareMessage(_MessageType):
class ExecuteMessage(_MessageType): class ExecuteMessage(_MessageType):
opcode = 0x0A opcode = 0x0A
name = 'EXECUTE' name = 'EXECUTE'
params = ('query_id', 'query_params', 'consistency_level',) params = ('query_id', 'md5_id', 'query_params', 'consistency_level',)
def send_body(self, f): def send_body(self, f):
write_int(f, self.query_id) write_short(f, self.query_id)
f.write(self.md5_id)
write_short(f, len(self.query_params)) write_short(f, len(self.query_params))
for param in self.query_params: for param in self.query_params:
write_value(f, param) write_value(f, param)

View File

@@ -38,24 +38,26 @@ class PreparedStatement(object):
column_metadata = None column_metadata = None
query_id = None query_id = None
query = None md5_id = None
query_string = None
keyspace = None keyspace = None
routing_key_indexes = None routing_key_indexes = None
consistency_level = None consistency_level = ConsistencyLevel.ONE
def __init__(self, column_metadata, query_id, routing_key_indexes, query, keyspace): def __init__(self, column_metadata, query_id, md5_id, routing_key_indexes, query, keyspace):
self.column_metadata = column_metadata self.column_metadata = column_metadata
self.query_id = query_id self.query_id = query_id
self.md5_id = md5_id
self.routing_key_indexes = routing_key_indexes self.routing_key_indexes = routing_key_indexes
self.query = query self.query_string = query
self.keyspace = keyspace self.keyspace = keyspace
@classmethod @classmethod
def from_message(cls, query_id, column_metadata, cluster_metadata, query, keyspace): def from_message(cls, query_id, md5_id, column_metadata, cluster_metadata, query, keyspace):
if not column_metadata: if not column_metadata:
return PreparedStatement(column_metadata, query_id, None, query, keyspace) return PreparedStatement(column_metadata, query_id, md5_id, None, query, keyspace)
partition_key_columns = None partition_key_columns = None
routing_key_indexes = None routing_key_indexes = None
@@ -78,7 +80,10 @@ class PreparedStatement(object):
pass # we're missing a partition key component in the prepared pass # we're missing a partition key component in the prepared
# statement; just leave routing_key_indexes as None # statement; just leave routing_key_indexes as None
return PreparedStatement(column_metadata, query_id, routing_key_indexes, query, keyspace) return PreparedStatement(column_metadata, query_id, md5_id, routing_key_indexes, query, keyspace)
def bind(self, values):
return BoundStatement(self).bind(values)
class BoundStatement(Query): class BoundStatement(Query):
@@ -107,6 +112,8 @@ class BoundStatement(Query):
col_type = col_spec[-1] col_type = col_spec[-1]
self.values.append(col_type.serialize(value)) self.values.append(col_type.serialize(value))
return self
@property @property
def routing_key(self): def routing_key(self):
if not self.prepared_statement.routing_key_indexes: if not self.prepared_statement.routing_key_indexes: