#!/usr/local/bin/ruby # cache.rb ver.0.3 2002.4.7-2003.1.20 # book-info from/to cache # original; amazon.rb for amazon by not require 'kconv' #require 'amazon.rb' #require 'bk1.rb' #require 'esbooks.rb' #require 'asahiya.rb' #require 'kinokuniya.rb' ##require 'isize.rb' ##require 'honnya.rb' ##require 'hayakawa.rb' ##require 'trc.rb' class DummyError def puts ( str = '' ) end end class CacheBib attr_accessor :info attr_reader :cache_dir attr_accessor :expire, :expire_full attr_accessor :insystemKcode, :outputKcode, :messageKcode attr_accessor :flag_read, :flag_save, :flag_net, :stderr def initialize () @expire = 12 #detail-reload-time (hour) @expire_full = 720 #all-reload-time (hour) (ISBN-search->detail-parse) @cache_dir = "./" #chache-data-folder @insystemKcode = 3 #sjis #1-jis,2-euc,3-sjis @outputKcode = 2 #euc @messageKcode = 3 #sjis # @bib = BibInfo.new() @flag_read = true @flag_save = true @flag_net = true @flag = false @stderr = $stderr end #===== ===== read/write chace ===== ===== def read_cache #----- check read-cache-flag ----- return if @flag #----- already read cache ----- if File::readable?(@cache_dir + @file) then if File::mtime(@cache_dir + @file) < Time::now.to_i - 3600 * @expire_full then return #----- full-reload ----- end if File::mtime(@cache_dir + @file) < Time::now.to_i - 3600 * @expire then @flag = nil #----- cache read and reload ----- else @flag = true #----- cahce read (only) ----- end end #----- read-cache ----- begin #----- \n\n-sepalate ----- texts = [] text = [] open(@cache_dir + @file).each{ |line| string = (line.chomp.chomp("\r")).kconv(@insystemKcode) if string != "" text << string else texts << text text = [] end } texts << text #----- book-info ----- texts.shift.each{ |line| record = line.split(/\t/) key = record.shift data = record.join("\t") @info[key] = data } #----- review-info ----- if texts.size > 0 reviews = [] texts.each{ |text| reviewinfo = {} text.each { |line| record = line.split(/\t/) key = record.shift data = record.join("\t") reviewinfo[key] = data } reviews << reviewinfo } @info["reviews"] = reviews end rescue message = "CHK; cannot read cahce. FILE; " + @cache_dir.to_s + @file.to_s @stderr.puts message.kconv(@messageKcode) @flag = nil end end def save_cache unless File::directory?(@cache_dir.to_s) message = "WAR; no-cache-folder. DIR; " + @cache_dir.to_s @stderr.puts message.kconv(@messageKcode) return end begin open(@cache_dir + @file, 'w'){ |fp| #----- book-info ----- @info.each{ |key, data| if !data.nil? && key != "reviews" then key = key.to_s.kconv(@outputKcode) data = data.to_s.kconv(@outputKcode) fp.puts key + "\t" + data message = "CHK; " + key + "\t" + data @stderr.puts message.kconv(@messageKcode) if @flag_debug end } #----- review-info ----- if !@info["reviews"].nil? @info["reviews"].each{ |review| fp.puts '' @stderr.puts '' if @flag_debug review.each{ |key, data| key = key.to_s.kconv(@outputKcode) data = data.to_s.kconv(@outputKcode) fp.puts key + "\t" + data message = "CHK; " + key + "\t" + data @stderr.puts message.kconv(@messageKcode) if @flag_debug } } end } rescue message = "WAR; cannot write cache. FILE; " + @cache_dir.to_s + @file.to_s @stderr.puts message.kconv(@messageKcode) end end #===== ===== main ===== ===== def get_data ( isbn = nil, flag = nil ) @isbn = isbn_check(isbn) if !isbn.nil? @file = "isbn" + @isbn.delete('-').downcase + ".txt" @info = {} #----- check(read)-cache ----- read_cache if @flag_read set_info return @info if @flag #----- read only return ----- return @info if flag #----- read only return ----- #----- download-bibinfo ----- get_info if @flag_net #----- write-cache ----- save_cache if @flag_save @flag = true return @info #----- download and write return ----- end #===== ===== parts ===== ===== def cache_dir=(dir) dir << '/' unless dir[-1,1] == '/' @cache_dir = dir end def isbn_check ( isbn ) isbn2 = isbn.delete('-').upcase check = 11 0.upto(8){ |i| check = check - (isbn2[i,1].to_i * (10-i)) } check = check % 11 digit = check.to_s digit = 'X' if check == 10 digit = '0' if check == 11 if isbn2.size < 10 #----- check-digit-lost ----- message = "WAR; ISBN check-digit lost. -> #{digit}" @stderr.puts message.kconv(@messageKcode) isbn2 << digit isbn << '-' unless isbn[-1,1] != '/' isbn << digit else #----- check-digit-error ----- check = isbn2[9,1] if check !~ digit message = "WAR; ISBN check-digit error. #{check} -> #{digit}" @stderr.puts message.kconv(@messageKcode) isbn2[9] = digit isbn.gsub!(/-.$/,"-#{digit}") end end return isbn end def merge_info ( list ) # = merge_hash info = {} list.each { |data_info| data_info.each{ |key,data| if data.to_s.size > 0 if info[key].nil? info[key] = data end end } } return info end end