thrift 0.0.751142

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 (82) hide show
  1. data/CHANGELOG +2 -0
  2. data/COPYING +14 -0
  3. data/LICENSE +14 -0
  4. data/Makefile.am +15 -0
  5. data/Manifest +78 -0
  6. data/README +30 -0
  7. data/Rakefile +102 -0
  8. data/benchmark/Benchmark.thrift +5 -0
  9. data/benchmark/benchmark.rb +254 -0
  10. data/benchmark/client.rb +56 -0
  11. data/benchmark/gen-rb/BenchmarkService.rb +81 -0
  12. data/benchmark/gen-rb/Benchmark_constants.rb +11 -0
  13. data/benchmark/gen-rb/Benchmark_types.rb +10 -0
  14. data/benchmark/server.rb +64 -0
  15. data/benchmark/thin_server.rb +26 -0
  16. data/ext/binary_protocol_accelerated.c +463 -0
  17. data/ext/binary_protocol_accelerated.h +1 -0
  18. data/ext/constants.h +77 -0
  19. data/ext/extconf.rb +7 -0
  20. data/ext/memory_buffer.c +52 -0
  21. data/ext/memory_buffer.h +1 -0
  22. data/ext/protocol.c +166 -0
  23. data/ext/protocol.h +1 -0
  24. data/ext/struct.c +574 -0
  25. data/ext/struct.h +48 -0
  26. data/ext/thrift_native.c +173 -0
  27. data/lib/thrift/client.rb +44 -0
  28. data/lib/thrift/deprecation.rb +155 -0
  29. data/lib/thrift/exceptions.rb +65 -0
  30. data/lib/thrift/processor.rb +39 -0
  31. data/lib/thrift/protocol/binaryprotocol.rb +213 -0
  32. data/lib/thrift/protocol/binaryprotocolaccelerated.rb +19 -0
  33. data/lib/thrift/protocol/tbinaryprotocol.rb +2 -0
  34. data/lib/thrift/protocol/tprotocol.rb +2 -0
  35. data/lib/thrift/protocol.rb +270 -0
  36. data/lib/thrift/serializer.rb +27 -0
  37. data/lib/thrift/server/httpserver.rb +44 -0
  38. data/lib/thrift/server/nonblockingserver.rb +278 -0
  39. data/lib/thrift/server/thttpserver.rb +2 -0
  40. data/lib/thrift/server/tserver.rb +2 -0
  41. data/lib/thrift/server.rb +135 -0
  42. data/lib/thrift/struct.rb +272 -0
  43. data/lib/thrift/thrift.rb +14 -0
  44. data/lib/thrift/transport/httpclient.rb +29 -0
  45. data/lib/thrift/transport/socket.rb +167 -0
  46. data/lib/thrift/transport/thttpclient.rb +2 -0
  47. data/lib/thrift/transport/tsocket.rb +2 -0
  48. data/lib/thrift/transport/ttransport.rb +2 -0
  49. data/lib/thrift/transport/unixsocket.rb +58 -0
  50. data/lib/thrift/transport.rb +319 -0
  51. data/lib/thrift/types.rb +83 -0
  52. data/lib/thrift.rb +28 -0
  53. data/setup.rb +1585 -0
  54. data/spec/ThriftSpec.thrift +46 -0
  55. data/spec/backwards_compatibility_spec.rb +136 -0
  56. data/spec/binaryprotocol_spec.rb +45 -0
  57. data/spec/binaryprotocol_spec_shared.rb +274 -0
  58. data/spec/binaryprotocolaccelerated_spec.rb +101 -0
  59. data/spec/client_spec.rb +81 -0
  60. data/spec/deprecation_spec.rb +443 -0
  61. data/spec/exception_spec.rb +123 -0
  62. data/spec/gen-rb/NonblockingService.rb +268 -0
  63. data/spec/gen-rb/ThriftSpec_constants.rb +11 -0
  64. data/spec/gen-rb/ThriftSpec_types.rb +134 -0
  65. data/spec/httpclient_spec.rb +31 -0
  66. data/spec/httpserver_spec.rb +98 -0
  67. data/spec/nonblockingserver_spec.rb +245 -0
  68. data/spec/processor_spec.rb +64 -0
  69. data/spec/protocol_spec.rb +142 -0
  70. data/spec/serializer_spec.rb +52 -0
  71. data/spec/server_spec.rb +141 -0
  72. data/spec/socket_spec.rb +97 -0
  73. data/spec/socket_spec_shared.rb +85 -0
  74. data/spec/spec_helper.rb +35 -0
  75. data/spec/struct_spec.rb +244 -0
  76. data/spec/transport_spec.rb +359 -0
  77. data/spec/types_spec.rb +98 -0
  78. data/spec/unixsocket_spec.rb +90 -0
  79. data/thrift.gemspec +33 -0
  80. data.tar.gz.sig +0 -0
  81. metadata +200 -0
  82. metadata.gz.sig +0 -0
