Class: DRb::DRbObject

Inherits:
Object
  • Object
show all
Defined in:
lib/drb/drb.rb,
lib/drb/gw.rb,
lib/drb/eq.rb

Overview

Object wrapping a reference to a remote drb object.

Method calls on this object are relayed to the remote object that this object is a stub for.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(obj, uri = nil) ⇒ DRbObject

Create a new remote object stub.

obj is the (local) object we want to create a stub for. Normally this is nil. uri is the URI of the remote object that this will be a stub for.



1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
# File 'lib/drb/drb.rb', line 1039

def initialize(obj, uri=nil)
  @uri = nil
  @ref = nil
  if obj.nil?
	return if uri.nil?
	@uri, option = DRbProtocol.uri_option(uri, DRb.config)
	@ref = DRbURIOption.new(option) unless option.nil?
  else
	@uri = uri ? uri : (DRb.uri rescue nil)
	@ref = obj ? DRb.to_id(obj) : nil
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(msg_id, *a, &b) ⇒ Object

Routes method calls to the referenced object.



1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
# File 'lib/drb/drb.rb', line 1077

def method_missing(msg_id, *a, &b)
  if DRb.here?(@uri)
	obj = DRb.to_obj(@ref)
	DRb.current_server.check_insecure_method(obj, msg_id)
	return obj.__send__(msg_id, *a, &b) 
  end

  succ, result = self.class.with_friend(@uri) do
    DRbConn.open(@uri) do |conn|
      conn.send_message(self, msg_id, a, b)
    end
  end

  if succ
    return result
  elsif DRbUnknown === result
    raise result
  else
    bt = self.class.prepare_backtrace(@uri, result)
	result.set_backtrace(bt + caller)
    raise result
  end
end

Class Method Details

._load(s) ⇒ Object

Unmarshall a marshalled DRbObject.

If the referenced object is located within the local server, then the object itself is returned. Otherwise, a new DRbObject is created to act as a stub for the remote referenced object.



1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
# File 'lib/drb/drb.rb', line 1001

def self._load(s)
  uri, ref = Marshal.load(s)
  
  if DRb.here?(uri)
	obj = DRb.to_obj(ref)
    if ((! obj.tainted?) && Thread.current[:drb_untaint])
      Thread.current[:drb_untaint].push(obj)
    end
    return obj
  end

  self.new_with(uri, ref)
end

.new_with(uri, ref) ⇒ Object



1015
1016
1017
1018
1019
1020
# File 'lib/drb/drb.rb', line 1015

def self.new_with(uri, ref)
  it = self.allocate
  it.instance_variable_set('@uri', uri)
  it.instance_variable_set('@ref', ref)
  it
end

.new_with_uri(uri) ⇒ Object

Create a new DRbObject from a URI alone.



1023
1024
1025
# File 'lib/drb/drb.rb', line 1023

def self.new_with_uri(uri)
  self.new(nil, uri)
end

.prepare_backtrace(uri, result) ⇒ Object



1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
# File 'lib/drb/drb.rb', line 1112

def self.prepare_backtrace(uri, result)
  prefix = "(#{uri}) "
  bt = []
  result.backtrace.each do |x|
    break if /`__send__'$/ =~ x 
    if /^\(druby:\/\// =~ x
      bt.push(x)
    else
      bt.push(prefix + x)
    end
  end
  bt
end

.with_friend(uri) ⇒ Object



1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
# File 'lib/drb/drb.rb', line 1101

def self.with_friend(uri)
  friend = DRb.fetch_server(uri)
  return yield() unless friend
  
  save = Thread.current['DRb']
  Thread.current['DRb'] = { 'server' => friend }
  return yield
ensure
  Thread.current['DRb'] = save if friend
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



5
6
7
8
# File 'lib/drb/eq.rb', line 5

def ==(other)
  return false unless DRbObject === other
 (@ref == other.__drbref) && (@uri == other.__drburi)
end

#__drbrefObject

Get the reference of the object, if local.



1058
1059
1060
# File 'lib/drb/drb.rb', line 1058

def __drbref
  @ref
end

#__drburiObject

Get the URI of the remote object.



1053
1054
1055
# File 'lib/drb/drb.rb', line 1053

def __drburi 
  @uri
end

#_dump(lv) ⇒ Object

Marshall this object.

The URI and ref of the object are marshalled.



1030
1031
1032
# File 'lib/drb/drb.rb', line 1030

def _dump(lv)
  Marshal.dump([@uri, @ref])
end

#hashObject



10
11
12
# File 'lib/drb/eq.rb', line 10

def hash
  [@uri, @ref].hash
end

#pretty_print(q) ⇒ Object

:nodoc:



1126
1127
1128
# File 'lib/drb/drb.rb', line 1126

def pretty_print(q)   # :nodoc:
  q.pp_object(self)
end

#pretty_print_cycle(q) ⇒ Object

:nodoc:



1130
1131
1132
1133
1134
1135
# File 'lib/drb/drb.rb', line 1130

def pretty_print_cycle(q)   # :nodoc:
  q.object_address_group(self) {
    q.breakable
    q.text '...'
  }
end

#respond_to?(msg_id, priv = false) ⇒ Boolean

Returns:

  • (Boolean)


1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
# File 'lib/drb/drb.rb', line 1065

def respond_to?(msg_id, priv=false)
  case msg_id
  when :_dump
    true
  when :marshal_dump
    false
  else
    method_missing(:respond_to?, msg_id, priv)
  end
end