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
@@ -0,0 +1,43 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+
5
+ class Frame
6
+ def payload
7
+ member = case self[:frame_type]
8
+ when :method; :method
9
+ when :header; :properties
10
+ when :body; :body_fragment
11
+ else; raise NotImplementedError, "frame type: #{self[:frame_type]}"
12
+ end
13
+ self[:payload][member]
14
+ end
15
+
16
+ def as_method_to_h(free=false)
17
+ # TODO: raise correct error class with enough info for appropriate action
18
+ raise "Wrong frame type for method frame of event: #{self[:frame_type]}" \
19
+ unless self[:frame_type] == :method
20
+
21
+ payload.to_h(free).merge(channel: self[:channel])
22
+ end
23
+
24
+ def as_header_to_h(free=false)
25
+ # TODO: raise correct error class with enough info for appropriate action
26
+ raise "Wrong frame type for header frame of multiframe event: #{self[:frame_type]}" \
27
+ unless self[:frame_type] == :header
28
+
29
+ properties = self[:payload][:properties]
30
+ { header: properties.decoded.to_h(free), body_size: properties[:body_size] }
31
+ end
32
+
33
+ def as_body_to_s(free=false)
34
+ # TODO: raise correct error class with enough info for appropriate action
35
+ raise "Wrong frame type for body frame of multiframe event: #{self[:frame_type]}" \
36
+ unless self[:frame_type] == :body
37
+
38
+ self[:payload][:body_fragment].to_s(free)
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+
5
+ class FramePayloadProperties
6
+ def decoded
7
+ BasicProperties.new(self[:decoded])
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+
5
+ class Method
6
+ MethodClasses = FFI::MethodNumber.symbols.map do |name|
7
+ const_name = name.to_s.gsub(/((?:\A\w)|(?:_\w))/) { |x| x[-1].upcase }
8
+ [name, FFI.const_get(const_name)]
9
+ end.to_h.freeze
10
+
11
+ MethodNames = MethodClasses.to_a.map(&:reverse).to_h.freeze
12
+
13
+ def to_h(free=false)
14
+ { method: self[:id],
15
+ properties: self.decoded.to_h(free) }
16
+ end
17
+
18
+ def decoded
19
+ MethodClasses.fetch(self[:id]).new(self[:decoded])
20
+ end
21
+
22
+ def self.lookup(kls)
23
+ MethodNames.fetch(kls)
24
+ end
25
+
26
+ def self.lookup_class(name)
27
+ MethodClasses.fetch(name)
28
+ end
29
+
30
+ def self.from(decoded)
31
+ obj = new
32
+ obj[:id] = lookup(decoded.class)
33
+ obj[:decoded] = decoded.pointer
34
+ obj
35
+ end
36
+
37
+ def self.has_content?(type)
38
+ case type
39
+ when :basic_publish; true
40
+ when :basic_return; true
41
+ when :basic_deliver; true
42
+ when :basic_get_ok; true
43
+ else false
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,51 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+
5
+ class Table
6
+ include Enumerable
7
+
8
+ def each(*a, &b)
9
+ entry_ptr = self[:entries]
10
+ entries = self[:num_entries].times.map do |i|
11
+ FFI::TableEntry.new(entry_ptr + i * FFI::TableEntry.size)
12
+ end
13
+ entries.each(*a, &b)
14
+ end
15
+
16
+ def to_h(free=false)
17
+ result = self.map do |entry|
18
+ [entry[:key].to_s(free), entry[:value].to_value(free)]
19
+ end.to_h
20
+
21
+ clear if free
22
+ result
23
+ end
24
+
25
+ def free!
26
+ self.each do
27
+ entry[:key].free!
28
+ entry[:value].free!
29
+ end
30
+ FFI.free(self[:entries])
31
+ clear
32
+ end
33
+
34
+ def self.from(params)
35
+ size = params.size
36
+ entry_ptr = Util.mem_ptr(size * FFI::TableEntry.size, release: false)
37
+ params.each_with_index do |param, idx|
38
+ entry = FFI::TableEntry.new(entry_ptr + idx * FFI::TableEntry.size)
39
+ entry[:key] = FFI::Bytes.from_s(param.first.to_s)
40
+ entry[:value] = FFI::FieldValue.from(param.last)
41
+ end
42
+
43
+ obj = new
44
+ obj[:num_entries] = size
45
+ obj[:entries] = entry_ptr
46
+ obj
47
+ end
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+
5
+ class Timeval
6
+ def self.from(seconds)
7
+ obj = new
8
+ obj[:tv_sec] = Integer(seconds)
9
+ obj[:tv_usec] = Integer(Float(seconds) * 1_000_000)
10
+ obj
11
+ end
12
+
13
+ @zero = self.from(0)
14
+ class << self; attr_reader :zero; end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,65 @@
1
+
2
+ require_relative 'gen/connection_start'
3
+ require_relative 'gen/connection_start_ok'
4
+ require_relative 'gen/connection_secure'
5
+ require_relative 'gen/connection_secure_ok'
6
+ require_relative 'gen/connection_tune'
7
+ require_relative 'gen/connection_tune_ok'
8
+ require_relative 'gen/connection_open'
9
+ require_relative 'gen/connection_open_ok'
10
+ require_relative 'gen/connection_close'
11
+ require_relative 'gen/connection_close_ok'
12
+ require_relative 'gen/connection_blocked'
13
+ require_relative 'gen/connection_unblocked'
14
+ require_relative 'gen/channel_open'
15
+ require_relative 'gen/channel_open_ok'
16
+ require_relative 'gen/channel_flow'
17
+ require_relative 'gen/channel_flow_ok'
18
+ require_relative 'gen/channel_close'
19
+ require_relative 'gen/channel_close_ok'
20
+ require_relative 'gen/access_request'
21
+ require_relative 'gen/access_request_ok'
22
+ require_relative 'gen/exchange_declare'
23
+ require_relative 'gen/exchange_declare_ok'
24
+ require_relative 'gen/exchange_delete'
25
+ require_relative 'gen/exchange_delete_ok'
26
+ require_relative 'gen/exchange_bind'
27
+ require_relative 'gen/exchange_bind_ok'
28
+ require_relative 'gen/exchange_unbind'
29
+ require_relative 'gen/exchange_unbind_ok'
30
+ require_relative 'gen/queue_declare'
31
+ require_relative 'gen/queue_declare_ok'
32
+ require_relative 'gen/queue_bind'
33
+ require_relative 'gen/queue_bind_ok'
34
+ require_relative 'gen/queue_purge'
35
+ require_relative 'gen/queue_purge_ok'
36
+ require_relative 'gen/queue_delete'
37
+ require_relative 'gen/queue_delete_ok'
38
+ require_relative 'gen/queue_unbind'
39
+ require_relative 'gen/queue_unbind_ok'
40
+ require_relative 'gen/basic_qos'
41
+ require_relative 'gen/basic_qos_ok'
42
+ require_relative 'gen/basic_consume'
43
+ require_relative 'gen/basic_consume_ok'
44
+ require_relative 'gen/basic_cancel'
45
+ require_relative 'gen/basic_cancel_ok'
46
+ require_relative 'gen/basic_publish'
47
+ require_relative 'gen/basic_return'
48
+ require_relative 'gen/basic_deliver'
49
+ require_relative 'gen/basic_get'
50
+ require_relative 'gen/basic_get_ok'
51
+ require_relative 'gen/basic_get_empty'
52
+ require_relative 'gen/basic_ack'
53
+ require_relative 'gen/basic_reject'
54
+ require_relative 'gen/basic_recover_async'
55
+ require_relative 'gen/basic_recover'
56
+ require_relative 'gen/basic_recover_ok'
57
+ require_relative 'gen/basic_nack'
58
+ require_relative 'gen/tx_select'
59
+ require_relative 'gen/tx_select_ok'
60
+ require_relative 'gen/tx_commit'
61
+ require_relative 'gen/tx_commit_ok'
62
+ require_relative 'gen/tx_rollback'
63
+ require_relative 'gen/tx_rollback_ok'
64
+ require_relative 'gen/confirm_select'
65
+ require_relative 'gen/confirm_select_ok'
@@ -0,0 +1,49 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class AccessRequest < ::FFI::Struct
5
+ layout(
6
+ :realm, Bytes,
7
+ :exclusive, Boolean,
8
+ :passive, Boolean,
9
+ :active, Boolean,
10
+ :write, Boolean,
11
+ :read, Boolean
12
+ )
13
+
14
+ def self.id
15
+ :access_request
16
+ end
17
+
18
+ def id
19
+ :access_request
20
+ end
21
+
22
+ def apply(realm: nil, exclusive: nil, passive: nil, active: nil, write: nil, read: nil)
23
+ self[:realm] = Bytes.from_s(realm.to_s) if realm
24
+ self[:exclusive] = exclusive unless exclusive.nil?
25
+ self[:passive] = passive unless passive.nil?
26
+ self[:active] = active unless active.nil?
27
+ self[:write] = write unless write.nil?
28
+ self[:read] = read unless read.nil?
29
+ self
30
+ end
31
+
32
+ def to_h(free=false)
33
+ {
34
+ realm: self[:realm].to_s(free),
35
+ exclusive: self[:exclusive],
36
+ passive: self[:passive],
37
+ active: self[:active],
38
+ write: self[:write],
39
+ read: self[:read]
40
+ }
41
+ end
42
+
43
+ def free!
44
+ self[:realm].free!
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class AccessRequestOk < ::FFI::Struct
5
+ layout(:ticket, :uint16)
6
+
7
+ def self.id
8
+ :access_request_ok
9
+ end
10
+
11
+ def id
12
+ :access_request_ok
13
+ end
14
+
15
+ def apply(ticket: nil)
16
+ self[:ticket] = Integer(ticket) if ticket
17
+ self
18
+ end
19
+
20
+ def to_h(free=false)
21
+ {ticket: self[:ticket]}
22
+ end
23
+
24
+ def free!
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class BasicAck < ::FFI::Struct
5
+ layout(
6
+ :delivery_tag, :uint64,
7
+ :multiple, Boolean
8
+ )
9
+
10
+ def self.id
11
+ :basic_ack
12
+ end
13
+
14
+ def id
15
+ :basic_ack
16
+ end
17
+
18
+ def apply(delivery_tag: nil, multiple: nil)
19
+ self[:delivery_tag] = Integer(delivery_tag) if delivery_tag
20
+ self[:multiple] = multiple unless multiple.nil?
21
+ self
22
+ end
23
+
24
+ def to_h(free=false)
25
+ {
26
+ delivery_tag: self[:delivery_tag],
27
+ multiple: self[:multiple]
28
+ }
29
+ end
30
+
31
+ def free!
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class BasicCancel < ::FFI::Struct
5
+ layout(
6
+ :consumer_tag, Bytes,
7
+ :nowait, Boolean
8
+ )
9
+
10
+ def self.id
11
+ :basic_cancel
12
+ end
13
+
14
+ def id
15
+ :basic_cancel
16
+ end
17
+
18
+ def apply(consumer_tag: nil, nowait: nil)
19
+ self[:consumer_tag] = Bytes.from_s(consumer_tag.to_s) if consumer_tag
20
+ self[:nowait] = nowait unless nowait.nil?
21
+ self
22
+ end
23
+
24
+ def to_h(free=false)
25
+ {
26
+ consumer_tag: self[:consumer_tag].to_s(free),
27
+ nowait: self[:nowait]
28
+ }
29
+ end
30
+
31
+ def free!
32
+ self[:consumer_tag].free!
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class BasicCancelOk < ::FFI::Struct
5
+ layout(:consumer_tag, Bytes)
6
+
7
+ def self.id
8
+ :basic_cancel_ok
9
+ end
10
+
11
+ def id
12
+ :basic_cancel_ok
13
+ end
14
+
15
+ def apply(consumer_tag: nil)
16
+ self[:consumer_tag] = Bytes.from_s(consumer_tag.to_s) if consumer_tag
17
+ self
18
+ end
19
+
20
+ def to_h(free=false)
21
+ {consumer_tag: self[:consumer_tag].to_s(free)}
22
+ end
23
+
24
+ def free!
25
+ self[:consumer_tag].free!
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,57 @@
1
+
2
+ module RabbitMQ
3
+ module FFI
4
+ class BasicConsume < ::FFI::Struct
5
+ layout(
6
+ :ticket, :uint16,
7
+ :queue, Bytes,
8
+ :consumer_tag, Bytes,
9
+ :no_local, Boolean,
10
+ :no_ack, Boolean,
11
+ :exclusive, Boolean,
12
+ :nowait, Boolean,
13
+ :arguments, Table
14
+ )
15
+
16
+ def self.id
17
+ :basic_consume
18
+ end
19
+
20
+ def id
21
+ :basic_consume
22
+ end
23
+
24
+ def apply(ticket: nil, queue: nil, consumer_tag: nil, no_local: nil, no_ack: nil, exclusive: nil, nowait: nil, arguments: nil)
25
+ self[:ticket] = Integer(ticket) if ticket
26
+ self[:queue] = Bytes.from_s(queue.to_s) if queue
27
+ self[:consumer_tag] = Bytes.from_s(consumer_tag.to_s) if consumer_tag
28
+ self[:no_local] = no_local unless no_local.nil?
29
+ self[:no_ack] = no_ack unless no_ack.nil?
30
+ self[:exclusive] = exclusive unless exclusive.nil?
31
+ self[:nowait] = nowait unless nowait.nil?
32
+ self[:arguments] = Table.from(arguments) if arguments
33
+ self
34
+ end
35
+
36
+ def to_h(free=false)
37
+ {
38
+ ticket: self[:ticket],
39
+ queue: self[:queue].to_s(free),
40
+ consumer_tag: self[:consumer_tag].to_s(free),
41
+ no_local: self[:no_local],
42
+ no_ack: self[:no_ack],
43
+ exclusive: self[:exclusive],
44
+ nowait: self[:nowait],
45
+ arguments: self[:arguments].to_h(free)
46
+ }
47
+ end
48
+
49
+ def free!
50
+ self[:queue].free!
51
+ self[:consumer_tag].free!
52
+ self[:arguments].free!
53
+ end
54
+
55
+ end
56
+ end
57
+ end