@@ -249,6 +249,57 @@ def row_generator():
249
249
250
250
return row_generator ()
251
251
252
+ @vtgate_utils .exponential_backoff_retry ((dbexceptions .ThrottledError ,
253
+ dbexceptions .TransientError ))
254
+ def message_stream (
255
+ self , keyspace , name ,
256
+ shard = None , key_range = None ,
257
+ effective_caller_id = None ,
258
+ ** kwargs ):
259
+
260
+ try :
261
+ request = self .message_stream_request (
262
+ keyspace , shard , key_range ,
263
+ name , effective_caller_id )
264
+ it = self .stub .MessageStream (request , self .timeout )
265
+ first_response = it .next ()
266
+ except (grpc .RpcError , vtgate_utils .VitessError ) as e :
267
+ raise _convert_exception (
268
+ e , 'MessageStream' , name = name ,
269
+ keyspace = keyspace )
270
+
271
+ fields , convs = self .build_conversions (first_response .result .fields )
272
+
273
+ def row_generator ():
274
+ try :
275
+ for response in it :
276
+ for row in response .result .rows :
277
+ yield tuple (proto3_encoding .make_row (row , convs ))
278
+ except Exception :
279
+ logging .exception ('gRPC low-level error' )
280
+ raise
281
+
282
+ return row_generator (), fields
283
+
284
+ @vtgate_utils .exponential_backoff_retry ((dbexceptions .ThrottledError ,
285
+ dbexceptions .TransientError ))
286
+ def message_ack (
287
+ self ,
288
+ name , ids ,
289
+ keyspace = None , effective_caller_id = None ,
290
+ ** kwargs ):
291
+
292
+ try :
293
+ request = self .message_ack_request (
294
+ keyspace , name , ids , effective_caller_id )
295
+ response = self .stub .MessageAck (request , self .timeout )
296
+ except (grpc .RpcError , vtgate_utils .VitessError ) as e :
297
+ raise _convert_exception (
298
+ e , 'MessageAck' , name = name , ids = ids ,
299
+ keyspace = keyspace )
300
+
301
+ return response .count
302
+
252
303
253
304
def _convert_exception (exc , * args , ** kwargs ):
254
305
"""This parses the protocol exceptions to the api interface exceptions.
0 commit comments