lib/ruote/storage/composite_storage.rb in ruote-2.2.0 vs lib/ruote/storage/composite_storage.rb in ruote-2.3.0
- old
+ new
@@ -1,7 +1,7 @@
#--
-# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
+# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
@@ -31,12 +31,12 @@
# This storage allows for mixing of storage implementation or simply
# mixing of storage physical backend.
#
# opts = {}
#
- # engine =
- # Ruote::Engine.new(
+ # dashboard =
+ # Ruote::Dashboard.new(
# Ruote::Worker.new(
# Ruote::CompositeStorage.new(
# Ruote::FsStorage.new('ruote_work', opts),
# 'msgs' => Ruote::HashStorage.new(opts))))
#
@@ -49,84 +49,74 @@
def initialize(default_storage, storages)
@default_storage = default_storage
@storages = storages
-
- prepare_base_methods
end
- def put(doc, opts={})
+ # A class method 'delegate', to tell this storage how to deal with
+ # each method composing a storage.
+ #
+ # Followed by a list of 'delegations'.
+ #
+ def self.delegate(method_name, type=nil)
- storage(doc['type']).put(doc, opts)
+ if type == nil
+ define_method(method_name) do |*args|
+ storage_for(args.first['type']).send(method_name, *args)
+ end
+ elsif type.is_a?(Fixnum)
+ define_method(method_name) do |*args|
+ storage_for(args[type]).send(method_name, *args)
+ end
+ else
+ type = type.to_s
+ define_method(method_name) do |*args|
+ storage_for(type).send(method_name, *args)
+ end
+ end
end
- def get(type, key)
+ delegate :put
+ delegate :get, 0
+ delegate :get_many, 0
+ delegate :delete
- storage(type).get(type, key)
- end
+ delegate :reserve
+ delegate :ids, 0
+ delegate :purge_type!, 0
+ delegate :empty?, 0
- def delete(doc)
+ delegate :put_msg, :msgs
+ delegate :get_msgs, :msgs
+ delegate :put_schedule, :schedules
+ delegate :get_schedules, :schedules
+ delegate :delete_schedule, :schedules
+ delegate :find_root_expression, :expressions
+ delegate :expression_wfids, :expressions
+ delegate :get_trackers, :variables
+ delegate :get_engine_variable, :variables
+ delegate :put_engine_variable, :variables
- storage(doc['type']).delete(doc)
+ # The dilemma for the CompositeStorage with add_type is "to which
+ # real storage should the new type get added". The solution: do nothing.
+ #
+ def add_type(type)
end
- def get_many(type, key=nil, opts={})
-
- storage(type).get_many(type, key, opts)
- end
-
- def ids(type)
-
- storage(type).ids(type)
- end
-
- def purge!
-
- TYPES.collect { |t| storage(t) }.uniq.each { |s| s.purge! }
- end
-
- def purge_type!(type)
-
- storage(type).purge_type!(type)
- end
-
- #def add_type (type)
- #end
-
- protected
-
- STORAGE_BASE_METHODS = {
- 'put_msg' => 'msgs',
- 'get_msgs' => 'msgs',
- 'find_root_expression' => 'expressions',
- 'get_schedules' => 'schedules',
- 'put_schedule' => 'schedules'
- }
-
TYPES = %w[
variables
msgs
expressions
errors
schedules
configurations
workitems
]
- def prepare_base_methods
+ protected
- singleton = class << self; self; end
-
- STORAGE_BASE_METHODS.each do |method, type|
-
- singleton.send(:define_method, method) do |*args|
- storage(type).send(method, *args)
- end
- end
- end
-
- def storage(type)
+ def storage_for(type)
@storages[type] || @default_storage
end
end
end