Split out thrift/thrift.rb, add top level thrift.rb in prep for gemmification
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@668901 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/lib/thrift.rb b/lib/rb/lib/thrift.rb
new file mode 100644
index 0000000..99a7568
--- /dev/null
+++ b/lib/rb/lib/thrift.rb
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2006- Facebook
+# Distributed under the Thrift Software License
+#
+# See accompanying file LICENSE or visit the Thrift site at:
+# http://developers.facebook.com/thrift/
+#
+# Author: Mark Slee <mcslee@facebook.com>
+#
+
+$:.unshift File.dirname(__FILE__)
+
+require 'thrift/exceptions'
+require 'thrift/types'
+require 'thrift/tprocessor'
+require 'thrift/thrift_client'
+require 'thrift/thrift_struct'
+
+require 'thrift/protocol/tprotocol'
+
+require 'thrift/transport/tsocket'
+require 'thrift/transport/ttransport'
+
+require 'thrift/server/tserver'
+
+
+
+
diff --git a/lib/rb/lib/thrift/exceptions.rb b/lib/rb/lib/thrift/exceptions.rb
new file mode 100644
index 0000000..8af5dce
--- /dev/null
+++ b/lib/rb/lib/thrift/exceptions.rb
@@ -0,0 +1,69 @@
+class TException < StandardError
+ def initialize(message)
+ super(message)
+ @message = message
+ end
+
+ attr_reader :message
+end
+
+class TApplicationException < TException
+
+ UNKNOWN = 0
+ UNKNOWN_METHOD = 1
+ INVALID_MESSAGE_TYPE = 2
+ WRONG_METHOD_NAME = 3
+ BAD_SEQUENCE_ID = 4
+ MISSING_RESULT = 5
+
+ attr_reader :type
+
+ def initialize(type=UNKNOWN, message=nil)
+ super(message)
+ @type = type
+ end
+
+ def read(iprot)
+ iprot.readStructBegin()
+ while true
+ fname, ftype, fid = iprot.readFieldBegin()
+ if (ftype === TType::STOP)
+ break
+ end
+ if (fid == 1)
+ if (ftype === TType::STRING)
+ @message = iprot.readString();
+ else
+ iprot.skip(ftype)
+ end
+ elsif (fid == 2)
+ if (ftype === TType::I32)
+ @type = iprot.readI32();
+ else
+ iprot.skip(ftype)
+ end
+ else
+ iprot.skip(ftype)
+ end
+ iprot.readFieldEnd()
+ end
+ iprot.readStructEnd()
+ end
+
+ def write(oprot)
+ oprot.writeStructBegin('TApplicationException')
+ if (@message != nil)
+ oprot.writeFieldBegin('message', TType::STRING, 1)
+ oprot.writeString(@message)
+ oprot.writeFieldEnd()
+ end
+ if (@type != nil)
+ oprot.writeFieldBegin('type', TType::I32, 2)
+ oprot.writeI32(@type)
+ oprot.writeFieldEnd()
+ end
+ oprot.writeFieldStop()
+ oprot.writeStructEnd()
+ end
+
+end
diff --git a/lib/rb/lib/thrift/thrift.rb b/lib/rb/lib/thrift/thrift.rb
index a0a2f7e..6a168a1 100644
--- a/lib/rb/lib/thrift/thrift.rb
+++ b/lib/rb/lib/thrift/thrift.rb
@@ -1,312 +1,2 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2006- Facebook
-# Distributed under the Thrift Software License
-#
-# See accompanying file LICENSE or visit the Thrift site at:
-# http://developers.facebook.com/thrift/
-#
-# Author: Mark Slee <mcslee@facebook.com>
-#
-
-class TType
- STOP = 0
- VOID = 1
- BOOL = 2
- BYTE = 3
- DOUBLE = 4
- I16 = 6
- I32 = 8
- I64 = 10
- STRING = 11
- STRUCT = 12
- MAP = 13
- SET = 14
- LIST = 15
-end
-
-class TMessageType
- CALL = 1
- REPLY = 2
- EXCEPTION = 3
-end
-
-module TProcessor
- def initialize(handler)
- @handler = handler
- end
-
- def process(iprot, oprot)
- name, type, seqid = iprot.readMessageBegin()
- if respond_to?("process_#{name}")
- send("process_#{name}", seqid, iprot, oprot)
- return true
- else
- iprot.skip(TType::STRUCT)
- iprot.readMessageEnd()
- x = TApplicationException.new(TApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
- oprot.writeMessageBegin(name, TMessageType::EXCEPTION, seqid)
- x.write(oprot)
- oprot.writeMessageEnd()
- oprot.trans.flush()
- return
- end
- end
-
- def read_args(iprot, args_class)
- args = args_class.new
- args.read(iprot)
- iprot.readMessageEnd
- args
- end
-
- def write_result(result, oprot, name, seqid)
- oprot.writeMessageBegin(name, TMessageType::REPLY, seqid)
- result.write(oprot)
- oprot.writeMessageEnd()
- oprot.trans.flush()
- end
-end
-
-class TException < StandardError
- def initialize(message)
- super(message)
- @message = message
- end
-
- attr_reader :message
-end
-
-class TApplicationException < TException
-
- UNKNOWN = 0
- UNKNOWN_METHOD = 1
- INVALID_MESSAGE_TYPE = 2
- WRONG_METHOD_NAME = 3
- BAD_SEQUENCE_ID = 4
- MISSING_RESULT = 5
-
- attr_reader :type
-
- def initialize(type=UNKNOWN, message=nil)
- super(message)
- @type = type
- end
-
- def read(iprot)
- iprot.readStructBegin()
- while true
- fname, ftype, fid = iprot.readFieldBegin()
- if (ftype === TType::STOP)
- break
- end
- if (fid == 1)
- if (ftype === TType::STRING)
- @message = iprot.readString();
- else
- iprot.skip(ftype)
- end
- elsif (fid == 2)
- if (ftype === TType::I32)
- @type = iprot.readI32();
- else
- iprot.skip(ftype)
- end
- else
- iprot.skip(ftype)
- end
- iprot.readFieldEnd()
- end
- iprot.readStructEnd()
- end
-
- def write(oprot)
- oprot.writeStructBegin('TApplicationException')
- if (@message != nil)
- oprot.writeFieldBegin('message', TType::STRING, 1)
- oprot.writeString(@message)
- oprot.writeFieldEnd()
- end
- if (@type != nil)
- oprot.writeFieldBegin('type', TType::I32, 2)
- oprot.writeI32(@type)
- oprot.writeFieldEnd()
- end
- oprot.writeFieldStop()
- oprot.writeStructEnd()
- end
-
-end
-
-module ThriftClient
- def initialize(iprot, oprot=nil)
- @iprot = iprot
- @oprot = oprot || iprot
- @seqid = 0
- end
-
- def send_message(name, args_class, args = {})
- @oprot.writeMessageBegin(name, TMessageType::CALL, @seqid)
- data = args_class.new
- args.each do |k, v|
- data.send("#{k.to_s}=", v)
- end
- data.write(@oprot)
- @oprot.writeMessageEnd()
- @oprot.trans.flush()
- end
-
- def receive_message(result_klass)
- fname, mtype, rseqid = @iprot.readMessageBegin()
- handle_exception(mtype)
- result = result_klass.new
- result.read(@iprot)
- @iprot.readMessageEnd()
- return result
- end
-
- def handle_exception(mtype)
- if mtype == TMessageType::EXCEPTION
- x = TApplicationException.new()
- x.read(@iprot)
- @iprot.readMessageEnd()
- raise x
- end
- end
-end
-
-module ThriftStruct
- def initialize(d={})
- each_field do |fid, type, name, default|
- instance_variable_set("@#{name}", d[name.to_s] || d[name.intern] || default)
- end
- end
-
- def struct_fields
- self.class.const_get(:FIELDS)
- end
-
- def each_field
- struct_fields.each do |fid, data|
- yield fid, data[:type], data[:name], data[:default]
- end
- end
-
- def read(iprot)
- iprot.readStructBegin()
- loop do
- fname, ftype, fid = iprot.readFieldBegin()
- break if (ftype === TType::STOP)
- handle_message(iprot, fid, ftype)
- iprot.readFieldEnd()
- end
- iprot.readStructEnd()
- end
-
- def write(oprot)
- oprot.writeStructBegin(self.class.name)
- each_field do |fid, type, name|
- if ((value = instance_variable_get("@#{name}")) != nil)
- if is_container? type
- oprot.writeFieldBegin(name, type, fid)
- write_container(oprot, value, struct_fields[fid])
- oprot.writeFieldEnd
- else
- oprot.write_field(name, type, fid, value)
- end
- end
- end
- oprot.writeFieldStop()
- oprot.writeStructEnd()
- end
-
- protected
-
- def handle_message(iprot, fid, ftype)
- field = struct_fields[fid]
- if field && field[:type] == ftype
- value = read_field(iprot, field)
- instance_variable_set("@#{field[:name]}", value)
- else
- iprot.skip(ftype)
- end
- end
-
- def read_field(iprot, field = {})
- if field[:type] == TType::STRUCT
- value = field[:class].new
- value.read(iprot)
- elsif field[:type] == TType::MAP
- key_type, val_type, size = iprot.readMapBegin
- value = {}
- size.times do
- k = read_field(iprot, field_info(field[:key]))
- v = read_field(iprot, field_info(field[:value]))
- value[k] = v
- end
- iprot.readMapEnd
- elsif field[:type] == TType::LIST
- e_type, size = iprot.readListBegin
- value = Array.new(size) do |n|
- read_field(iprot, field_info(field[:element]))
- end
- iprot.readListEnd
- elsif field[:type] == TType::SET
- e_type, size = iprot.readSetBegin
- value = {}
- size.times do
- element = read_field(iprot, field_info(field[:element]))
- value[element] = true
- end
- iprot.readSetEnd
- else
- value = iprot.read_type(field[:type])
- end
- value
- end
-
- def write_data(oprot, value, field)
- if is_container? field[:type]
- write_container(oprot, value, field)
- else
- oprot.write_type(field[:type], value)
- end
- end
-
- def write_container(oprot, value, field = {})
- if field[:type] == TType::MAP
- oprot.writeMapBegin(field[:key][:type], field[:value][:type], value.size)
- value.each do |k, v|
- write_data(oprot, k, field[:key])
- write_data(oprot, v, field[:value])
- end
- oprot.writeMapEnd
- elsif field[:type] == TType::LIST
- oprot.writeListBegin(field[:element][:type], value.size)
- value.each do |elem|
- write_data(oprot, elem, field[:element])
- end
- oprot.writeListEnd
- elsif field[:type] == TType::SET
- oprot.writeSetBegin(field[:element][:type], value.size)
- value.each do |k, v|
- write_data(oprot, k, field[:element])
- end
- oprot.writeSetEnd
- else
- raise "Not a container type: #{field[:type]}"
- end
- end
-
- def is_container?(type)
- [TType::LIST, TType::MAP, TType::SET].include? type
- end
-
- def field_info(field)
- { :type => field[:type],
- :class => field[:class],
- :key => field[:key],
- :value => field[:value],
- :element => field[:element] }
- end
-end
+# This file kept for backwards compatability
+require File.join(File.dirname(__FILE__), '../thrift')
\ No newline at end of file
diff --git a/lib/rb/lib/thrift/thrift_client.rb b/lib/rb/lib/thrift/thrift_client.rb
new file mode 100644
index 0000000..2be0af3
--- /dev/null
+++ b/lib/rb/lib/thrift/thrift_client.rb
@@ -0,0 +1,36 @@
+module ThriftClient
+ def initialize(iprot, oprot=nil)
+ @iprot = iprot
+ @oprot = oprot || iprot
+ @seqid = 0
+ end
+
+ def send_message(name, args_class, args = {})
+ @oprot.writeMessageBegin(name, TMessageType::CALL, @seqid)
+ data = args_class.new
+ args.each do |k, v|
+ data.send("#{k.to_s}=", v)
+ end
+ data.write(@oprot)
+ @oprot.writeMessageEnd()
+ @oprot.trans.flush()
+ end
+
+ def receive_message(result_klass)
+ fname, mtype, rseqid = @iprot.readMessageBegin()
+ handle_exception(mtype)
+ result = result_klass.new
+ result.read(@iprot)
+ @iprot.readMessageEnd()
+ return result
+ end
+
+ def handle_exception(mtype)
+ if mtype == TMessageType::EXCEPTION
+ x = TApplicationException.new()
+ x.read(@iprot)
+ @iprot.readMessageEnd()
+ raise x
+ end
+ end
+end
diff --git a/lib/rb/lib/thrift/thrift_struct.rb b/lib/rb/lib/thrift/thrift_struct.rb
new file mode 100644
index 0000000..5947038
--- /dev/null
+++ b/lib/rb/lib/thrift/thrift_struct.rb
@@ -0,0 +1,135 @@
+module ThriftStruct
+ def initialize(d={})
+ each_field do |fid, type, name, default|
+ instance_variable_set("@#{name}", d[name.to_s] || d[name.intern] || default)
+ end
+ end
+
+ def struct_fields
+ self.class.const_get(:FIELDS)
+ end
+
+ def each_field
+ struct_fields.each do |fid, data|
+ yield fid, data[:type], data[:name], data[:default]
+ end
+ end
+
+ def read(iprot)
+ iprot.readStructBegin()
+ loop do
+ fname, ftype, fid = iprot.readFieldBegin()
+ break if (ftype === TType::STOP)
+ handle_message(iprot, fid, ftype)
+ iprot.readFieldEnd()
+ end
+ iprot.readStructEnd()
+ end
+
+ def write(oprot)
+ oprot.writeStructBegin(self.class.name)
+ each_field do |fid, type, name|
+ if ((value = instance_variable_get("@#{name}")) != nil)
+ if is_container? type
+ oprot.writeFieldBegin(name, type, fid)
+ write_container(oprot, value, struct_fields[fid])
+ oprot.writeFieldEnd
+ else
+ oprot.write_field(name, type, fid, value)
+ end
+ end
+ end
+ oprot.writeFieldStop()
+ oprot.writeStructEnd()
+ end
+
+ protected
+
+ def handle_message(iprot, fid, ftype)
+ field = struct_fields[fid]
+ if field && field[:type] == ftype
+ value = read_field(iprot, field)
+ instance_variable_set("@#{field[:name]}", value)
+ else
+ iprot.skip(ftype)
+ end
+ end
+
+ def read_field(iprot, field = {})
+ if field[:type] == TType::STRUCT
+ value = field[:class].new
+ value.read(iprot)
+ elsif field[:type] == TType::MAP
+ key_type, val_type, size = iprot.readMapBegin
+ value = {}
+ size.times do
+ k = read_field(iprot, field_info(field[:key]))
+ v = read_field(iprot, field_info(field[:value]))
+ value[k] = v
+ end
+ iprot.readMapEnd
+ elsif field[:type] == TType::LIST
+ e_type, size = iprot.readListBegin
+ value = Array.new(size) do |n|
+ read_field(iprot, field_info(field[:element]))
+ end
+ iprot.readListEnd
+ elsif field[:type] == TType::SET
+ e_type, size = iprot.readSetBegin
+ value = {}
+ size.times do
+ element = read_field(iprot, field_info(field[:element]))
+ value[element] = true
+ end
+ iprot.readSetEnd
+ else
+ value = iprot.read_type(field[:type])
+ end
+ value
+ end
+
+ def write_data(oprot, value, field)
+ if is_container? field[:type]
+ write_container(oprot, value, field)
+ else
+ oprot.write_type(field[:type], value)
+ end
+ end
+
+ def write_container(oprot, value, field = {})
+ if field[:type] == TType::MAP
+ oprot.writeMapBegin(field[:key][:type], field[:value][:type], value.size)
+ value.each do |k, v|
+ write_data(oprot, k, field[:key])
+ write_data(oprot, v, field[:value])
+ end
+ oprot.writeMapEnd
+ elsif field[:type] == TType::LIST
+ oprot.writeListBegin(field[:element][:type], value.size)
+ value.each do |elem|
+ write_data(oprot, elem, field[:element])
+ end
+ oprot.writeListEnd
+ elsif field[:type] == TType::SET
+ oprot.writeSetBegin(field[:element][:type], value.size)
+ value.each do |k, v|
+ write_data(oprot, k, field[:element])
+ end
+ oprot.writeSetEnd
+ else
+ raise "Not a container type: #{field[:type]}"
+ end
+ end
+
+ def is_container?(type)
+ [TType::LIST, TType::MAP, TType::SET].include? type
+ end
+
+ def field_info(field)
+ { :type => field[:type],
+ :class => field[:class],
+ :key => field[:key],
+ :value => field[:value],
+ :element => field[:element] }
+ end
+end
diff --git a/lib/rb/lib/thrift/tprocessor.rb b/lib/rb/lib/thrift/tprocessor.rb
new file mode 100644
index 0000000..1a2c5a1
--- /dev/null
+++ b/lib/rb/lib/thrift/tprocessor.rb
@@ -0,0 +1,36 @@
+module TProcessor
+ def initialize(handler)
+ @handler = handler
+ end
+
+ def process(iprot, oprot)
+ name, type, seqid = iprot.readMessageBegin()
+ if respond_to?("process_#{name}")
+ send("process_#{name}", seqid, iprot, oprot)
+ return true
+ else
+ iprot.skip(TType::STRUCT)
+ iprot.readMessageEnd()
+ x = TApplicationException.new(TApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
+ oprot.writeMessageBegin(name, TMessageType::EXCEPTION, seqid)
+ x.write(oprot)
+ oprot.writeMessageEnd()
+ oprot.trans.flush()
+ return
+ end
+ end
+
+ def read_args(iprot, args_class)
+ args = args_class.new
+ args.read(iprot)
+ iprot.readMessageEnd
+ args
+ end
+
+ def write_result(result, oprot, name, seqid)
+ oprot.writeMessageBegin(name, TMessageType::REPLY, seqid)
+ result.write(oprot)
+ oprot.writeMessageEnd()
+ oprot.trans.flush()
+ end
+end
diff --git a/lib/rb/lib/thrift/types.rb b/lib/rb/lib/thrift/types.rb
new file mode 100644
index 0000000..db13f25
--- /dev/null
+++ b/lib/rb/lib/thrift/types.rb
@@ -0,0 +1,21 @@
+module TType
+ STOP = 0
+ VOID = 1
+ BOOL = 2
+ BYTE = 3
+ DOUBLE = 4
+ I16 = 6
+ I32 = 8
+ I64 = 10
+ STRING = 11
+ STRUCT = 12
+ MAP = 13
+ SET = 14
+ LIST = 15
+end
+
+module TMessageType
+ CALL = 1
+ REPLY = 2
+ EXCEPTION = 3
+end