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.
- data/CHANGELOG +2 -0
- data/COPYING +14 -0
- data/LICENSE +14 -0
- data/Makefile.am +15 -0
- data/Manifest +78 -0
- data/README +30 -0
- data/Rakefile +102 -0
- data/benchmark/Benchmark.thrift +5 -0
- data/benchmark/benchmark.rb +254 -0
- data/benchmark/client.rb +56 -0
- data/benchmark/gen-rb/BenchmarkService.rb +81 -0
- data/benchmark/gen-rb/Benchmark_constants.rb +11 -0
- data/benchmark/gen-rb/Benchmark_types.rb +10 -0
- data/benchmark/server.rb +64 -0
- data/benchmark/thin_server.rb +26 -0
- data/ext/binary_protocol_accelerated.c +463 -0
- data/ext/binary_protocol_accelerated.h +1 -0
- data/ext/constants.h +77 -0
- data/ext/extconf.rb +7 -0
- data/ext/memory_buffer.c +52 -0
- data/ext/memory_buffer.h +1 -0
- data/ext/protocol.c +166 -0
- data/ext/protocol.h +1 -0
- data/ext/struct.c +574 -0
- data/ext/struct.h +48 -0
- data/ext/thrift_native.c +173 -0
- data/lib/thrift/client.rb +44 -0
- data/lib/thrift/deprecation.rb +155 -0
- data/lib/thrift/exceptions.rb +65 -0
- data/lib/thrift/processor.rb +39 -0
- data/lib/thrift/protocol/binaryprotocol.rb +213 -0
- data/lib/thrift/protocol/binaryprotocolaccelerated.rb +19 -0
- data/lib/thrift/protocol/tbinaryprotocol.rb +2 -0
- data/lib/thrift/protocol/tprotocol.rb +2 -0
- data/lib/thrift/protocol.rb +270 -0
- data/lib/thrift/serializer.rb +27 -0
- data/lib/thrift/server/httpserver.rb +44 -0
- data/lib/thrift/server/nonblockingserver.rb +278 -0
- data/lib/thrift/server/thttpserver.rb +2 -0
- data/lib/thrift/server/tserver.rb +2 -0
- data/lib/thrift/server.rb +135 -0
- data/lib/thrift/struct.rb +272 -0
- data/lib/thrift/thrift.rb +14 -0
- data/lib/thrift/transport/httpclient.rb +29 -0
- data/lib/thrift/transport/socket.rb +167 -0
- data/lib/thrift/transport/thttpclient.rb +2 -0
- data/lib/thrift/transport/tsocket.rb +2 -0
- data/lib/thrift/transport/ttransport.rb +2 -0
- data/lib/thrift/transport/unixsocket.rb +58 -0
- data/lib/thrift/transport.rb +319 -0
- data/lib/thrift/types.rb +83 -0
- data/lib/thrift.rb +28 -0
- data/setup.rb +1585 -0
- data/spec/ThriftSpec.thrift +46 -0
- data/spec/backwards_compatibility_spec.rb +136 -0
- data/spec/binaryprotocol_spec.rb +45 -0
- data/spec/binaryprotocol_spec_shared.rb +274 -0
- data/spec/binaryprotocolaccelerated_spec.rb +101 -0
- data/spec/client_spec.rb +81 -0
- data/spec/deprecation_spec.rb +443 -0
- data/spec/exception_spec.rb +123 -0
- data/spec/gen-rb/NonblockingService.rb +268 -0
- data/spec/gen-rb/ThriftSpec_constants.rb +11 -0
- data/spec/gen-rb/ThriftSpec_types.rb +134 -0
- data/spec/httpclient_spec.rb +31 -0
- data/spec/httpserver_spec.rb +98 -0
- data/spec/nonblockingserver_spec.rb +245 -0
- data/spec/processor_spec.rb +64 -0
- data/spec/protocol_spec.rb +142 -0
- data/spec/serializer_spec.rb +52 -0
- data/spec/server_spec.rb +141 -0
- data/spec/socket_spec.rb +97 -0
- data/spec/socket_spec_shared.rb +85 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/struct_spec.rb +244 -0
- data/spec/transport_spec.rb +359 -0
- data/spec/types_spec.rb +98 -0
- data/spec/unixsocket_spec.rb +90 -0
- data/thrift.gemspec +33 -0
- data.tar.gz.sig +0 -0
- metadata +200 -0
- metadata.gz.sig +0 -0
data/ext/thrift_native.c
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include <struct.h>
|
3
|
+
#include <binary_protocol_accelerated.h>
|
4
|
+
#include <protocol.h>
|
5
|
+
#include <memory_buffer.h>
|
6
|
+
|
7
|
+
// cached classes/modules
|
8
|
+
VALUE rb_cSet;
|
9
|
+
VALUE thrift_module;
|
10
|
+
VALUE thrift_types_module;
|
11
|
+
|
12
|
+
// TType constants
|
13
|
+
int TTYPE_STOP;
|
14
|
+
int TTYPE_BOOL;
|
15
|
+
int TTYPE_BYTE;
|
16
|
+
int TTYPE_I16;
|
17
|
+
int TTYPE_I32;
|
18
|
+
int TTYPE_I64;
|
19
|
+
int TTYPE_DOUBLE;
|
20
|
+
int TTYPE_STRING;
|
21
|
+
int TTYPE_MAP;
|
22
|
+
int TTYPE_SET;
|
23
|
+
int TTYPE_LIST;
|
24
|
+
int TTYPE_STRUCT;
|
25
|
+
|
26
|
+
// method ids
|
27
|
+
ID validate_method_id;
|
28
|
+
ID write_struct_begin_method_id;
|
29
|
+
ID write_struct_end_method_id;
|
30
|
+
ID write_field_begin_method_id;
|
31
|
+
ID write_field_end_method_id;
|
32
|
+
ID write_boolean_method_id;
|
33
|
+
ID write_byte_method_id;
|
34
|
+
ID write_i16_method_id;
|
35
|
+
ID write_i32_method_id;
|
36
|
+
ID write_i64_method_id;
|
37
|
+
ID write_double_method_id;
|
38
|
+
ID write_string_method_id;
|
39
|
+
ID write_map_begin_method_id;
|
40
|
+
ID write_map_end_method_id;
|
41
|
+
ID write_list_begin_method_id;
|
42
|
+
ID write_list_end_method_id;
|
43
|
+
ID write_set_begin_method_id;
|
44
|
+
ID write_set_end_method_id;
|
45
|
+
ID size_method_id;
|
46
|
+
ID read_bool_method_id;
|
47
|
+
ID read_byte_method_id;
|
48
|
+
ID read_i16_method_id;
|
49
|
+
ID read_i32_method_id;
|
50
|
+
ID read_i64_method_id;
|
51
|
+
ID read_string_method_id;
|
52
|
+
ID read_double_method_id;
|
53
|
+
ID read_map_begin_method_id;
|
54
|
+
ID read_map_end_method_id;
|
55
|
+
ID read_list_begin_method_id;
|
56
|
+
ID read_list_end_method_id;
|
57
|
+
ID read_set_begin_method_id;
|
58
|
+
ID read_set_end_method_id;
|
59
|
+
ID read_struct_begin_method_id;
|
60
|
+
ID read_struct_end_method_id;
|
61
|
+
ID read_field_begin_method_id;
|
62
|
+
ID read_field_end_method_id;
|
63
|
+
ID keys_method_id;
|
64
|
+
ID entries_method_id;
|
65
|
+
ID name_method_id;
|
66
|
+
ID sort_method_id;
|
67
|
+
ID write_field_stop_method_id;
|
68
|
+
ID skip_method_id;
|
69
|
+
ID write_method_id;
|
70
|
+
ID read_method_id;
|
71
|
+
ID native_qmark_method_id;
|
72
|
+
|
73
|
+
// constant ids
|
74
|
+
ID fields_const_id;
|
75
|
+
ID transport_ivar_id;
|
76
|
+
ID strict_read_ivar_id;
|
77
|
+
ID strict_write_ivar_id;
|
78
|
+
|
79
|
+
// cached symbols
|
80
|
+
VALUE type_sym;
|
81
|
+
VALUE name_sym;
|
82
|
+
VALUE key_sym;
|
83
|
+
VALUE value_sym;
|
84
|
+
VALUE element_sym;
|
85
|
+
VALUE class_sym;
|
86
|
+
VALUE protocol_exception_class;
|
87
|
+
|
88
|
+
void Init_thrift_native() {
|
89
|
+
// cached classes
|
90
|
+
thrift_module = rb_const_get(rb_cObject, rb_intern("Thrift"));
|
91
|
+
thrift_types_module = rb_const_get(thrift_module, rb_intern("Types"));
|
92
|
+
rb_cSet = rb_const_get(rb_cObject, rb_intern("Set"));
|
93
|
+
protocol_exception_class = rb_const_get(thrift_module, rb_intern("ProtocolException"));
|
94
|
+
|
95
|
+
// Init ttype constants
|
96
|
+
TTYPE_BOOL = FIX2INT(rb_const_get(thrift_types_module, rb_intern("BOOL")));
|
97
|
+
TTYPE_BYTE = FIX2INT(rb_const_get(thrift_types_module, rb_intern("BYTE")));
|
98
|
+
TTYPE_I16 = FIX2INT(rb_const_get(thrift_types_module, rb_intern("I16")));
|
99
|
+
TTYPE_I32 = FIX2INT(rb_const_get(thrift_types_module, rb_intern("I32")));
|
100
|
+
TTYPE_I64 = FIX2INT(rb_const_get(thrift_types_module, rb_intern("I64")));
|
101
|
+
TTYPE_DOUBLE = FIX2INT(rb_const_get(thrift_types_module, rb_intern("DOUBLE")));
|
102
|
+
TTYPE_STRING = FIX2INT(rb_const_get(thrift_types_module, rb_intern("STRING")));
|
103
|
+
TTYPE_MAP = FIX2INT(rb_const_get(thrift_types_module, rb_intern("MAP")));
|
104
|
+
TTYPE_SET = FIX2INT(rb_const_get(thrift_types_module, rb_intern("SET")));
|
105
|
+
TTYPE_LIST = FIX2INT(rb_const_get(thrift_types_module, rb_intern("LIST")));
|
106
|
+
TTYPE_STRUCT = FIX2INT(rb_const_get(thrift_types_module, rb_intern("STRUCT")));
|
107
|
+
|
108
|
+
// method ids
|
109
|
+
validate_method_id = rb_intern("validate");
|
110
|
+
write_struct_begin_method_id = rb_intern("write_struct_begin");
|
111
|
+
write_struct_end_method_id = rb_intern("write_struct_end");
|
112
|
+
write_field_begin_method_id = rb_intern("write_field_begin");
|
113
|
+
write_field_end_method_id = rb_intern("write_field_end");
|
114
|
+
write_boolean_method_id = rb_intern("write_bool");
|
115
|
+
write_byte_method_id = rb_intern("write_byte");
|
116
|
+
write_i16_method_id = rb_intern("write_i16");
|
117
|
+
write_i32_method_id = rb_intern("write_i32");
|
118
|
+
write_i64_method_id = rb_intern("write_i64");
|
119
|
+
write_double_method_id = rb_intern("write_double");
|
120
|
+
write_string_method_id = rb_intern("write_string");
|
121
|
+
write_map_begin_method_id = rb_intern("write_map_begin");
|
122
|
+
write_map_end_method_id = rb_intern("write_map_end");
|
123
|
+
write_list_begin_method_id = rb_intern("write_list_begin");
|
124
|
+
write_list_end_method_id = rb_intern("write_list_end");
|
125
|
+
write_set_begin_method_id = rb_intern("write_set_begin");
|
126
|
+
write_set_end_method_id = rb_intern("write_set_end");
|
127
|
+
size_method_id = rb_intern("size");
|
128
|
+
read_bool_method_id = rb_intern("read_bool");
|
129
|
+
read_byte_method_id = rb_intern("read_byte");
|
130
|
+
read_i16_method_id = rb_intern("read_i16");
|
131
|
+
read_i32_method_id = rb_intern("read_i32");
|
132
|
+
read_i64_method_id = rb_intern("read_i64");
|
133
|
+
read_string_method_id = rb_intern("read_string");
|
134
|
+
read_double_method_id = rb_intern("read_double");
|
135
|
+
read_map_begin_method_id = rb_intern("read_map_begin");
|
136
|
+
read_map_end_method_id = rb_intern("read_map_end");
|
137
|
+
read_list_begin_method_id = rb_intern("read_list_begin");
|
138
|
+
read_list_end_method_id = rb_intern("read_list_end");
|
139
|
+
read_set_begin_method_id = rb_intern("read_set_begin");
|
140
|
+
read_set_end_method_id = rb_intern("read_set_end");
|
141
|
+
read_struct_begin_method_id = rb_intern("read_struct_begin");
|
142
|
+
read_struct_end_method_id = rb_intern("read_struct_end");
|
143
|
+
read_field_begin_method_id = rb_intern("read_field_begin");
|
144
|
+
read_field_end_method_id = rb_intern("read_field_end");
|
145
|
+
keys_method_id = rb_intern("keys");
|
146
|
+
entries_method_id = rb_intern("entries");
|
147
|
+
name_method_id = rb_intern("name");
|
148
|
+
sort_method_id = rb_intern("sort");
|
149
|
+
write_field_stop_method_id = rb_intern("write_field_stop");
|
150
|
+
skip_method_id = rb_intern("skip");
|
151
|
+
write_method_id = rb_intern("write");
|
152
|
+
read_method_id = rb_intern("read");
|
153
|
+
native_qmark_method_id = rb_intern("native?");
|
154
|
+
|
155
|
+
// constant ids
|
156
|
+
fields_const_id = rb_intern("FIELDS");
|
157
|
+
transport_ivar_id = rb_intern("@trans");
|
158
|
+
strict_read_ivar_id = rb_intern("@strict_read");
|
159
|
+
strict_write_ivar_id = rb_intern("@strict_write");
|
160
|
+
|
161
|
+
// cached symbols
|
162
|
+
type_sym = ID2SYM(rb_intern("type"));
|
163
|
+
name_sym = ID2SYM(rb_intern("name"));
|
164
|
+
key_sym = ID2SYM(rb_intern("key"));
|
165
|
+
value_sym = ID2SYM(rb_intern("value"));
|
166
|
+
element_sym = ID2SYM(rb_intern("element"));
|
167
|
+
class_sym = ID2SYM(rb_intern("class"));
|
168
|
+
|
169
|
+
Init_protocol();
|
170
|
+
Init_struct();
|
171
|
+
Init_binary_protocol_accelerated();
|
172
|
+
Init_memory_buffer();
|
173
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Thrift
|
2
|
+
module Client
|
3
|
+
def initialize(iprot, oprot=nil)
|
4
|
+
@iprot = iprot
|
5
|
+
@oprot = oprot || iprot
|
6
|
+
@seqid = 0
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_message(name, args_class, args = {})
|
10
|
+
@oprot.write_message_begin(name, MessageTypes::CALL, @seqid)
|
11
|
+
data = args_class.new
|
12
|
+
args.each do |k, v|
|
13
|
+
data.send("#{k.to_s}=", v)
|
14
|
+
end
|
15
|
+
begin
|
16
|
+
data.write(@oprot)
|
17
|
+
rescue StandardError => e
|
18
|
+
@oprot.trans.close
|
19
|
+
raise e
|
20
|
+
end
|
21
|
+
@oprot.write_message_end
|
22
|
+
@oprot.trans.flush
|
23
|
+
end
|
24
|
+
|
25
|
+
def receive_message(result_klass)
|
26
|
+
fname, mtype, rseqid = @iprot.read_message_begin
|
27
|
+
handle_exception(mtype)
|
28
|
+
result = result_klass.new
|
29
|
+
result.read(@iprot)
|
30
|
+
@iprot.read_message_end
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_exception(mtype)
|
35
|
+
if mtype == MessageTypes::EXCEPTION
|
36
|
+
x = ApplicationException.new
|
37
|
+
x.read(@iprot)
|
38
|
+
@iprot.read_message_end
|
39
|
+
raise x
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
deprecate_module! :ThriftClient => Client
|
44
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# provide a backwards-compatible wrapper API and deprecate it
|
2
|
+
|
3
|
+
module Thrift
|
4
|
+
DEPRECATION = true unless const_defined?(:DEPRECATION)
|
5
|
+
end
|
6
|
+
|
7
|
+
class Module
|
8
|
+
# Wraps the given methods to print a warning and call the real method
|
9
|
+
# Example:
|
10
|
+
# deprecate! :readAll => :read_all
|
11
|
+
#--
|
12
|
+
# Yeah, this is ugly, passing a string to module_eval, but unfortunately
|
13
|
+
# using a block removes the ability to pass blocks to the defined method
|
14
|
+
# and breaks spec
|
15
|
+
def deprecate!(methods)
|
16
|
+
return unless Thrift::DEPRECATION
|
17
|
+
methods.each_pair do |old, new|
|
18
|
+
module_eval <<-EOF
|
19
|
+
def #{old}(*args, &block)
|
20
|
+
old, new = #{[old,new].inspect}
|
21
|
+
STDERR.puts "Warning: calling deprecated method \#{self.is_a?(Module) ? "\#{self}." : "\#{self.class}#"}\#{old}"
|
22
|
+
STDERR.puts " from \#{caller.first}"
|
23
|
+
target = (self.is_a?(Module) ? (class << self;self;end) : self.class)
|
24
|
+
target.send :define_method, old, target.instance_method(new) # unwrap
|
25
|
+
target.instance_method(new).bind(self).call(*args, &block)
|
26
|
+
end
|
27
|
+
EOF
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module Thrift::DeprecationProxy # :nodoc:
|
33
|
+
# there's a really weird bug in Ruby where class variables behave wrong
|
34
|
+
# when used in a Class.new or #class_eval rather than in a class foo block.
|
35
|
+
CLASS_MAPPING = {}
|
36
|
+
MODULE_MAPPING = {}
|
37
|
+
def self.new_class(obj, name)
|
38
|
+
klass_id = CLASS_MAPPING.size
|
39
|
+
CLASS_MAPPING[klass_id] = [obj, name, true]
|
40
|
+
klass = Class.new(obj) do
|
41
|
+
klass = self
|
42
|
+
instance_methods.sort.reject { |x| [:__id__,:__send__].include? x.to_sym }.each do |sym|
|
43
|
+
undef_method sym
|
44
|
+
end
|
45
|
+
define_method :__thrift_deprecation_proxy_klass_id do
|
46
|
+
klass_id
|
47
|
+
end
|
48
|
+
def method_missing(sym, *args, &block)
|
49
|
+
klass_id = __thrift_deprecation_proxy_klass_id
|
50
|
+
obj, name, warned = CLASS_MAPPING[klass_id]
|
51
|
+
obj.instance_method(sym).bind(self).call(*args, &block)
|
52
|
+
end
|
53
|
+
(class << self;self;end).class_eval do
|
54
|
+
instance_methods.sort.reject { |x| [:__id__,:__send__].include? x.to_sym }.each do |sym|
|
55
|
+
undef_method sym
|
56
|
+
end
|
57
|
+
define_method :__thrift_deprecation_proxy_klass do
|
58
|
+
[klass, klass_id]
|
59
|
+
end
|
60
|
+
def method_missing(sym, *args, &block)
|
61
|
+
klass, klass_id = __thrift_deprecation_proxy_klass
|
62
|
+
obj, name, warned = CLASS_MAPPING[klass_id]
|
63
|
+
unless warned
|
64
|
+
STDERR.puts "Warning: class #{name} is deprecated"
|
65
|
+
STDERR.puts " from #{Thrift::DeprecationProxy.process_caller(caller)}"
|
66
|
+
CLASS_MAPPING[klass_id][2] = true
|
67
|
+
end
|
68
|
+
if klass.__id__ == self.__id__
|
69
|
+
obj.send sym, *args, &block
|
70
|
+
else
|
71
|
+
obj.method(sym).unbind.bind(self).call(*args, &block)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
CLASS_MAPPING[klass_id][2] = false
|
77
|
+
klass
|
78
|
+
end
|
79
|
+
def self.new_module(obj, name)
|
80
|
+
mod_id = MODULE_MAPPING.size
|
81
|
+
MODULE_MAPPING[mod_id] = [obj, name, true]
|
82
|
+
mod = Module.new do
|
83
|
+
include obj
|
84
|
+
instance_methods.sort.reject { |x| [:__id__,:__send__].include? x.to_sym }.each do |sym|
|
85
|
+
undef_method sym
|
86
|
+
end
|
87
|
+
define_method :__thrift_deprecation_proxy_module_id do
|
88
|
+
mod_id
|
89
|
+
end
|
90
|
+
def method_missing(sym, *args, &block)
|
91
|
+
mod_id = __thrift_deprecation_proxy_module_id
|
92
|
+
obj, name, warned = MODULE_MAPPING[mod_id]
|
93
|
+
unless warned
|
94
|
+
STDERR.puts "Warning: module #{name} is deprecated"
|
95
|
+
STDERR.puts " from #{Thrift::DeprecationProxy.process_caller(caller)}"
|
96
|
+
MODULE_MAPPING[mod_id][2] = true
|
97
|
+
end
|
98
|
+
obj.instance_method(sym).bind(self).call(*args, &block)
|
99
|
+
end
|
100
|
+
(class << self;self;end).class_eval do
|
101
|
+
instance_methods.sort.reject { |x| [:__id__,:__send__].include? x.to_sym }.each do |sym|
|
102
|
+
undef_method sym
|
103
|
+
end
|
104
|
+
define_method :__thrift_deprecation_proxy_module_id do
|
105
|
+
mod_id
|
106
|
+
end
|
107
|
+
def method_missing(sym, *args, &block)
|
108
|
+
mod_id = __thrift_deprecation_proxy_module_id
|
109
|
+
obj, name, warned = MODULE_MAPPING[mod_id]
|
110
|
+
unless warned
|
111
|
+
STDERR.puts "Warning: module #{name} is deprecated"
|
112
|
+
STDERR.puts " from #{Thrift::DeprecationProxy.process_caller(caller)}"
|
113
|
+
MODULE_MAPPING[mod_id][2] = true
|
114
|
+
end
|
115
|
+
obj.send sym, *args, &block
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
MODULE_MAPPING[mod_id][2] = false
|
120
|
+
mod
|
121
|
+
end
|
122
|
+
def self.process_caller(stack)
|
123
|
+
dir = File.dirname(__FILE__)
|
124
|
+
stack.find { |frame| frame[0,dir.size] != dir }
|
125
|
+
end
|
126
|
+
def self.reset_deprecation_warnings
|
127
|
+
CLASS_MAPPING.each { |k,v| v[2] = false }
|
128
|
+
MODULE_MAPPING.each { |k,v| v[2] = false }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
module Kernel
|
133
|
+
# Provides an alternate name for the class for deprecation purposes
|
134
|
+
# Example:
|
135
|
+
# deprecate_class! :TBinaryProtocol => Thrift::BinaryProtocol
|
136
|
+
#--
|
137
|
+
# at the moment this only works for creating top-level constants
|
138
|
+
# if necessary, this can be extended to take something like :'Thrift::TBinaryProtocol'
|
139
|
+
# alternately, Module can be extended with a similar method
|
140
|
+
def deprecate_class!(klasses)
|
141
|
+
return unless Thrift::DEPRECATION
|
142
|
+
klasses.each_pair do |old, new|
|
143
|
+
raise "deprecate_class! expected Class, called with #{new}" unless new.is_a? Class
|
144
|
+
Object.const_set old, Thrift::DeprecationProxy.new_class(new, old)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# like deprecate_class! but for Modules
|
149
|
+
def deprecate_module!(modules)
|
150
|
+
return unless Thrift::DEPRECATION
|
151
|
+
modules.each_pair do |old, new|
|
152
|
+
Object.const_set old, Thrift::DeprecationProxy.new_module(new, old)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Thrift
|
2
|
+
class Exception < StandardError
|
3
|
+
def initialize(message)
|
4
|
+
super
|
5
|
+
@message = message
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :message
|
9
|
+
end
|
10
|
+
deprecate_class! :TException => Exception
|
11
|
+
|
12
|
+
class ApplicationException < Exception
|
13
|
+
|
14
|
+
UNKNOWN = 0
|
15
|
+
UNKNOWN_METHOD = 1
|
16
|
+
INVALID_MESSAGE_TYPE = 2
|
17
|
+
WRONG_METHOD_NAME = 3
|
18
|
+
BAD_SEQUENCE_ID = 4
|
19
|
+
MISSING_RESULT = 5
|
20
|
+
|
21
|
+
attr_reader :type
|
22
|
+
|
23
|
+
def initialize(type=UNKNOWN, message=nil)
|
24
|
+
super(message)
|
25
|
+
@type = type
|
26
|
+
end
|
27
|
+
|
28
|
+
def read(iprot)
|
29
|
+
iprot.read_struct_begin
|
30
|
+
while true
|
31
|
+
fname, ftype, fid = iprot.read_field_begin
|
32
|
+
if ftype == Types::STOP
|
33
|
+
break
|
34
|
+
end
|
35
|
+
if fid == 1 and ftype == Types::STRING
|
36
|
+
@message = iprot.read_string
|
37
|
+
elsif fid == 2 and ftype == Types::I32
|
38
|
+
@type = iprot.read_i32
|
39
|
+
else
|
40
|
+
iprot.skip(ftype)
|
41
|
+
end
|
42
|
+
iprot.read_field_end
|
43
|
+
end
|
44
|
+
iprot.read_struct_end
|
45
|
+
end
|
46
|
+
|
47
|
+
def write(oprot)
|
48
|
+
oprot.write_struct_begin('Thrift::ApplicationException')
|
49
|
+
unless @message.nil?
|
50
|
+
oprot.write_field_begin('message', Types::STRING, 1)
|
51
|
+
oprot.write_string(@message)
|
52
|
+
oprot.write_field_end
|
53
|
+
end
|
54
|
+
unless @type.nil?
|
55
|
+
oprot.write_field_begin('type', Types::I32, 2)
|
56
|
+
oprot.write_i32(@type)
|
57
|
+
oprot.write_field_end
|
58
|
+
end
|
59
|
+
oprot.write_field_stop
|
60
|
+
oprot.write_struct_end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
deprecate_class! :TApplicationException => ApplicationException
|
65
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Thrift
|
2
|
+
module Processor
|
3
|
+
def initialize(handler)
|
4
|
+
@handler = handler
|
5
|
+
end
|
6
|
+
|
7
|
+
def process(iprot, oprot)
|
8
|
+
name, type, seqid = iprot.read_message_begin
|
9
|
+
if respond_to?("process_#{name}")
|
10
|
+
send("process_#{name}", seqid, iprot, oprot)
|
11
|
+
true
|
12
|
+
else
|
13
|
+
iprot.skip(Types::STRUCT)
|
14
|
+
iprot.read_message_end
|
15
|
+
x = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
|
16
|
+
oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
|
17
|
+
x.write(oprot)
|
18
|
+
oprot.write_message_end
|
19
|
+
oprot.trans.flush
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_args(iprot, args_class)
|
25
|
+
args = args_class.new
|
26
|
+
args.read(iprot)
|
27
|
+
iprot.read_message_end
|
28
|
+
args
|
29
|
+
end
|
30
|
+
|
31
|
+
def write_result(result, oprot, name, seqid)
|
32
|
+
oprot.write_message_begin(name, MessageTypes::REPLY, seqid)
|
33
|
+
result.write(oprot)
|
34
|
+
oprot.write_message_end
|
35
|
+
oprot.trans.flush
|
36
|
+
end
|
37
|
+
end
|
38
|
+
deprecate_module! :TProcessor => Processor
|
39
|
+
end
|
@@ -0,0 +1,213 @@
|
|
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
|
+
require 'thrift/protocol'
|
11
|
+
|
12
|
+
module Thrift
|
13
|
+
class BinaryProtocol < Protocol
|
14
|
+
VERSION_MASK = 0xffff0000
|
15
|
+
VERSION_1 = 0x80010000
|
16
|
+
TYPE_MASK = 0x000000ff
|
17
|
+
|
18
|
+
attr_reader :strict_read, :strict_write
|
19
|
+
|
20
|
+
def initialize(trans, strict_read=true, strict_write=true)
|
21
|
+
super(trans)
|
22
|
+
@strict_read = strict_read
|
23
|
+
@strict_write = strict_write
|
24
|
+
end
|
25
|
+
|
26
|
+
def write_message_begin(name, type, seqid)
|
27
|
+
# this is necessary because we added (needed) bounds checking to
|
28
|
+
# write_i32, and 0x80010000 is too big for that.
|
29
|
+
if strict_write
|
30
|
+
write_i16(VERSION_1 >> 16)
|
31
|
+
write_i16(type)
|
32
|
+
write_string(name)
|
33
|
+
write_i32(seqid)
|
34
|
+
else
|
35
|
+
write_string(name)
|
36
|
+
write_byte(type)
|
37
|
+
write_i32(seqid)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def write_field_begin(name, type, id)
|
42
|
+
write_byte(type)
|
43
|
+
write_i16(id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def write_field_stop
|
47
|
+
write_byte(Thrift::Types::STOP)
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_map_begin(ktype, vtype, size)
|
51
|
+
write_byte(ktype)
|
52
|
+
write_byte(vtype)
|
53
|
+
write_i32(size)
|
54
|
+
end
|
55
|
+
|
56
|
+
def write_list_begin(etype, size)
|
57
|
+
write_byte(etype)
|
58
|
+
write_i32(size)
|
59
|
+
end
|
60
|
+
|
61
|
+
def write_set_begin(etype, size)
|
62
|
+
write_byte(etype)
|
63
|
+
write_i32(size)
|
64
|
+
end
|
65
|
+
|
66
|
+
def write_bool(bool)
|
67
|
+
write_byte(bool ? 1 : 0)
|
68
|
+
end
|
69
|
+
|
70
|
+
def write_byte(byte)
|
71
|
+
trans.write([byte].pack('c'))
|
72
|
+
end
|
73
|
+
|
74
|
+
def write_i16(i16)
|
75
|
+
trans.write([i16].pack('n'))
|
76
|
+
end
|
77
|
+
|
78
|
+
def write_i32(i32)
|
79
|
+
raise RangeError if i32 < -2**31 || i32 >= 2**31
|
80
|
+
trans.write([i32].pack('N'))
|
81
|
+
end
|
82
|
+
|
83
|
+
def write_i64(i64)
|
84
|
+
hi = i64 >> 32
|
85
|
+
lo = i64 & 0xffffffff
|
86
|
+
trans.write([hi, lo].pack('N2'))
|
87
|
+
end
|
88
|
+
|
89
|
+
def write_double(dub)
|
90
|
+
trans.write([dub].pack('G'))
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_string(str)
|
94
|
+
write_i32(str.length)
|
95
|
+
trans.write(str)
|
96
|
+
end
|
97
|
+
|
98
|
+
def read_message_begin
|
99
|
+
version = read_i32
|
100
|
+
if version < 0
|
101
|
+
if (version & VERSION_MASK != VERSION_1)
|
102
|
+
raise ProtocolException.new(ProtocolException::BAD_VERSION, 'Missing version identifier')
|
103
|
+
end
|
104
|
+
type = version & TYPE_MASK
|
105
|
+
name = read_string
|
106
|
+
seqid = read_i32
|
107
|
+
[name, type, seqid]
|
108
|
+
else
|
109
|
+
if strict_read
|
110
|
+
raise ProtocolException.new(ProtocolException::BAD_VERSION, 'No version identifier, old protocol client?')
|
111
|
+
end
|
112
|
+
name = trans.read_all(version)
|
113
|
+
type = read_byte
|
114
|
+
seqid = read_i32
|
115
|
+
[name, type, seqid]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def read_field_begin
|
120
|
+
type = read_byte
|
121
|
+
if (type == Types::STOP)
|
122
|
+
[nil, type, 0]
|
123
|
+
else
|
124
|
+
id = read_i16
|
125
|
+
[nil, type, id]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def read_map_begin
|
130
|
+
ktype = read_byte
|
131
|
+
vtype = read_byte
|
132
|
+
size = read_i32
|
133
|
+
[ktype, vtype, size]
|
134
|
+
end
|
135
|
+
|
136
|
+
def read_list_begin
|
137
|
+
etype = read_byte
|
138
|
+
size = read_i32
|
139
|
+
[etype, size]
|
140
|
+
end
|
141
|
+
|
142
|
+
def read_set_begin
|
143
|
+
etype = read_byte
|
144
|
+
size = read_i32
|
145
|
+
[etype, size]
|
146
|
+
end
|
147
|
+
|
148
|
+
def read_bool
|
149
|
+
byte = read_byte
|
150
|
+
byte != 0
|
151
|
+
end
|
152
|
+
|
153
|
+
def read_byte
|
154
|
+
dat = trans.read_all(1)
|
155
|
+
val = dat[0]
|
156
|
+
if (val > 0x7f)
|
157
|
+
val = 0 - ((val - 1) ^ 0xff)
|
158
|
+
end
|
159
|
+
val
|
160
|
+
end
|
161
|
+
|
162
|
+
def read_i16
|
163
|
+
dat = trans.read_all(2)
|
164
|
+
val, = dat.unpack('n')
|
165
|
+
if (val > 0x7fff)
|
166
|
+
val = 0 - ((val - 1) ^ 0xffff)
|
167
|
+
end
|
168
|
+
val
|
169
|
+
end
|
170
|
+
|
171
|
+
def read_i32
|
172
|
+
dat = trans.read_all(4)
|
173
|
+
val, = dat.unpack('N')
|
174
|
+
if (val > 0x7fffffff)
|
175
|
+
val = 0 - ((val - 1) ^ 0xffffffff)
|
176
|
+
end
|
177
|
+
val
|
178
|
+
end
|
179
|
+
|
180
|
+
def read_i64
|
181
|
+
dat = trans.read_all(8)
|
182
|
+
hi, lo = dat.unpack('N2')
|
183
|
+
if (hi > 0x7fffffff)
|
184
|
+
hi ^= 0xffffffff
|
185
|
+
lo ^= 0xffffffff
|
186
|
+
0 - (hi << 32) - lo - 1
|
187
|
+
else
|
188
|
+
(hi << 32) + lo
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def read_double
|
193
|
+
dat = trans.read_all(8)
|
194
|
+
val = dat.unpack('G').first
|
195
|
+
val
|
196
|
+
end
|
197
|
+
|
198
|
+
def read_string
|
199
|
+
sz = read_i32
|
200
|
+
dat = trans.read_all(sz)
|
201
|
+
dat
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
deprecate_class! :TBinaryProtocol => BinaryProtocol
|
206
|
+
|
207
|
+
class BinaryProtocolFactory < ProtocolFactory
|
208
|
+
def get_protocol(trans)
|
209
|
+
return Thrift::BinaryProtocol.new(trans)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
deprecate_class! :TBinaryProtocolFactory => BinaryProtocolFactory
|
213
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'thrift/protocol/binaryprotocol'
|
2
|
+
require 'thrift_native'
|
3
|
+
|
4
|
+
=begin
|
5
|
+
The only change required for a transport to support TBinaryProtocolAccelerated is to implement 2 methods:
|
6
|
+
* borrow(size), which takes an optional argument and returns atleast _size_ bytes from the transport,
|
7
|
+
or the default buffer size if no argument is given
|
8
|
+
* consume!(size), which removes size bytes from the front of the buffer
|
9
|
+
|
10
|
+
See TMemoryBuffer and TBufferedTransport for examples.
|
11
|
+
=end
|
12
|
+
|
13
|
+
module Thrift
|
14
|
+
class BinaryProtocolAcceleratedFactory < ProtocolFactory
|
15
|
+
def get_protocol(trans)
|
16
|
+
BinaryProtocolAccelerated.new(trans)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|