rabbitmq 0.2.3 → 0.2.4

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/ext/rabbitmq/Rakefile +14 -9
  4. data/lib/rabbitmq/connection/channel_manager.rb +61 -0
  5. data/lib/rabbitmq/connection/event_manager.rb +55 -0
  6. data/lib/rabbitmq/connection/transport.rb +157 -0
  7. data/lib/rabbitmq/ffi.rb +4 -356
  8. data/lib/rabbitmq/ffi/ext.rb +12 -299
  9. data/lib/rabbitmq/ffi/ext/basic_properties.rb +57 -0
  10. data/lib/rabbitmq/ffi/ext/bytes.rb +29 -0
  11. data/lib/rabbitmq/ffi/ext/connection_info.rb +12 -0
  12. data/lib/rabbitmq/ffi/ext/field_value.rb +49 -0
  13. data/lib/rabbitmq/ffi/ext/frame.rb +43 -0
  14. data/lib/rabbitmq/ffi/ext/frame_payload_properties.rb +12 -0
  15. data/lib/rabbitmq/ffi/ext/method.rb +49 -0
  16. data/lib/rabbitmq/ffi/ext/table.rb +51 -0
  17. data/lib/rabbitmq/ffi/ext/timeval.rb +18 -0
  18. data/lib/rabbitmq/ffi/gen.rb +65 -0
  19. data/lib/rabbitmq/ffi/gen/access_request.rb +49 -0
  20. data/lib/rabbitmq/ffi/gen/access_request_ok.rb +29 -0
  21. data/lib/rabbitmq/ffi/gen/basic_ack.rb +36 -0
  22. data/lib/rabbitmq/ffi/gen/basic_cancel.rb +37 -0
  23. data/lib/rabbitmq/ffi/gen/basic_cancel_ok.rb +30 -0
  24. data/lib/rabbitmq/ffi/gen/basic_consume.rb +57 -0
  25. data/lib/rabbitmq/ffi/gen/basic_consume_ok.rb +30 -0
  26. data/lib/rabbitmq/ffi/gen/basic_deliver.rb +48 -0
  27. data/lib/rabbitmq/ffi/gen/basic_get.rb +40 -0
  28. data/lib/rabbitmq/ffi/gen/basic_get_empty.rb +30 -0
  29. data/lib/rabbitmq/ffi/gen/basic_get_ok.rb +47 -0
  30. data/lib/rabbitmq/ffi/gen/basic_nack.rb +39 -0
  31. data/lib/rabbitmq/ffi/gen/basic_publish.rb +47 -0
  32. data/lib/rabbitmq/ffi/gen/basic_qos.rb +39 -0
  33. data/lib/rabbitmq/ffi/gen/basic_qos_ok.rb +28 -0
  34. data/lib/rabbitmq/ffi/gen/basic_recover.rb +29 -0
  35. data/lib/rabbitmq/ffi/gen/basic_recover_async.rb +29 -0
  36. data/lib/rabbitmq/ffi/gen/basic_recover_ok.rb +28 -0
  37. data/lib/rabbitmq/ffi/gen/basic_reject.rb +36 -0
  38. data/lib/rabbitmq/ffi/gen/basic_return.rb +45 -0
  39. data/lib/rabbitmq/ffi/gen/channel_close.rb +45 -0
  40. data/lib/rabbitmq/ffi/gen/channel_close_ok.rb +28 -0
  41. data/lib/rabbitmq/ffi/gen/channel_flow.rb +29 -0
  42. data/lib/rabbitmq/ffi/gen/channel_flow_ok.rb +29 -0
  43. data/lib/rabbitmq/ffi/gen/channel_open.rb +30 -0
  44. data/lib/rabbitmq/ffi/gen/channel_open_ok.rb +30 -0
  45. data/lib/rabbitmq/ffi/gen/confirm_select.rb +29 -0
  46. data/lib/rabbitmq/ffi/gen/confirm_select_ok.rb +28 -0
  47. data/lib/rabbitmq/ffi/gen/connection_blocked.rb +30 -0
  48. data/lib/rabbitmq/ffi/gen/connection_close.rb +45 -0
  49. data/lib/rabbitmq/ffi/gen/connection_close_ok.rb +28 -0
  50. data/lib/rabbitmq/ffi/gen/connection_open.rb +41 -0
  51. data/lib/rabbitmq/ffi/gen/connection_open_ok.rb +30 -0
  52. data/lib/rabbitmq/ffi/gen/connection_secure.rb +30 -0
  53. data/lib/rabbitmq/ffi/gen/connection_secure_ok.rb +30 -0
  54. data/lib/rabbitmq/ffi/gen/connection_start.rb +48 -0
  55. data/lib/rabbitmq/ffi/gen/connection_start_ok.rb +46 -0
  56. data/lib/rabbitmq/ffi/gen/connection_tune.rb +39 -0
  57. data/lib/rabbitmq/ffi/gen/connection_tune_ok.rb +39 -0
  58. data/lib/rabbitmq/ffi/gen/connection_unblocked.rb +28 -0
  59. data/lib/rabbitmq/ffi/gen/exchange_bind.rb +52 -0
  60. data/lib/rabbitmq/ffi/gen/exchange_bind_ok.rb +28 -0
  61. data/lib/rabbitmq/ffi/gen/exchange_declare.rb +60 -0
  62. data/lib/rabbitmq/ffi/gen/exchange_declare_ok.rb +28 -0
  63. data/lib/rabbitmq/ffi/gen/exchange_delete.rb +43 -0
  64. data/lib/rabbitmq/ffi/gen/exchange_delete_ok.rb +28 -0
  65. data/lib/rabbitmq/ffi/gen/exchange_unbind.rb +52 -0
  66. data/lib/rabbitmq/ffi/gen/exchange_unbind_ok.rb +28 -0
  67. data/lib/rabbitmq/ffi/gen/queue_bind.rb +52 -0
  68. data/lib/rabbitmq/ffi/gen/queue_bind_ok.rb +28 -0
  69. data/lib/rabbitmq/ffi/gen/queue_declare.rb +56 -0
  70. data/lib/rabbitmq/ffi/gen/queue_declare_ok.rb +40 -0
  71. data/lib/rabbitmq/ffi/gen/queue_delete.rb +46 -0
  72. data/lib/rabbitmq/ffi/gen/queue_delete_ok.rb +29 -0
  73. data/lib/rabbitmq/ffi/gen/queue_purge.rb +40 -0
  74. data/lib/rabbitmq/ffi/gen/queue_purge_ok.rb +29 -0
  75. data/lib/rabbitmq/ffi/gen/queue_unbind.rb +49 -0
  76. data/lib/rabbitmq/ffi/gen/queue_unbind_ok.rb +28 -0
  77. data/lib/rabbitmq/ffi/gen/tx_commit.rb +28 -0
  78. data/lib/rabbitmq/ffi/gen/tx_commit_ok.rb +28 -0
  79. data/lib/rabbitmq/ffi/gen/tx_rollback.rb +28 -0
  80. data/lib/rabbitmq/ffi/gen/tx_rollback_ok.rb +28 -0
  81. data/lib/rabbitmq/ffi/gen/tx_select.rb +28 -0
  82. data/lib/rabbitmq/ffi/gen/tx_select_ok.rb +28 -0
  83. metadata +79 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb846b463a46e8d88e17f6ee64caab80faa6b1b5
