Hello, Steve.
Do you want it?
This database pass a root object by reference.
--- foo.rb ---
class Foo
def initialize(x, y)
@x = x
@y = y
end
attr_accessor :x, :y
end
--- db.rb ---
require 'pstore'
require 'drb/drb'
require 'drb/timeridconv'
require 'foo'
class Database < PStore
include DRbUndumped
def [](key)
if Thread.current['DRb']
return DRbObject.new(super)
else
super
end
end
end
store = Database.new('test.db')
DRb.install_id_conv(DRb::TimerIdConv.new)
DRb.start_service('druby://localhost:12345', store)
DRb.thread.join
--- client.rb ---
require 'drb/drb'
require 'foo'
def main
DRb.start_service
db = DRbObject.new_with_uri('druby://localhost:12345')
db.transaction do
db['foo'] = Foo.new(1, 2) unless db.root?('foo')
end
db.transaction do
foo = db['foo'] # pass by reference
foo.x = foo.x + 1
end
db.transaction do
foo = db['foo']
p [foo.x, foo.y, foo.class]
end
end
main
--- client2.rb ---
require 'drb/drb'
require 'foo'
def main
DRb.start_service
db = DRbObject.new_with_uri('druby://localhost:12345')
db.transaction do
db['foo'] = Foo.new(1, 2) unless db.root?('foo')
db['bar'] = Foo.new(db['foo'], 2) unless db.root?('bar')
end
db.transaction do
bar = db['bar'] # pass by reference
p bar
p bar.x # pass by value
bar.x.x = bar.x.x + 1 # can't change bar.x.x
bar.y = bar.y + 1 # can change bar.y
end
db.transaction do
bar = db['bar']
p [bar.x, bar.y, bar.class]
end
end
main