Sha256: d117f43b496626535561504dc07fa943032346dc88d06c527aca492567fbd43c

Contents?: true

Size: 1.92 KB

Versions: 16

Compression:

Stored size: 1.92 KB

Contents

require 'json'

module Marvin
  # Implements a simple datastore interface, designed to make
  # it easy to develop handlers which have persistent data.
  class DataStore
    
    cattr_accessor :logger, :registered_stores
    self.logger = Marvin::Logger.logger
    self.registered_stores = {}
    
    # Returns the path to the data store relative to this file.
    # Used when loading / dumping the data.
    def self.datastore_location
      path =  Marvin::Settings[:datastore_location] ? Marvin::Settings.datastore_location : "tmp/datastore.json"
      return Marvin::Settings.root / path
    end
    
    # Dump the current data store contents to file.
    def self.dump!
      File.open(self.datastore_location, "w+") do |f|
        f.write self.registered_stores.to_json
      end
    end
    
    # Load the current data store contents from file.
    def self.load!
      results = {}
      if File.exists?(self.datastore_location)
        begin
          json = JSON.load(File.read(self.datastore_location))
          results = json if json.is_a?(Hash)
        rescue JSON::ParserError
        end
      end
      self.registered_stores = results
    end
    
    
    # For each individual datastore.
    
    attr_accessor :name
    
    def initialize(name)
      self.name = name.to_s
      self.registered_stores ||= {}
      self.registered_stores[self.name] ||= {}
    end
    
    def [](key)
      ((self.registered_stores||={})[self.name]||={})[key.to_s]
    end
    
    def []=(key,value)
      self.registered_stores[self.name][key.to_s] = value
    end
    
    def method_missing(name, *args, &blk)
      if name.to_s =~ /^(.*)=$/i
        self[$1.to_s] = args.first
      elsif self.registered_stores[self.name].has_key?(name.to_s)
        return self.registered_stores[self.name][name.to_s]
      else
        super(name, *args, &blk)
      end
    end
    
    def to_hash
      self.registered_stores[self.name]
    end
    
  end
end

Version data entries

16 entries across 16 versions & 2 rubygems

Version Path
Sutto-marvin-0.1.0.20081014 lib/marvin/data_store.rb
Sutto-marvin-0.1.0.20081016 lib/marvin/data_store.rb
Sutto-marvin-0.1.20081115 lib/marvin/data_store.rb
Sutto-marvin-0.1.20081120 lib/marvin/data_store.rb
Sutto-marvin-0.2.0 lib/marvin/data_store.rb
Sutto-marvin-0.2.1 lib/marvin/data_store.rb
Sutto-marvin-0.2.2 lib/marvin/data_store.rb
Sutto-marvin-0.2.3 lib/marvin/data_store.rb
Sutto-marvin-0.2.4 lib/marvin/data_store.rb
Sutto-marvin-0.3.0 lib/marvin/data_store.rb
Sutto-marvin-0.3.2 lib/marvin/data_store.rb
Sutto-marvin-0.3.3 lib/marvin/data_store.rb
Sutto-marvin-0.3.4 lib/marvin/data_store.rb
Sutto-marvin-0.4.0 lib/marvin/data_store.rb
jeffrafter-marvin-0.1.20081115 lib/marvin/data_store.rb
jeffrafter-marvin-0.1.20081120 lib/marvin/data_store.rb