instiki/vendor/madeleine-0.7.1/samples/dictionary_server.rb
2005-01-15 20:26:54 +00:00

94 lines
1.9 KiB
Ruby
Executable file

#
# A dictionary server using Distributed Ruby (DRb).
#
# All modifications to the dictionary are done as commands,
# while read-only queries (i.e 'lookup') are done directly.
#
# First launch this server in the background, then use
# dictionary_client.rb to look up and add items to the
# dictionary.
# You can kill the server at any time. The contents of the
# dictionary will still be there when you restart it.
#
# DRb is available at http://raa.ruby-lang.org/list.rhtml?name=druby
#
$LOAD_PATH.unshift(".." + File::SEPARATOR + "lib")
require 'madeleine'
require 'drb'
class Dictionary
def initialize
@data = {}
end
def add(key, value)
@data[key] = value
end
def lookup(key)
@data[key]
end
end
class Addition
def initialize(key, value)
@key, @value = key, value
end
def execute(system)
system.add(@key, @value)
end
end
class Lookup
def initialize(key)
@key = key
end
def execute(system)
system.lookup(@key)
end
end
class DictionaryServer
def initialize(madeleine)
@madeleine = madeleine
@dictionary = madeleine.system
end
def add(key, value)
# When adding a new key-value pair we modify the system, so
# this operation has to be done through a command.
@madeleine.execute_command(Addition.new(key, value))
end
def lookup(key)
# A lookup is a read-only operation, so we can do it as a non-logged
# query. If we weren't worried about concurrency problems we could
# have just called @dictionary.lookup(key) directly instead.
@madeleine.execute_query(Lookup.new(key))
end
end
madeleine = SnapshotMadeleine.new("dictionary-base") { Dictionary.new }
Thread.new(madeleine) {
puts "Taking snapshot every 30 seconds."
while true
sleep(30)
madeleine.take_snapshot
end
}
DRb.start_service("druby://localhost:1234",
DictionaryServer.new(madeleine))
DRb.thread.join