4
- data.tar.gz: 7f4107feb512e7aa9abae32264536623453baa6e
3
+ metadata.gz: 7a316aadf277e65f4cdc221c69968f5384857db0
4
+ data.tar.gz: d60a1d8a3f037ecf5c34680ee4ae53dc8573f0d1
5
5
  SHA512:
6
- metadata.gz: 1ea282404a15b85ce764bd989e12f14bc2b7f2d604d57351fc5545eae25de47531bb9ab5661aab657ecd0f428f8bf6c0c5b4b8a46ea29a5263ae8b5fa35f3124
7
- data.tar.gz: 6b22c1156bec01feaf4cec670ad2222011680485db27110818f3fc12a7909698ceb9109029de4f7dc14668a3d630e2d622af06b805b3291ac4ae3fefdd78373a
6
+ metadata.gz: a4c2d7de59bc0f09122c77c3af96c6ff2bb04c16af0de3aa5b495d44bff738445205405d3a5a4b87e51b50cf7b51273c36b077165988a4d951974ae3bd6c5f1e
7
+ data.tar.gz: ea4f0cfe51575d0d7a2caa1411bf51bc650466197f41caab43cc858db5cba7d3e865b0ae7088e5cc6745e0cd2d1114ae61da66d6baddbbcd395dd527e446b0b6
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
1
  # rabbitmq
