rabbitmq 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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