sa-carrot 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,185 @@
1
+ require 'socket'
2
+ require 'thread'
3
+ require 'timeout'
4
+
5
+ module Carrot::AMQP
6
+ class Server
7
+ CONNECT_TIMEOUT = 1.0
8
+ RETRY_DELAY = 10.0
9
+ DEFAULT_PORT = 5672
10
+
11
+ attr_reader :host, :port, :status
12
+ attr_accessor :channel, :ticket
13
+
14
+ class ServerDown < StandardError; end
15
+ class ProtocolError < StandardError; end
16
+
17
+ def initialize(opts = {})
18
+ @host = opts[:host] || 'localhost'
19
+ @port = opts[:port] || DEFAULT_PORT
20
+ @user = opts[:user] || 'guest'
21
+ @pass = opts[:pass] || 'guest'
22
+ @vhost = opts[:vhost] || '/'
23
+ @insist = opts[:insist]
24
+ @status = 'NOT CONNECTED'
25
+
26
+ @multithread = opts[:multithread]
27
+ start_session
28
+ end
29
+
30
+ def send_frame(*args)
31
+ args.each do |data|
32
+ data.ticket = ticket if ticket and data.respond_to?(:ticket=)
33
+ data = data.to_frame(channel) unless data.is_a?(Frame)
34
+ data.channel = channel
35
+
36
+ log :send, data
37
+ write(data.to_s)
38
+ end
39
+ nil
40
+ end
41
+
42
+ def next_frame
43
+ frame = Frame.parse(buffer)
44
+ log :received, frame
45
+ frame
46
+ end
47
+
48
+ def next_method
49
+ next_payload
50
+ end
51
+
52
+ def next_payload
53
+ frame = next_frame
54
+ frame and frame.payload
55
+ end
56
+
57
+ def close
58
+ send_frame(
59
+ Protocol::Channel::Close.new(:reply_code => 200, :reply_text => 'bye', :method_id => 0, :class_id => 0)
60
+ )
61
+ puts "Error closing channel #{channel}" unless next_method.is_a?(Protocol::Channel::CloseOk)
62
+
63
+ self.channel = 0
64
+ send_frame(
65
+ Protocol::Connection::Close.new(:reply_code => 200, :reply_text => 'Goodbye', :class_id => 0, :method_id => 0)
66
+ )
67
+ puts "Error closing connection" unless next_method.is_a?(Protocol::Connection::CloseOk)
68
+
69
+ close_socket
70
+ end
71
+
72
+ def read(*args)
73
+ send_command(:read, *args)
74
+ end
75
+
76
+ def write(*args)
77
+ send_command(:write, *args)
78
+ end
79
+
80
+ private
81
+
82
+ def buffer
83
+ @buffer ||= Buffer.new(self)
84
+ end
85
+
86
+ def send_command(cmd, *args)
87
+ begin
88
+ socket.__send__(cmd, *args)
89
+ rescue Errno::EPIPE, IOError => e
90
+ raise ServerDown, e.message
91
+ end
92
+ end
93
+
94
+ def socket
95
+ return @socket if @socket and not @socket.closed?
96
+
97
+ begin
98
+ # Attempt to connect.
99
+ mutex.lock if multithread?
100
+ @socket = timeout(CONNECT_TIMEOUT) do
101
+ TCPSocket.new(host, port)
102
+ end
103
+
104
+ if Socket.constants.include? 'TCP_NODELAY'
105
+ @socket.setsockopt Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1
106
+ end
107
+ @status = 'CONNECTED'
108
+ rescue SocketError, SystemCallError, IOError, Timeout::Error => e
109
+ msg = e.message << " - #{@host}:#{@port}"
110
+ raise ServerDown, e.message
111
+ ensure
112
+ mutex.unlock if multithread?
113
+ end
114
+
115
+ @socket
116
+ end
117
+
118
+ def start_session
119
+ @channel = 0
120
+ write(HEADER)
121
+ write([1, 1, VERSION_MAJOR, VERSION_MINOR].pack('C4'))
122
+ raise ProtocolError, 'bad start connection' unless next_method.is_a?(Protocol::Connection::Start)
123
+
124
+ send_frame(
125
+ Protocol::Connection::StartOk.new(
126
+ {:platform => 'Ruby', :product => 'Carrot', :information => 'http://github.com/famosagle/carrot', :version => VERSION},
127
+ 'AMQPLAIN',
128
+ {:LOGIN => @user, :PASSWORD => @pass},
129
+ 'en_US'
130
+ )
131
+ )
132
+
133
+ method = next_method
134
+ raise ProtocolError, "Bad AMQP Credentials. user: #{@user}, pass: #{@pass}" if method.nil?
135
+
136
+ if method.is_a?(Protocol::Connection::Tune)
137
+ send_frame(
138
+ Protocol::Connection::TuneOk.new( :channel_max => 0, :frame_max => 131072, :heartbeat => 0)
139
+ )
140
+ end
141
+
142
+ send_frame(
143
+ Protocol::Connection::Open.new(:virtual_host => @vhost, :capabilities => '', :insist => @insist)
144
+ )
145
+ raise ProtocolError, 'bad open connection' unless next_method.is_a?(Protocol::Connection::OpenOk)
146
+
147
+ @channel = 1
148
+ send_frame(Protocol::Channel::Open.new)
149
+ raise ProtocolError, "cannot open channel #{channel}" unless next_method.is_a?(Protocol::Channel::OpenOk)
150
+
151
+ send_frame(
152
+ Protocol::Access::Request.new(:realm => '/data', :read => true, :write => true, :active => true, :passive => true)
153
+ )
154
+ method = next_method
155
+ raise ProtocolError, 'access denied' unless method.is_a?(Protocol::Access::RequestOk)
156
+ self.ticket = method.ticket
157
+ end
158
+
159
+ def multithread?
160
+ @multithread
161
+ end
162
+
163
+ def close_socket(reason=nil)
164
+ # Close the socket. The server is not considered dead.
165
+ mutex.lock if multithread?
166
+ @socket.close if @socket and not @socket.closed?
167
+ @socket = nil
168
+ @status = "NOT CONNECTED"
169
+ ensure
170
+ mutex.unlock if multithread?
171
+ end
172
+
173
+ def mutex
174
+ @mutex ||= Mutex.new
175
+ end
176
+
177
+ def log(*args)
178
+ return unless Carrot.logging?
179
+ require 'pp'
180
+ pp args
181
+ puts
182
+ end
183
+
184
+ end
185
+ end
data/lib/amqp/spec.rb ADDED
@@ -0,0 +1,820 @@
1
+ module Carrot::AMQP
2
+ class Frame
3
+ def self.types
4
+ @types ||= {}
5
+ end
6
+
7
+ def self.Frame id
8
+ (@_base_frames ||= {})[id] ||= Class.new(Frame) do
9
+ class_eval %[
10
+ def self.inherited klass
11
+ klass.const_set(:ID, #{id})
12
+ Frame.types[#{id}] = klass
13
+ end
14
+ ]
15
+ end
16
+ end
17
+
18
+ class Method < Frame( 1 ); end
19
+ class Header < Frame( 2 ); end
20
+ class Body < Frame( 3 ); end
21
+ class OobMethod < Frame( 4 ); end
22
+ class OobHeader < Frame( 5 ); end
23
+ class OobBody < Frame( 6 ); end
24
+ class Trace < Frame( 7 ); end
25
+ class Heartbeat < Frame( 8 ); end
26
+
27
+ FOOTER = 206
28
+ end
29
+
30
+ RESPONSES = {
31
+ 200 => :REPLY_SUCCESS,
32
+ 310 => :NOT_DELIVERED,
33
+ 311 => :CONTENT_TOO_LARGE,
34
+ 312 => :NO_ROUTE,
35
+ 313 => :NO_CONSUMERS,
36
+ 403 => :ACCESS_REFUSED,
37
+ 404 => :NOT_FOUND,
38
+ 405 => :RESOURCE_LOCKED,
39
+ 406 => :PRECONDITION_FAILED,
40
+ 320 => :CONNECTION_FORCED,
41
+ 402 => :INVALID_PATH,
42
+ }
43
+
44
+ FIELDS = [
45
+ :bit,
46
+ :long,
47
+ :longlong,
48
+ :longstr,
49
+ :octet,
50
+ :short,
51
+ :shortstr,
52
+ :table,
53
+ :timestamp,
54
+ ]
55
+
56
+ module Protocol
57
+ class Class
58
+ class << self
59
+ FIELDS.each do |f|
60
+ class_eval %[
61
+ def #{f} name
62
+ properties << [ :#{f}, name ] unless properties.include?([:#{f}, name])
63
+ attr_accessor name
64
+ end
65
+ ]
66
+ end
67
+
68
+ def properties() @properties ||= [] end
69
+
70
+ def id() self::ID end
71
+ def name() self::NAME end
72
+ end
73
+
74
+ class Method
75
+ class << self
76
+ FIELDS.each do |f|
77
+ class_eval %[
78
+ def #{f} name
79
+ arguments << [ :#{f}, name ] unless arguments.include?([:#{f}, name])
80
+ attr_accessor name
81
+ end
82
+ ]
83
+ end
84
+
85
+ def arguments() @arguments ||= [] end
86
+
87
+ def parent() Protocol.const_get(self.to_s[/Protocol::(.+?)::/,1]) end
88
+ def id() self::ID end
89
+ def name() self::NAME end
90
+ end
91
+
92
+ def == b
93
+ self.class.arguments.inject(true) do |eql, (type, name)|
94
+ eql and __send__("#{name}") == b.__send__("#{name}")
95
+ end
96
+ end
97
+ end
98
+
99
+ def self.methods() @methods ||= {} end
100
+
101
+ def self.Method(id, name)
102
+ @_base_methods ||= {}
103
+ @_base_methods[id] ||= ::Class.new(Method) do
104
+ class_eval %[
105
+ def self.inherited klass
106
+ klass.const_set(:ID, #{id})
107
+ klass.const_set(:NAME, :#{name.to_s})
108
+ klass.parent.methods[#{id}] = klass
109
+ klass.parent.methods[klass::NAME] = klass
110
+ end
111
+ ]
112
+ end
113
+ end
114
+ end
115
+
116
+ def self.classes() @classes ||= {} end
117
+
118
+ def self.Class(id, name)
119
+ @_base_classes ||= {}
120
+ @_base_classes[id] ||= ::Class.new(Class) do
121
+ class_eval %[
122
+ def self.inherited klass
123
+ klass.const_set(:ID, #{id})
124
+ klass.const_set(:NAME, :#{name.to_s})
125
+ Protocol.classes[#{id}] = klass
126
+ Protocol.classes[klass::NAME] = klass
127
+ end
128
+ ]
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ module Carrot::AMQP
135
+ module Protocol
136
+ class Connection < Class( 10, :connection ); end
137
+ class Channel < Class( 20, :channel ); end
138
+ class Access < Class( 30, :access ); end
139
+ class Exchange < Class( 40, :exchange ); end
140
+ class Queue < Class( 50, :queue ); end
141
+ class Basic < Class( 60, :basic ); end
142
+ class File < Class( 70, :file ); end
143
+ class Stream < Class( 80, :stream ); end
144
+ class Tx < Class( 90, :tx ); end
145
+ class Dtx < Class( 100, :dtx ); end
146
+ class Tunnel < Class( 110, :tunnel ); end
147
+ class Test < Class( 120, :test ); end
148
+
149
+ class Connection
150
+
151
+ class Start < Method( 10, :start ); end
152
+ class StartOk < Method( 11, :start_ok ); end
153
+ class Secure < Method( 20, :secure ); end
154
+ class SecureOk < Method( 21, :secure_ok ); end
155
+ class Tune < Method( 30, :tune ); end
156
+ class TuneOk < Method( 31, :tune_ok ); end
157
+ class Open < Method( 40, :open ); end
158
+ class OpenOk < Method( 41, :open_ok ); end
159
+ class Redirect < Method( 50, :redirect ); end
160
+ class Close < Method( 60, :close ); end
161
+ class CloseOk < Method( 61, :close_ok ); end
162
+
163
+ class Start
164
+ octet :version_major
165
+ octet :version_minor
166
+ table :server_properties
167
+ longstr :mechanisms
168
+ longstr :locales
169
+ end
170
+
171
+ class StartOk
172
+ table :client_properties
173
+ shortstr :mechanism
174
+ longstr :response
175
+ shortstr :locale
176
+ end
177
+
178
+ class Secure
179
+ longstr :challenge
180
+ end
181
+
182
+ class SecureOk
183
+ longstr :response
184
+ end
185
+
186
+ class Tune
187
+ short :channel_max
188
+ long :frame_max
189
+ short :heartbeat
190
+ end
191
+
192
+ class TuneOk
193
+ short :channel_max
194
+ long :frame_max
195
+ short :heartbeat
196
+ end
197
+
198
+ class Open
199
+ shortstr :virtual_host
200
+ shortstr :capabilities
201
+ bit :insist
202
+ end
203
+
204
+ class OpenOk
205
+ shortstr :known_hosts
206
+ end
207
+
208
+ class Redirect
209
+ shortstr :host
210
+ shortstr :known_hosts
211
+ end
212
+
213
+ class Close
214
+ short :reply_code
215
+ shortstr :reply_text
216
+ short :class_id
217
+ short :method_id
218
+ end
219
+
220
+ class CloseOk
221
+ end
222
+
223
+ end
224
+
225
+ class Channel
226
+
227
+ class Open < Method( 10, :open ); end
228
+ class OpenOk < Method( 11, :open_ok ); end
229
+ class Flow < Method( 20, :flow ); end
230
+ class FlowOk < Method( 21, :flow_ok ); end
231
+ class Alert < Method( 30, :alert ); end
232
+ class Close < Method( 40, :close ); end
233
+ class CloseOk < Method( 41, :close_ok ); end
234
+
235
+ class Open
236
+ shortstr :out_of_band
237
+ end
238
+
239
+ class OpenOk
240
+ end
241
+
242
+ class Flow
243
+ bit :active
244
+ end
245
+
246
+ class FlowOk
247
+ bit :active
248
+ end
249
+
250
+ class Alert
251
+ short :reply_code
252
+ shortstr :reply_text
253
+ table :details
254
+ end
255
+
256
+ class Close
257
+ short :reply_code
258
+ shortstr :reply_text
259
+ short :class_id
260
+ short :method_id
261
+ end
262
+
263
+ class CloseOk
264
+ end
265
+
266
+ end
267
+
268
+ class Access
269
+
270
+ class Request < Method( 10, :request ); end
271
+ class RequestOk < Method( 11, :request_ok ); end
272
+
273
+ class Request
274
+ shortstr :realm
275
+ bit :exclusive
276
+ bit :passive
277
+ bit :active
278
+ bit :write
279
+ bit :read
280
+ end
281
+
282
+ class RequestOk
283
+ short :ticket
284
+ end
285
+
286
+ end
287
+
288
+ class Exchange
289
+
290
+ class Declare < Method( 10, :declare ); end
291
+ class DeclareOk < Method( 11, :declare_ok ); end
292
+ class Delete < Method( 20, :delete ); end
293
+ class DeleteOk < Method( 21, :delete_ok ); end
294
+
295
+ class Declare
296
+ short :ticket
297
+ shortstr :exchange
298
+ shortstr :type
299
+ bit :passive
300
+ bit :durable
301
+ bit :auto_delete
302
+ bit :internal
303
+ bit :nowait
304
+ table :arguments
305
+ end
306
+
307
+ class DeclareOk
308
+ end
309
+
310
+ class Delete
311
+ short :ticket
312
+ shortstr :exchange
313
+ bit :if_unused
314
+ bit :nowait
315
+ end
316
+
317
+ class DeleteOk
318
+ end
319
+
320
+ end
321
+
322
+ class Queue
323
+
324
+ class Declare < Method( 10, :declare ); end
325
+ class DeclareOk < Method( 11, :declare_ok ); end
326
+ class Bind < Method( 20, :bind ); end
327
+ class BindOk < Method( 21, :bind_ok ); end
328
+ class Purge < Method( 30, :purge ); end
329
+ class PurgeOk < Method( 31, :purge_ok ); end
330
+ class Delete < Method( 40, :delete ); end
331
+ class DeleteOk < Method( 41, :delete_ok ); end
332
+ class Unbind < Method( 50, :unbind ); end
333
+ class UnbindOk < Method( 51, :unbind_ok ); end
334
+
335
+ class Declare
336
+ short :ticket
337
+ shortstr :queue
338
+ bit :passive
339
+ bit :durable
340
+ bit :exclusive
341
+ bit :auto_delete
342
+ bit :nowait
343
+ table :arguments
344
+ end
345
+
346
+ class DeclareOk
347
+ shortstr :queue
348
+ long :message_count
349
+ long :consumer_count
350
+ end
351
+
352
+ class Bind
353
+ short :ticket
354
+ shortstr :queue
355
+ shortstr :exchange
356
+ shortstr :routing_key
357
+ bit :nowait
358
+ table :arguments
359
+ end
360
+
361
+ class BindOk
362
+ end
363
+
364
+ class Purge
365
+ short :ticket
366
+ shortstr :queue
367
+ bit :nowait
368
+ end
369
+
370
+ class PurgeOk
371
+ long :message_count
372
+ end
373
+
374
+ class Delete
375
+ short :ticket
376
+ shortstr :queue
377
+ bit :if_unused
378
+ bit :if_empty
379
+ bit :nowait
380
+ end
381
+
382
+ class DeleteOk
383
+ long :message_count
384
+ end
385
+
386
+ class Unbind
387
+ short :ticket
388
+ shortstr :queue
389
+ shortstr :exchange
390
+ shortstr :routing_key
391
+ table :arguments
392
+ end
393
+
394
+ class UnbindOk
395
+ end
396
+
397
+ end
398
+
399
+ class Basic
400
+ shortstr :content_type
401
+ shortstr :content_encoding
402
+ table :headers
403
+ octet :delivery_mode
404
+ octet :priority
405
+ shortstr :correlation_id
406
+ shortstr :reply_to
407
+ shortstr :expiration
408
+ shortstr :message_id
409
+ timestamp :timestamp
410
+ shortstr :type
411
+ shortstr :user_id
412
+ shortstr :app_id
413
+ shortstr :cluster_id
414
+
415
+ class Qos < Method( 10, :qos ); end
416
+ class QosOk < Method( 11, :qos_ok ); end
417
+ class Consume < Method( 20, :consume ); end
418
+ class ConsumeOk < Method( 21, :consume_ok ); end
419
+ class Cancel < Method( 30, :cancel ); end
420
+ class CancelOk < Method( 31, :cancel_ok ); end
421
+ class Publish < Method( 40, :publish ); end
422
+ class Return < Method( 50, :return ); end
423
+ class Deliver < Method( 60, :deliver ); end
424
+ class Get < Method( 70, :get ); end
425
+ class GetOk < Method( 71, :get_ok ); end
426
+ class GetEmpty < Method( 72, :get_empty ); end
427
+ class Ack < Method( 80, :ack ); end
428
+ class Reject < Method( 90, :reject ); end
429
+ class Recover < Method( 100, :recover ); end
430
+
431
+ class Qos
432
+ long :prefetch_size
433
+ short :prefetch_count
434
+ bit :global
435
+ end
436
+
437
+ class QosOk
438
+ end
439
+
440
+ class Consume
441
+ short :ticket
442
+ shortstr :queue
443
+ shortstr :consumer_tag
444
+ bit :no_local
445
+ bit :no_ack
446
+ bit :exclusive
447
+ bit :nowait
448
+ end
449
+
450
+ class ConsumeOk
451
+ shortstr :consumer_tag
452
+ end
453
+
454
+ class Cancel
455
+ shortstr :consumer_tag
456
+ bit :nowait
457
+ end
458
+
459
+ class CancelOk
460
+ shortstr :consumer_tag
461
+ end
462
+
463
+ class Publish
464
+ short :ticket
465
+ shortstr :exchange
466
+ shortstr :routing_key
467
+ bit :mandatory
468
+ bit :immediate
469
+ end
470
+
471
+ class Return
472
+ short :reply_code
473
+ shortstr :reply_text
474
+ shortstr :exchange
475
+ shortstr :routing_key
476
+ end
477
+
478
+ class Deliver
479
+ shortstr :consumer_tag
480
+ longlong :delivery_tag
481
+ bit :redelivered
482
+ shortstr :exchange
483
+ shortstr :routing_key
484
+ end
485
+
486
+ class Get
487
+ short :ticket
488
+ shortstr :queue
489
+ bit :no_ack
490
+ end
491
+
492
+ class GetOk
493
+ longlong :delivery_tag
494
+ bit :redelivered
495
+ shortstr :exchange
496
+ shortstr :routing_key
497
+ long :message_count
498
+ end
499
+
500
+ class GetEmpty
501
+ shortstr :cluster_id
502
+ end
503
+
504
+ class Ack
505
+ longlong :delivery_tag
506
+ bit :multiple
507
+ end
508
+
509
+ class Reject
510
+ longlong :delivery_tag
511
+ bit :requeue
512
+ end
513
+
514
+ class Recover
515
+ bit :requeue
516
+ end
517
+
518
+ end
519
+
520
+ class File
521
+ shortstr :content_type
522
+ shortstr :content_encoding
523
+ table :headers
524
+ octet :priority
525
+ shortstr :reply_to
526
+ shortstr :message_id
527
+ shortstr :filename
528
+ timestamp :timestamp
529
+ shortstr :cluster_id
530
+
531
+ class Qos < Method( 10, :qos ); end
532
+ class QosOk < Method( 11, :qos_ok ); end
533
+ class Consume < Method( 20, :consume ); end
534
+ class ConsumeOk < Method( 21, :consume_ok ); end
535
+ class Cancel < Method( 30, :cancel ); end
536
+ class CancelOk < Method( 31, :cancel_ok ); end
537
+ class Open < Method( 40, :open ); end
538
+ class OpenOk < Method( 41, :open_ok ); end
539
+ class Stage < Method( 50, :stage ); end
540
+ class Publish < Method( 60, :publish ); end
541
+ class Return < Method( 70, :return ); end
542
+ class Deliver < Method( 80, :deliver ); end
543
+ class Ack < Method( 90, :ack ); end
544
+ class Reject < Method( 100, :reject ); end
545
+
546
+ class Qos
547
+ long :prefetch_size
548
+ short :prefetch_count
549
+ bit :global
550
+ end
551
+
552
+ class QosOk
553
+ end
554
+
555
+ class Consume
556
+ short :ticket
557
+ shortstr :queue
558
+ shortstr :consumer_tag
559
+ bit :no_local
560
+ bit :no_ack
561
+ bit :exclusive
562
+ bit :nowait
563
+ end
564
+
565
+ class ConsumeOk
566
+ shortstr :consumer_tag
567
+ end
568
+
569
+ class Cancel
570
+ shortstr :consumer_tag
571
+ bit :nowait
572
+ end
573
+
574
+ class CancelOk
575
+ shortstr :consumer_tag
576
+ end
577
+
578
+ class Open
579
+ shortstr :identifier
580
+ longlong :content_size
581
+ end
582
+
583
+ class OpenOk
584
+ longlong :staged_size
585
+ end
586
+
587
+ class Stage
588
+ end
589
+
590
+ class Publish
591
+ short :ticket
592
+ shortstr :exchange
593
+ shortstr :routing_key
594
+ bit :mandatory
595
+ bit :immediate
596
+ shortstr :identifier
597
+ end
598
+
599
+ class Return
600
+ short :reply_code
601
+ shortstr :reply_text
602
+ shortstr :exchange
603
+ shortstr :routing_key
604
+ end
605
+
606
+ class Deliver
607
+ shortstr :consumer_tag
608
+ longlong :delivery_tag
609
+ bit :redelivered
610
+ shortstr :exchange
611
+ shortstr :routing_key
612
+ shortstr :identifier
613
+ end
614
+
615
+ class Ack
616
+ longlong :delivery_tag
617
+ bit :multiple
618
+ end
619
+
620
+ class Reject
621
+ longlong :delivery_tag
622
+ bit :requeue
623
+ end
624
+
625
+ end
626
+
627
+ class Stream
628
+ shortstr :content_type
629
+ shortstr :content_encoding
630
+ table :headers
631
+ octet :priority
632
+ timestamp :timestamp
633
+
634
+ class Qos < Method( 10, :qos ); end
635
+ class QosOk < Method( 11, :qos_ok ); end
636
+ class Consume < Method( 20, :consume ); end
637
+ class ConsumeOk < Method( 21, :consume_ok ); end
638
+ class Cancel < Method( 30, :cancel ); end
639
+ class CancelOk < Method( 31, :cancel_ok ); end
640
+ class Publish < Method( 40, :publish ); end
641
+ class Return < Method( 50, :return ); end
642
+ class Deliver < Method( 60, :deliver ); end
643
+
644
+ class Qos
645
+ long :prefetch_size
646
+ short :prefetch_count
647
+ long :consume_rate
648
+ bit :global
649
+ end
650
+
651
+ class QosOk
652
+ end
653
+
654
+ class Consume
655
+ short :ticket
656
+ shortstr :queue
657
+ shortstr :consumer_tag
658
+ bit :no_local
659
+ bit :exclusive
660
+ bit :nowait
661
+ end
662
+
663
+ class ConsumeOk
664
+ shortstr :consumer_tag
665
+ end
666
+
667
+ class Cancel
668
+ shortstr :consumer_tag
669
+ bit :nowait
670
+ end
671
+
672
+ class CancelOk
673
+ shortstr :consumer_tag
674
+ end
675
+
676
+ class Publish
677
+ short :ticket
678
+ shortstr :exchange
679
+ shortstr :routing_key
680
+ bit :mandatory
681
+ bit :immediate
682
+ end
683
+
684
+ class Return
685
+ short :reply_code
686
+ shortstr :reply_text
687
+ shortstr :exchange
688
+ shortstr :routing_key
689
+ end
690
+
691
+ class Deliver
692
+ shortstr :consumer_tag
693
+ longlong :delivery_tag
694
+ shortstr :exchange
695
+ shortstr :queue
696
+ end
697
+
698
+ end
699
+
700
+ class Tx
701
+
702
+ class Select < Method( 10, :select ); end
703
+ class SelectOk < Method( 11, :select_ok ); end
704
+ class Commit < Method( 20, :commit ); end
705
+ class CommitOk < Method( 21, :commit_ok ); end
706
+ class Rollback < Method( 30, :rollback ); end
707
+ class RollbackOk < Method( 31, :rollback_ok ); end
708
+
709
+ class Select
710
+ end
711
+
712
+ class SelectOk
713
+ end
714
+
715
+ class Commit
716
+ end
717
+
718
+ class CommitOk
719
+ end
720
+
721
+ class Rollback
722
+ end
723
+
724
+ class RollbackOk
725
+ end
726
+
727
+ end
728
+
729
+ class Dtx
730
+
731
+ class Select < Method( 10, :select ); end
732
+ class SelectOk < Method( 11, :select_ok ); end
733
+ class Start < Method( 20, :start ); end
734
+ class StartOk < Method( 21, :start_ok ); end
735
+
736
+ class Select
737
+ end
738
+
739
+ class SelectOk
740
+ end
741
+
742
+ class Start
743
+ shortstr :dtx_identifier
744
+ end
745
+
746
+ class StartOk
747
+ end
748
+
749
+ end
750
+
751
+ class Tunnel
752
+ table :headers
753
+ shortstr :proxy_name
754
+ shortstr :data_name
755
+ octet :durable
756
+ octet :broadcast
757
+
758
+ class Request < Method( 10, :request ); end
759
+
760
+ class Request
761
+ table :meta_data
762
+ end
763
+
764
+ end
765
+
766
+ class Test
767
+
768
+ class Integer < Method( 10, :integer ); end
769
+ class IntegerOk < Method( 11, :integer_ok ); end
770
+ class String < Method( 20, :string ); end
771
+ class StringOk < Method( 21, :string_ok ); end
772
+ class Table < Method( 30, :table ); end
773
+ class TableOk < Method( 31, :table_ok ); end
774
+ class Content < Method( 40, :content ); end
775
+ class ContentOk < Method( 41, :content_ok ); end
776
+
777
+ class Integer
778
+ octet :integer_1
779
+ short :integer_2
780
+ long :integer_3
781
+ longlong :integer_4
782
+ octet :operation
783
+ end
784
+
785
+ class IntegerOk
786
+ longlong :result
787
+ end
788
+
789
+ class String
790
+ shortstr :string_1
791
+ longstr :string_2
792
+ octet :operation
793
+ end
794
+
795
+ class StringOk
796
+ longstr :result
797
+ end
798
+
799
+ class Table
800
+ table :table
801
+ octet :integer_op
802
+ octet :string_op
803
+ end
804
+
805
+ class TableOk
806
+ longlong :integer_result
807
+ longstr :string_result
808
+ end
809
+
810
+ class Content
811
+ end
812
+
813
+ class ContentOk
814
+ long :content_checksum
815
+ end
816
+
817
+ end
818
+
819
+ end
820
+ end