Cache added, Main created

master
Denis Knauf 2010-03-28 14:33:49 +02:00
parent 9f9b6b63a2
commit 2eb887d9cc
2 changed files with 126 additions and 0 deletions

79
lib/logan/cache.rb Normal file
View File

@ -0,0 +1,79 @@
class Cache
READ = 1
WRITE = 2
attr_reader :source, :data
def initialize source, type = nil, data = nil
type ||= READ | WRITE
@source, @data, self.type = source, data || {}, type
end
def flush!
@data.each {|k,v| @obj[k] = v }
@data = {}
end
def dget k
@data[k] ||= @obj[k]
end
def oget k
@data[k] || @obj[k]
end
def dset k, v
@data[k] ||= v
end
def oset k, v
@obj[k] = v
end
def type= type
self.read, self.write = type & 1 > 0, type & 2 > 0
type
end
def read_cache= type
@type &= ~ (type ? 0 : 1)
define_singleton_method :[], type ? :oget, :dget
end
def write_cache= type
@type &= ~ (type ? 0 : 2)
define_singleton_method :[], type ? :oset, :dset
end
#include Enumerable
#def each &e
#return Enumerator.new self, :each unless e
#flush!
#@obj.each &e
#self
#end
end
class AutoValueConvertHash
include Enumerable
def initialize obj, encode = nil, each = nil, &decode
@object, @encoder = obj, decode.nil? ? encode || Marshal.method( :dump) : nil,
@each = each || obj.method( :each) rescue NameError
@decode = decode || Marshal.method( :restore)
end
def [] k
decode.call @object[k]
end
def []= k, v
@object[k] = encode.call v
end
def each *paras
@each.call *paras do |k, v|
yield k, decode( v)
end
end
end

47
lib/logan/inc/main.rb Normal file
View File

@ -0,0 +1,47 @@
require 'sbdb'
require 'safebox'
require 'robustserver'
module LogAn::Inc
class Main < RobustServer
def config db, type = nil
type ||= 1+4
ret = @etc[ 'inc.cnf', db, SBDB::RDONLY]
ret = AutoValueConvertHash.new ret if type&4 > 0
ret = Cache.new ret, type&3 if type&3 > 0
ret
end
def initialize conf
super
@conf = conf
@logs = LogAn::Loglines.new 'logs'
etc = @conf[:etc] || 'etc'
Dir.mkdir etc rescue Errno::EEXIST
@etc = SBDB::Env.new( etc,
log_config: SBDB::Env::LOG_IN_MEMORY | SBDB::Env::LOG_AUTO_REMOVE,
flags: SBDB::CREATE | SBDB::Env::INIT_TXN | Bdb::DB_INIT_MPOOL)
@hosts = config 'hosts'
@files = config 'files'
@fileparser = config 'fileparser'
@serv = LogAn::Inc.new :sock => TCPServer.new( *@conf[:server])
@sigs[:INT] = @sigs[:TERM] = method(:shutdown)
end
def at_exit
@logs and @logs.close
@etc and @etc.close
end
def shutdown s = nil
$stderr.puts [:signal, s, Signal[s]].inspect if s
@serv.close
exit 0
end
def run
@serv.run
end
end
end