@@ -0,0 +1,319 @@
1
+ # Copyright (c) 2006- Facebook
2
+ # Distributed under the Apache Software License
3
+ #
4
+ # See accompanying file LICENSE or visit the Thrift site at:
5
+ # http://developers.facebook.com/thrift/
6
+ #
7
+ # Author: Mark Slee <mcslee@facebook.com>
8
+ #
9
+
10
+ module Thrift
11
+ class TransportException < Exception
12
+ UNKNOWN = 0
13
+ NOT_OPEN = 1
14
+ ALREADY_OPEN = 2
15
+ TIMED_OUT = 3
16
+ END_OF_FILE = 4
17
+
18
+ attr_reader :type
19
+
20
+ def initialize(type=UNKNOWN, message=nil)
21
+ super(message)
22
+ @type = type
23
+ end
24
+ end
25
+ deprecate_class! :TTransportException => TransportException
26
+
27
+ # Transport is basically an abstract class, but isn't raising NotImplementedError
28
+ # TODO: Think about if this is the right thing - Kevin Clark - 3/27/08
29
+ class Transport
30
+ def open?; end
31
+ deprecate! :isOpen => :open?
32
+ deprecate! :is_open? => :open?
33
+
34
+ def open; end
35
+
36
+ def close; end
37
+
38
+ def read(sz); end
39
+
40
+ def read_all(size)
41
+ buf = ''
42
+
43
+ while (buf.length < size)
44
+ chunk = read(size - buf.length)
45
+ buf << chunk
46
+ end
47
+
48
+ buf
49
+ end
50
+ deprecate! :readAll => :read_all
51
+
52
+ def write(buf); end
53
+ alias_method :<<, :write
54
+
55
+ def flush; end
56
+ end
57
+ deprecate_class! :TTransport => Transport
58
+
59
+ class ServerTransport
60
+ def listen; nil; end
61
+
62
+ def accept; nil; end
63
+
64
+ def close; nil; end
65
+
66
+ def closed?; nil; end
67
+ end
68
+ deprecate_class! :TServerTransport => ServerTransport
69
+
70
+ class TransportFactory
71
+ def get_transport(trans)
72
+ return trans
73
+ end
74
+ deprecate! :getTransport => :get_transport
75
+ end
76
+ deprecate_class! :TTransportFactory => TransportFactory
77
+
78
+ class BufferedTransport < Transport
79
+ DEFAULT_BUFFER = 4096
80
+
81
+ def initialize(transport)
82
+ @transport = transport
83
+ @wbuf = ''
84
+ @rbuf = ''
85
+ end
86
+
87
+ def open?
88
+ return @transport.open?
89
+ end
90
+
91
+ def open
92
+ @transport.open
93
+ end
94
+
95
+ def close
96
+ flush
97
+ @transport.close
98
+ end
99
+
100
+ def read(sz)
101
+ ret = @rbuf.slice!(0...sz)
102
+ if ret.length == 0
103
+ @rbuf = @transport.read([sz, DEFAULT_BUFFER].max)
104
+ @rbuf.slice!(0...sz)
105
+ else
106
+ ret
107
+ end
108
+ end
109
+
110
+ def write(buf)
111
+ @wbuf << buf
112
+ end
113
+
114
+ def flush
115
+ if @wbuf != ''
116
+ @transport.write(@wbuf)
117
+ @wbuf = ''
118
+ end
119
+
120
+ @transport.flush
121
+ end
122
+
123
+ def borrow(requested_length = 0)
124
+ # $stderr.puts "#{Time.now.to_f} Have #{@rbuf.length} asking for #{requested_length.inspect}"
125
+ return @rbuf if @rbuf.length > requested_length
126
+
127
+ if @rbuf.length < DEFAULT_BUFFER
128
+ @rbuf << @transport.read([requested_length, DEFAULT_BUFFER].max)
129
+ end
130
+
131
+ if @rbuf.length < requested_length
132
+ @rbuf << @transport.read_all(requested_length - @rbuf.length)
133
+ end
134
+
135
+ @rbuf
136
+ end
137
+
138
+ def consume!(size)
139
+ @rbuf.slice!(0...size)
140
+ end
141
+ end
142
+ deprecate_class! :TBufferedTransport => BufferedTransport
143
+
144
+ class BufferedTransportFactory < TransportFactory
145
+ def get_transport(transport)
146
+ return BufferedTransport.new(transport)
147
+ end
148
+ end
149
+ deprecate_class! :TBufferedTransportFactory => BufferedTransportFactory
150
+
151
+ class FramedTransport < Transport
152
+ def initialize(transport, read=true, write=true)
153
+ @transport = transport
154
+ @rbuf = ''
155
+ @wbuf = ''
156
+ @read = read
157
+ @write = write
158
+ end
159
+
160
+ def open?
161
+ @transport.open?
162
+ end
163
+
164
+ def open
165
+ @transport.open
166
+ end
167
+
168
+ def close
169
+ @transport.close
170
+ end
171
+
172
+ def read(sz)
173
+ return @transport.read(sz) unless @read
174
+
175
+ return '' if sz <= 0
176
+
177
+ read_frame if @rbuf.empty?
178
+
179
+ @rbuf.slice!(0, sz)
180
+ end
181
+
182
+ def write(buf,sz=nil)
183
+ return @transport.write(buf) unless @write
184
+
185
+ @wbuf << (sz ? buf[0...sz] : buf)
186
+ end
187
+
188
+ #
189
+ # Writes the output buffer to the stream in the format of a 4-byte length
190
+ # followed by the actual data.
191
+ #
192
+ def flush
193
+ return @transport.flush unless @write
194
+
195
+ out = [@wbuf.length].pack('N')
196
+ out << @wbuf
197
+ @transport.write(out)
198
+ @transport.flush
199
+ @wbuf = ''
200
+ end
201
+
202
+ def borrow(requested_length = 0)
203
+ read_frame if @rbuf.empty?
204
+ # there isn't any more coming, so if it's not enough, it's an error.
205
+ raise EOFError if requested_length > @rbuf.size
206
+ @rbuf
207
+ end
208
+
209
+ def consume!(size)
210
+ @rbuf.slice!(0...size)
211
+ end
212
+
213
+ private
214
+
215
+ def read_frame
216
+ sz = @transport.read_all(4).unpack('N').first
217
+
218
+ @rbuf = @transport.read_all(sz).dup # protect against later #slice!
219
+ end
220
+ end
221
+ deprecate_class! :TFramedTransport => FramedTransport
222
+
223
+ class FramedTransportFactory < TransportFactory
224
+ def get_transport(transport)
225
+ return FramedTransport.new(transport)
226
+ end
227
+ end
228
+ deprecate_class! :TFramedTransportFactory => FramedTransportFactory
229
+
230
+ class MemoryBuffer < Transport
231
+ GARBAGE_BUFFER_SIZE = 4*(2**10) # 4kB
232
+
233
+ # If you pass a string to this, you should #dup that string
234
+ # unless you want it to be modified by #read and #write
235
+ #--
236
+ # this behavior is no longer required. If you wish to change it
237
+ # go ahead, just make sure the specs pass
238
+ def initialize(buffer = nil)
239
+ @buf = buffer || ''
240
+ @index = 0
241
+ end
242
+
243
+ def open?
244
+ return true
245
+ end
246
+
247
+ def open
248
+ end
249
+
250
+ def close
251
+ end
252
+
253
+ def peek
254
+ @index < @buf.size
255
+ end
256
+
257
+ # this method does not use the passed object directly but copies it
258
+ def reset_buffer(new_buf = '')
259
+ @buf.replace new_buf
260
+ @index = 0
261
+ end
262
+
263
+ def available
264
+ @buf.length - @index
265
+ end
266
+
267
+ def read(len)
268
+ data = @buf.slice(@index, len)
269
+ @index += len
270
+ @index = @buf.size if @index > @buf.size
271
+ if @index >= GARBAGE_BUFFER_SIZE
272
+ @buf = @buf.slice(@index..-1)
273
+ @index = 0
274
+ end
275
+ data
276
+ end
277
+
278
+ def write(wbuf)
279
+ @buf << wbuf
280
+ end
281
+
282
+ def flush
283
+ end
284
+
285
+ # For fast binary protocol access
286
+ def borrow(size = nil)
287
+ if size.nil?
288
+ @buf[@index..-1]
289
+ else
290
+ if size > available
291
+ raise EOFError # Memory buffers only get one shot.
292
+ else
293
+ @buf[@index, size]
294
+ end
295
+ end
296
+ end
297
+
298
+ alias_method :consume!, :read
299
+ end
300
+ deprecate_class! :TMemoryBuffer => MemoryBuffer
301
+
302
+ ## Very very simple implementation of wrapping two objects, one with a #read
303
+ ## method and one with a #write method, into a transport for thrift.
304
+ ##
305
+ ## Assumes both objects are open, remain open, don't require flushing, etc.
306
+ class IOStreamTransport < Transport
307
+ def initialize(input, output)
308
+ @input = input
309
+ @output = output
310
+ end
311
+
312
+ def open?; not @input.closed? or not @output.closed? end
313
+ def read(sz); @input.read(sz) end
314
+ def write(buf); @output.write(buf) end
315
+ def close; @input.close; @output.close end
316
+ def to_io; @input end # we're assuming this is used in a IO.select for reading
317
+ end
318
+ deprecate_class! :TIOStreamTransport => IOStreamTransport
319
+ end
@@ -0,0 +1,83 @@
1
+ require 'set'
2
+
3
+ module Thrift
4
+ module Types
5
+ STOP = 0
6
+ VOID = 1
7
+ BOOL = 2
8
+ BYTE = 3
9
+ DOUBLE = 4
10
+ I16 = 6
11
+ I32 = 8
12
+ I64 = 10
13
+ STRING = 11
14
+ STRUCT = 12
15
+ MAP = 13
16
+ SET = 14
17
+ LIST = 15
18
+ end
19
+ deprecate_module! :TType => Types
20
+
21
+ class << self
22
+ attr_accessor :type_checking
23
+ end
24
+
25
+ class TypeError < Exception
26
+ end
27
+
28
+ def self.check_type(value, field, name, skip_nil=true)
29
+ return if value.nil? and skip_nil
30
+ klasses = case field[:type]
31
+ when Types::VOID
32
+ NilClass
33
+ when Types::BOOL
34
+ [TrueClass, FalseClass]
35
+ when Types::BYTE, Types::I16, Types::I32, Types::I64
36
+ Integer
37
+ when Types::DOUBLE
38
+ Float
39
+ when Types::STRING
40
+ String
41
+ when Types::STRUCT
42
+ Struct
43
+ when Types::MAP
44
+ Hash
45
+ when Types::SET
46
+ Set
47
+ when Types::LIST
48
+ Array
49
+ end
50
+ valid = klasses && [*klasses].any? { |klass| klass === value }
51
+ raise TypeError, "Expected #{type_name(field[:type])}, received #{value.class} for field #{name}" unless valid
52
+ # check elements now
53
+ case field[:type]
54
+ when Types::MAP
55
+ value.each_pair do |k,v|
56
+ check_type(k, field[:key], "#{name}.key", false)
57
+ check_type(v, field[:value], "#{name}.value", false)
58
+ end
59
+ when Types::SET, Types::LIST
60
+ value.each do |el|
61
+ check_type(el, field[:element], "#{name}.element", false)
62
+ end
63
+ when Types::STRUCT
64
+ raise TypeError, "Expected #{field[:class]}, received #{value.class} for field #{name}" unless field[:class] == value.class
65
+ end
66
+ end
67
+
68
+ def self.type_name(type)
69
+ Types.constants.each do |const|
70
+ return "Types::#{const}" if Types.const_get(const) == type
71
+ end
72
+ nil
73
+ end
74
+
75
+ module MessageTypes
76
+ CALL = 1
77
+ REPLY = 2
78
+ EXCEPTION = 3
79
+ end
80
+ deprecate_module! :TMessageType => MessageTypes
81
+ end
82
+
83
+ Thrift.type_checking = false if Thrift.type_checking.nil?
data/lib/thrift.rb ADDED
@@ -0,0 +1,28 @@
1
+ #
2
+ # Copyright (c) 2006- Facebook
3
+ # Distributed under the Apache Software License
4
+ #
5
+ # See accompanying file LICENSE or visit the Thrift site at:
6
+ # http://developers.facebook.com/thrift/
7
+ #
8
+ # Author: Mark Slee <mcslee@facebook.com>
9
+ #
10
+
11
+ $:.unshift File.dirname(__FILE__)
12
+
13
+ module Thrift
14
+ # prevent the deprecation layer from being loaded if you require 'thrift'
15
+ DEPRECATION = false unless const_defined? :DEPRECATION
16
+ end
17
+
18
+ require 'thrift/deprecation'
19
+ require 'thrift/exceptions'
20
+ require 'thrift/types'
21
+ require 'thrift/processor'
22
+ require 'thrift/client'
23
+ require 'thrift/struct'
24
+ require 'thrift/protocol'
25
+ require 'thrift/protocol/binaryprotocol'
26
+ require 'thrift/transport'
27
+ require 'thrift/transport/socket'
28
+ require 'thrift/server'