Sha256: 0e0bc4ee746d98e72048338c578cadd99a2296daa54ca461a5444137e65b21a0

Contents?: true

Size: 1.39 KB

Versions: 56

Compression:

Stored size: 1.39 KB

Contents

require 'epitools'
require 'dbm'
require 'delegate'

class Ezdc < DelegateClass(Hash)

  attr_reader :db, :path, :dirty

  @@dirty = Set.new
  
  def initialize(filename)
    @path = Path[filename]
    
    if @path.ext.nil?
      @path.ext = "db"
    else
      @path.ext += ".db" if @path.ext != 'db'
    end
    
    @db = DBM::open(@path.with(:ext=>nil))
    
    super
  end
  
  class Observed < BasicObject
    MUTATORS = ::Set.new [
      :<<, :push, :pop, :slice, :[]=
    ]
  
    def __send__(meth, *args)
      if MUTATORS.include? meth
        @@dirty.add self
      end
      
    end
  end
  
  def observed(obj)
    obj.using(Observed)
  end
  
  def [](key)
    observed(super[key])
  end
  
  def []=(key, val)
  end
  
  def keys
    db.keys.map(&:unmarshal)
  end
  
  def delete!
    @path.rm
  end
  
  def flush!
    dirty.each do |key|
      db[key.marshal] = super[key].marshal
    end
  end
  
end


class Ezdb

  attr_reader :db, :path

  def initialize(filename)
    @path = Path[filename]
    
    if @path.ext.nil?
      @path.ext = "db"
    else
      @path.ext += ".db" if @path.ext != 'db'
    end
    
    @db = DBM::open(@path.with(:ext=>nil))
  end
  
  def [](key)
    val = db[key.marshal]
    val = val.unmarshal if val
    val
  end
  
  def []=(key, val)
    db[key.marshal] = val.marshal
  end
  
  def keys
    db.keys.map(&:unmarshal)
  end
  
  def delete!
    @path.rm
  end
  
end

Version data entries

56 entries across 56 versions & 1 rubygems

Version Path
epitools-0.5.59 lib/epitools/ezdb.rb
epitools-0.5.58 lib/epitools/ezdb.rb
epitools-0.5.57 lib/epitools/ezdb.rb
epitools-0.5.56 lib/epitools/ezdb.rb
epitools-0.5.55 lib/epitools/ezdb.rb
epitools-0.5.54 lib/epitools/ezdb.rb
epitools-0.5.51 lib/epitools/ezdb.rb
epitools-0.5.50 lib/epitools/ezdb.rb
epitools-0.5.49 lib/epitools/ezdb.rb
epitools-0.5.47 lib/epitools/ezdb.rb
epitools-0.5.46 lib/epitools/ezdb.rb
epitools-0.5.45 lib/epitools/ezdb.rb
epitools-0.5.44 lib/epitools/ezdb.rb
epitools-0.5.43 lib/epitools/ezdb.rb
epitools-0.5.42 lib/epitools/ezdb.rb
epitools-0.5.41 lib/epitools/ezdb.rb
epitools-0.5.39 lib/epitools/ezdb.rb
epitools-0.5.38 lib/epitools/ezdb.rb
epitools-0.5.37 lib/epitools/ezdb.rb
epitools-0.5.36 lib/epitools/ezdb.rb