From 2eb887d9cc4f0c799a271104c669cabdc0f5ac5e Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Sun, 28 Mar 2010 14:33:49 +0200 Subject: [PATCH] Cache added, Main created --- lib/logan/cache.rb | 79 +++++++++++++++++++++++++++++++++++++++++++ lib/logan/inc/main.rb | 47 +++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 lib/logan/cache.rb create mode 100644 lib/logan/inc/main.rb diff --git a/lib/logan/cache.rb b/lib/logan/cache.rb new file mode 100644 index 0000000..16c9cbc --- /dev/null +++ b/lib/logan/cache.rb @@ -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 diff --git a/lib/logan/inc/main.rb b/lib/logan/inc/main.rb new file mode 100644 index 0000000..0d9cd0d --- /dev/null +++ b/lib/logan/inc/main.rb @@ -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