2
2
 
3
+ [![Build Status](https://travis-ci.org/jemc/ruby-rabbitmq.png)](https://travis-ci.org/jemc/ruby-rabbitmq)
4
+ [![Gem Version](https://badge.fury.io/rb/rabbitmq.png)](http://badge.fury.io/rb/rabbitmq)
5
+
3
6
  A Ruby RabbitMQ client library based on FFI bindings for librabbitmq.
@@ -1,5 +1,6 @@
1
1
 
2
2
  require 'rake/clean'
3
+ require 'ffi'
3
4
 
4
5
  FILES = {}
5
6
 
@@ -19,24 +20,28 @@ def self.file_task(filename, opts, &block)
19
20
  end
20
21
  end
21
22
 
23
+ def cmd(string)
24
+ fail "Command failed: #{string}" unless system(string)
25
+ end
26
+
22
27
  file_task 'rabbitmq-c.tar.gz', :download_tarball do
23
28
  version = "0.6.0"
24
29
  release = "https://github.com/alanxz/rabbitmq-c/releases/download/v#{version}/rabbitmq-c-#{version}.tar.gz"
25
- system "wget #{release}"
26
- system "mv #{File.basename(release)} #{FILES[:download_tarball]}"
30
+ cmd "wget #{release}"
31
+ cmd "mv #{File.basename(release)} #{FILES[:download_tarball]}"
27
32
  end
28
33
 
29
34
  file_task 'rabbitmq-c', :download => :download_tarball do
30
- system "tar -xf #{FILES[:download_tarball]}"
31
- system "mv rabbitmq-c-* #{FILES[:download]}"
35
+ cmd "tar -xf #{FILES[:download_tarball]}"
36
+ cmd "mv rabbitmq-c-* #{FILES[:download]}"
32
37
  end
33
38
 
34
39
  file_task 'config.status', :configure => :download do
35
- system "bash -c 'cd #{FILES[:download]} && env CFLAGS=-g ./configure'"
36
- system "cp #{FILES[:download]}/#{FILES[:configure]} ./"
40
+ cmd "bash -c 'cd #{FILES[:download]} && env CFLAGS=-g ./configure'"
41
+ cmd "cp #{FILES[:download]}/#{FILES[:configure]} ./"
37
42
  end
38
43
 
39
- file_task 'librabbitmq.so', :build => :configure do
40
- system "bash -c 'cd #{FILES[:download]} && make'"
41
- system "cp #{FILES[:download]}/librabbitmq/.libs/#{FILES[:build]} ."
44
+ file_task "librabbitmq.#{::FFI::Platform::LIBSUFFIX}", :build => :configure do
45
+ cmd "bash -c 'cd #{FILES[:download]} && make'"
46
+ cmd "cp #{FILES[:download]}/librabbitmq/.libs/#{FILES[:build]} ."
42
47
  end
@@ -0,0 +1,61 @@
1
+
2
+ module RabbitMQ
3
+ class Connection
4
+
5
+ class ChannelManager
6
+ def initialize(connection)
7
+ @connection = connection
8
+ @open_channels = {}
9
+ @released_channels = {}
10
+ end
11
+
12
+ def allocate_channel(id=nil)
13
+ if id
14
+ raise ArgumentError, "channel #{id} is already in use" if @open_channels[id]
15
+ elsif @released_channels.empty?
16
+ id = (@open_channels.keys.sort.last || 0) + 1
17
+ else
18
+ id = @released_channels.keys.first
19
+ end
20
+ raise ArgumentError, "channel #{id} is too high" if id > @connection.max_channels
21
+
22
+ already_open = @released_channels.delete(id)
23
+ request_channel_open(id) unless already_open
24
+
25
+ @open_channels[id] = true
26
+ @event_handlers[id] ||= {}
27
+
28
+ id
29
+ end
30
+
31
+ def release_channel(id)
32
+ @open_channels.delete(id)
33
+ @released_channels[id] = true
34
+ end
35
+
36
+ def release_all_channels
37
+ @open_channels.clear
38
+ @released_channels.clear
39
+ end
40
+
41
+ def request_channel_open(id)
42
+ Util.error_check :"opening a new channel",
43
+ @connection.send_request_internal(id, :channel_open)
44
+
45
+ @connection.fetch_response(id, :channel_open_ok)
46
+ end
47
+
48
+ def request_channel_reopen(id)
49
+ Util.error_check :"acknowledging server-initated channel closure",
50
+ @connection.send_request_internal(id, :channel_close_ok)
51
+
52
+ Util.error_check :"reopening channel after server-initated closure",
53
+ @connection.send_request_internal(id, :channel_open)
54
+
55
+ @connection.fetch_response(id, :channel_open_ok)
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,55 @@
1
+
2
+ module RabbitMQ
3
+ class Connection
4
+
5
+ class EventManager
6
+ def initialize(connection)
7
+ @connection = connection
8
+ @event_handlers = Hash.new { |h,k| h[k] = {} }
9
+ @incoming_events = Hash.new { |h,k| h[k] = {} }
10
+ end
11
+
12
+ def register_handler(id, method, handler)
13
+ @event_handlers[id][method] = handler
14
+ end
15
+
16
+ def clear_event_handlers(id)
17
+ @event_handlers.delete(id)
18
+ end
19
+
20
+ def clear_all_event_handlers
21
+ @event_handlers.clear
22
+ end
23
+
24
+ # Execute the handler for this type of event, if any
25
+ def handle_incoming_event(event)
26
+ if (handlers = @event_handlers[event.fetch(:channel)])
27
+ if (handler = (handlers[event.fetch(:method)]))
28
+ handler.call(event)
29
+ end
30
+ end
31
+ end
32
+
33
+ # Store the event in short-term storage for retrieval by fetch_response.
34
+ # If another event is received with the same method name, it will
35
+ # overwrite this one - fetch_response gets the latest or next by method.
36
+ def store_incoming_event(event)
37
+ method = event.fetch(:method)
38
+
39
+ case method
40
+ when :channel_close
41
+ raise_if_server_error!(event)
42
+ when :connection_close
43
+ raise_if_server_error!(event)
44
+ else
45
+ @incoming_events[event.fetch(:channel)][method] = event
46
+ end
47
+ end
48
+
49
+ def fetch_stored_event(channel_id, method)
50
+ @incoming_events[channel_id].delete(method)
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,157 @@
1
+
2
+ require 'socket'
3
+
4
+ module RabbitMQ
5
+ class Connection
6
+
7
+ class DestroyedError < RuntimeError; end
8
+
9
+ class Transport
10
+
11
+ attr_reader :ptr
12
+
13
+ def initialize(connnection)
14
+ @ptr = FFI.amqp_new_connection
15
+ @frame = FFI::Frame.new
16
+ @connection = connnection
17
+
18
+ create_socket!
19
+
20
+ @finalizer = self.class.create_finalizer_for(@ptr)
21
+ ObjectSpace.define_finalizer(self, @finalizer)
22
+ end
23
+
24
+ def destroy
25
+ if @finalizer
26
+ @finalizer.call
27
+ ObjectSpace.undefine_finalizer(self)
28
+ end
29
+ @ptr = @socket = @finalizer = nil
30
+ end
31
+
32
+ # @private
33
+ def self.create_finalizer_for(ptr)
34
+ Proc.new do
35
+ FFI.amqp_connection_close(ptr, 200)
36
+ FFI.amqp_destroy_connection(ptr)
37
+ end
38
+ end
39
+
40
+ def ptr
41
+ raise DestroyedError unless @ptr
42
+ @ptr
43
+ end
44
+
45
+ def close
46
+ raise DestroyedError unless @ptr
47
+ FFI.amqp_connection_close(@ptr, 200)
48
+ end
49
+
50
+ def create_socket!
51
+ raise DestroyedError unless @ptr
52
+
53
+ @socket = FFI.amqp_tcp_socket_new(@ptr)
54
+ Util.null_check :"creating a socket", @socket
55
+ end
56
+
57
+ def connect_socket!
58
+ raise DestroyedError unless @ptr
59
+ raise NotImplementedError if @connection.ssl?
60
+
61
+ create_socket!
62
+ Util.error_check :"opening a socket",
63
+ FFI.amqp_socket_open(@socket, @connection.host, @connection.port)
64
+
65
+ @ruby_socket = Socket.for_fd(FFI.amqp_get_sockfd(@ptr))
66
+ @ruby_socket.autoclose = false
67
+ end
68
+
69
+ def login!
70
+ raise DestroyedError unless @ptr
71
+
72
+ res = FFI.amqp_login(@ptr, @connection.vhost,
73
+ @connection.max_channels, @connection.max_frame_size,
74
+ @connection.heartbeat_interval, :plain,
75
+ :string, @connection.user, :string, @connection.password)
76
+
77
+ case res[:reply_type]
78
+ when :library_exception; Util.error_check :"logging in", res[:library_error]
79
+ when :server_exception; raise NotImplementedError
80
+ end
81
+
82
+ @server_properties = FFI::Table.new(FFI.amqp_get_server_properties(@ptr)).to_h
83
+ end
84
+
85
+ # Block until there is readable data on the internal ruby socket,
86
+ # returning true if there is readable data, or false if time expired.
87
+ def select(timeout=0, start=Time.now)
88
+ if timeout
89
+ timeout = timeout - (start-Time.now)
90
+ timeout = 0 if timeout < 0
91
+ end
92
+
93
+ IO.select([@ruby_socket], [], [], timeout) ? true : false
94
+ end
95
+
96
+ # Return the next available frame, or nil if time expired.
97
+ def fetch_next_frame(timeout=0, start=Time.now)
98
+ frame = @frame
99
+
100
+ # Try fetching the next frame without a blocking call.
101
+ status = FFI.amqp_simple_wait_frame_noblock(@ptr, frame, FFI::Timeval.zero)
102
+ case status
103
+ when :ok; return frame
104
+ when :timeout; # do nothing and proceed to waiting on select below
105
+ else Util.error_check :"fetching the next frame", status
106
+ end
107
+
108
+ # Otherwise, wait for the socket to be readable and try fetching again.
109
+ return nil unless select(timeout, start)
110
+ Util.error_check :"fetching the next frame",
111
+ FFI.amqp_simple_wait_frame(@ptr, frame)
112
+
113
+ frame
114
+ end
115
+
116
+ # Fetch the next one or more frames to form the next discrete event,
117
+ # returning the event as a Hash, or nil if time expired.
118
+ def fetch_next_event(timeout=0, start=Time.now)
119
+ frame = fetch_next_frame(timeout, start)
120
+ return unless frame
121
+ event = frame.as_method_to_h(false)
122
+ return event unless FFI::Method.has_content?(event.fetch(:method))
123
+
124
+ frame = fetch_next_frame(timeout, start)
125
+ return unless frame
126
+ event.merge!(frame.as_header_to_h)
127
+
128
+ body = ""
129
+ while body.size < event.fetch(:body_size)
130
+ frame = fetch_next_frame(timeout, start)
131
+ return unless frame
132
+ body.concat frame.as_body_to_s
133
+ end
134
+
135
+ event[:body] = body
136
+ event
137
+ end
138
+
139
+ def send_method(channel_id, method, properties={})
140
+ req = FFI::Method.lookup_class(method).new.apply(properties)
141
+ status = FFI.amqp_send_method(ptr, channel_id, method, req.pointer)
142
+
143
+ req.free!
144
+ status
145
+ end
146
+
147
+ def garbage_collect
148
+ FFI.amqp_maybe_release_buffers(ptr)
149
+ end
150
+
151
+ def garbage_collect_channel(channel_id)
152
+ FFI.amqp_maybe_release_buffers_on_channel(ptr, channel_id)
153
+ end
154
+ end
155
+
156
+ end
157
+ end
data/lib/rabbitmq/ffi.rb CHANGED
@@ -6,9 +6,11 @@ module RabbitMQ
6
6
  module FFI
7
7
  extend ::FFI::Library
8
8
 
9
+ libfile = "librabbitmq.#{::FFI::Platform::LIBSUFFIX}"
10
+
9
11
  ffi_lib ::FFI::Library::LIBC
10
12
  ffi_lib \
11
- File.expand_path("../../ext/rabbitmq/librabbitmq.so", File.dirname(__FILE__))
13
+ File.expand_path("../../ext/rabbitmq/#{libfile}", File.dirname(__FILE__))
12
14
 
13
15
  begin # TODO: remove begin/end block
14
16
  opts = {
@@ -289,361 +291,7 @@ module RabbitMQ
289
291
  attach_function :amqp_encode_method, [MethodNumber, :pointer, Bytes.val], Status, **opts
290
292
  attach_function :amqp_encode_properties, [:uint16, :pointer, Bytes.val], Status, **opts
291
293
 
292
- class ConnectionStart < ::FFI::Struct
293
- layout :version_major, :uint8,
294
- :version_minor, :uint8,
295
- :server_properties, Table,
296
- :mechanisms, Bytes,
297
- :locales, Bytes
298
- end
299
-
300
- class ConnectionStartOk < ::FFI::Struct
301
- layout :client_properties, Table,
302
- :mechanism, Bytes,
303
- :response, Bytes,
304
- :locale, Bytes
305
- end
306
-
307
- class ConnectionSecure < ::FFI::Struct
308
- layout :challenge, Bytes
309
- end
310
-
311
- class ConnectionSecureOk < ::FFI::Struct
312
- layout :response, Bytes
313
- end
314
-
315
- class ConnectionTune < ::FFI::Struct
316
- layout :channel_max, :uint16,
317
- :frame_max, :uint32,
318
- :heartbeat, :uint16
319
- end
320
-
321
- class ConnectionTuneOk < ::FFI::Struct
322
- layout :channel_max, :uint16,
323
- :frame_max, :uint32,
324
- :heartbeat, :uint16
325
- end
326
-
327
- class ConnectionOpen < ::FFI::Struct
328
- layout :virtual_host, Bytes,
329
- :capabilities, Bytes,
330
- :insist, Boolean
331
- end
332
-
333
- class ConnectionOpenOk < ::FFI::Struct
334
- layout :known_hosts, Bytes
335
- end
336
-
337
- class ConnectionClose < ::FFI::Struct
338
- layout :reply_code, :uint16,
339
- :reply_text, Bytes,
340
- :class_id, :uint16,
341
- :method_id, :uint16
342
- end
343
-
344
- class ConnectionCloseOk < ::FFI::Struct
345
- layout :dummy, :char
346
- end
347
-
348
- class ConnectionBlocked < ::FFI::Struct
349
- layout :reason, Bytes
350
- end
351
-
352
- class ConnectionUnblocked < ::FFI::Struct
353
- layout :dummy, :char
354
- end
355
-
356
- class ChannelOpen < ::FFI::Struct
357
- layout :out_of_band, Bytes
358
- end
359
-
360
- class ChannelOpenOk < ::FFI::Struct
361
- layout :channel_id, Bytes
362
- end
363
-
364
- class ChannelFlow < ::FFI::Struct
365
- layout :active, Boolean
366
- end
367
-
368
- class ChannelFlowOk < ::FFI::Struct
369
- layout :active, Boolean
370
- end
371
-
372
- class ChannelClose < ::FFI::Struct
373
- layout :reply_code, :uint16,
374
- :reply_text, Bytes,
375
- :class_id, :uint16,
376
- :method_id, :uint16
377
- end
378
-
379
- class ChannelCloseOk < ::FFI::Struct
380
- layout :dummy, :char
381
- end
382
-
383
- class AccessRequest < ::FFI::Struct
384
- layout :realm, Bytes,
385
- :exclusive, Boolean,
386
- :passive, Boolean,
387
- :active, Boolean,
388
- :write, Boolean,
389
- :read, Boolean
390
- end
391
-
392
- class AccessRequestOk < ::FFI::Struct
393
- layout :ticket, :uint16
394
- end
395
-
396
- class ExchangeDeclare < ::FFI::Struct
397
- layout :ticket, :uint16,
398
- :exchange, Bytes,
399
- :type, Bytes,
400
- :passive, Boolean,
401
- :durable, Boolean,
402
- :auto_delete, Boolean,
403
- :internal, Boolean,
404
- :nowait, Boolean,
405
- :arguments, Table
406
- end
407
-
408
- class ExchangeDeclareOk < ::FFI::Struct
409
- layout :dummy, :char
410
- end
411
-
412
- class ExchangeDelete < ::FFI::Struct
413
- layout :ticket, :uint16,
414
- :exchange, Bytes,
415
- :if_unused, Boolean,
416
- :nowait, Boolean
417
- end
418
-
419
- class ExchangeDeleteOk < ::FFI::Struct
420
- layout :dummy, :char
421
- end
422
-
423
- class ExchangeBind < ::FFI::Struct
424
- layout :ticket, :uint16,
425
- :destination, Bytes,
426
- :source, Bytes,
427
- :routing_key, Bytes,
428
- :nowait, Boolean,
429
- :arguments, Table
430
- end
431
-
432
- class ExchangeBindOk < ::FFI::Struct
433
- layout :dummy, :char
434
- end
435
-
436
- class ExchangeUnbind < ::FFI::Struct
437
- layout :ticket, :uint16,
438
- :destination, Bytes,
439
- :source, Bytes,
440
- :routing_key, Bytes,
441
- :nowait, Boolean,
442
- :arguments, Table
443
- end
444
-
445
- class ExchangeUnbindOk < ::FFI::Struct
446
- layout :dummy, :char
447
- end
448
-
449
- class QueueDeclare < ::FFI::Struct
450
- layout :ticket, :uint16,
451
- :queue, Bytes,
452
- :passive, Boolean,
453
- :durable, Boolean,
454
- :exclusive, Boolean,
455
- :auto_delete, Boolean,
456
- :nowait, Boolean,
457
- :arguments, Table
458
- end
459
-
460
- class QueueDeclareOk < ::FFI::Struct
461
- layout :queue, Bytes,
462
- :message_count, :uint32,
463
- :consumer_count, :uint32
464
- end
465
-
466
- class QueueBind < ::FFI::Struct
467
- layout :ticket, :uint16,
468
- :queue, Bytes,
469
- :exchange, Bytes,
470
- :routing_key, Bytes,
471
- :nowait, Boolean,
472
- :arguments, Table
473
- end
474
-
475
- class QueueBindOk < ::FFI::Struct
476
- layout :dummy, :char
477
- end
478
-
479
- class QueuePurge < ::FFI::Struct
480
- layout :ticket, :uint16,
481
- :queue, Bytes,
482
- :nowait, Boolean
483
- end
484
-
485
- class QueuePurgeOk < ::FFI::Struct
486
- layout :message_count, :uint32
487
- end
488
-
489
- class QueueDelete < ::FFI::Struct
490
- layout :ticket, :uint16,
491
- :queue, Bytes,
492
- :if_unused, Boolean,
493
- :if_empty, Boolean,
494
- :nowait, Boolean
495
- end
496
-
497
- class QueueDeleteOk < ::FFI::Struct
498
- layout :message_count, :uint32
499
- end
500
-
501
- class QueueUnbind < ::FFI::Struct
502
- layout :ticket, :uint16,
503
- :queue, Bytes,
504
- :exchange, Bytes,
505
- :routing_key, Bytes,
506
- :arguments, Table
507
- end
508
-
509
- class QueueUnbindOk < ::FFI::Struct
510
- layout :dummy, :char
511
- end
512
-
513
- class BasicQos < ::FFI::Struct
514
- layout :prefetch_size, :uint32,
515
- :prefetch_count, :uint16,
516
- :global, Boolean
517
- end
518
-
519
- class BasicQosOk < ::FFI::Struct
520
- layout :dummy, :char
521
- end
522
-
523
- class BasicConsume < ::FFI::Struct
524
- layout :ticket, :uint16,
525
- :queue, Bytes,
526
- :consumer_tag, Bytes,
527
- :no_local, Boolean,
528
- :no_ack, Boolean,
529
- :exclusive, Boolean,
530
- :nowait, Boolean,
531
- :arguments, Table
532
- end
533
-
534
- class BasicConsumeOk < ::FFI::Struct
535
- layout :consumer_tag, Bytes
536
- end
537
-
538
- class BasicCancel < ::FFI::Struct
539
- layout :consumer_tag, Bytes,
540
- :nowait, Boolean
541
- end
542
-
543
- class BasicCancelOk < ::FFI::Struct
544
- layout :consumer_tag, Bytes
545
- end
546
-
547
- class BasicPublish < ::FFI::Struct
548
- layout :ticket, :uint16,
549
- :exchange, Bytes,
550
- :routing_key, Bytes,
551
- :mandatory, Boolean,
552
- :immediate, Boolean
553
- end
554
-
555
- class BasicReturn < ::FFI::Struct
556
- layout :reply_code, :uint16,
557
- :reply_text, Bytes,
558
- :exchange, Bytes,
559
- :routing_key, Bytes
560
- end
561
-
562
- class BasicDeliver < ::FFI::Struct
563
- layout :consumer_tag, Bytes,
564
- :delivery_tag, :uint64,
565
- :redelivered, Boolean,
566
- :exchange, Bytes,
567
- :routing_key, Bytes
568
- end
569
-
570
- class BasicGet < ::FFI::Struct
571
- layout :ticket, :uint16,
572
- :queue, Bytes,
573
- :no_ack, Boolean
574
- end
575
-
576
- class BasicGetOk < ::FFI::Struct
577
- layout :delivery_tag, :uint64,
578
- :redelivered, Boolean,
579
- :exchange, Bytes,
580
- :routing_key, Bytes,
581
- :message_count, :uint32
582
- end
583
-
584
- class BasicGetEmpty < ::FFI::Struct
585
- layout :cluster_id, Bytes
586
- end
587
-
588
- class BasicAck < ::FFI::Struct
589
- layout :delivery_tag, :uint64,
590
- :multiple, Boolean
591
- end
592
-
593
- class BasicReject < ::FFI::Struct
594
- layout :delivery_tag, :uint64,
595
- :requeue, Boolean
596
- end
597
-
598
- class BasicRecoverAsync < ::FFI::Struct
599
- layout :requeue, Boolean
600
- end
601
-
602
- class BasicRecover < ::FFI::Struct
603
- layout :requeue, Boolean
604
- end
605
-
606
- class BasicRecoverOk < ::FFI::Struct
607
- layout :dummy, :char
608
- end
609
-
610
- class BasicNack < ::FFI::Struct
611
- layout :delivery_tag, :uint64,
612
- :multiple, Boolean,
613
- :requeue, Boolean
614
- end
615
-
616
- class TxSelect < ::FFI::Struct
617
- layout :dummy, :char
618
- end
619
-
620
- class TxSelectOk < ::FFI::Struct
621
- layout :dummy, :char
622
- end
623
-
624
- class TxCommit < ::FFI::Struct
625
- layout :dummy, :char
626
- end
627
-
628
- class TxCommitOk < ::FFI::Struct
629
- layout :dummy, :char
630
- end
631
-
632
- class TxRollback < ::FFI::Struct
633
- layout :dummy, :char
634
- end
635
-
636
- class TxRollbackOk < ::FFI::Struct
637
- layout :dummy, :char
638
- end
639
-
640
- class ConfirmSelect < ::FFI::Struct
641
- layout :nowait, Boolean
642
- end
643
-
644
- class ConfirmSelectOk < ::FFI::Struct
645
- layout :dummy, :char
646
- end
294
+ require_relative 'ffi/gen'
647
295
 
648
296
  class ConnectionProperties < ::FFI::Struct
649
297
  layout :flags, Flags,