class TDiary::IO::Rdb

Public Class Methods

db(conf) click to toggle source
# File lib/tdiary/io/rdb.rb, line 93
def db(conf)
  @@_db ||= Sequel.connect(conf.database_url || ENV['DATABASE_URL']).tap{|db|
    db.extension(:connection_validator)
    db.pool.connection_validation_timeout = -1
  }

  @@_db.test_connection

  @@_db.create_table :conf do
    String :body, text: true
  end unless @@_db.table_exists?(:conf)

  @@_db.create_table :diaries do
    String :diary_id, size: 8, primary_key: true
    String :year, size: 4
    String :month, size: 2
    String :day, size: 2
    String :title, text: true
    String :body, text: true
    String :style, text: true
    Fixnum :last_modified
    TrueClass :visible
  end unless @@_db.table_exists?(:diaries)

  @@_db.create_table :comments do
    String :diary_id, size: 8
    Fixnum :no
    String :name, text: true
    String :mail, text: true
    String :comment, text: true
    Fixnum :last_modified
    TrueClass :visible
    primary_key [:diary_id, :no]
  end unless @@_db.table_exists?(:comments)

  @@_db
end
load_cgi_conf(conf) click to toggle source
# File lib/tdiary/io/rdb.rb, line 77
def load_cgi_conf(conf)
  if cgi_conf = db(conf)[:conf].select(:body).first
    cgi_conf[:body]
  else
    ""
  end
end
save_cgi_conf(conf, result) click to toggle source
# File lib/tdiary/io/rdb.rb, line 85
def save_cgi_conf(conf, result)
  if db(conf)[:conf].count > 0
    db(conf)[:conf].update(:body => result)
  else
    db(conf)[:conf].insert(:body => result)
  end
end

Public Instance Methods

cache_dir() click to toggle source
# File lib/tdiary/io/rdb.rb, line 161
def cache_dir
  @tdiary.conf.cache_path || "#{Dir.tmpdir}/cache"
end
calendar() click to toggle source
# File lib/tdiary/io/rdb.rb, line 153
def calendar
  calendar = Hash.new{|hash, key| hash[key] = []}
  db[:diaries].select(:year, :month).group_by(:year, :month).order_by(:year, :month).each do |row|
    calendar[row[:year]] << row[:month]
  end
  calendar
end
transaction(date) { |diaries| ... } click to toggle source

block must be return boolean which dirty diaries.

# File lib/tdiary/io/rdb.rb, line 135
def transaction(date)
  diaries = {}

  if cache = restore_parser_cache(date)
    diaries.update(cache)
  else
    restore(date.strftime("%Y%m%d"), diaries)
    restore_comment(diaries)
  end

  dirty = yield(diaries) if iterator?

  store(diaries) if (dirty & TDiary::TDiaryBase::DIRTY_DIARY) != 0
  store_comment(diaries) if (dirty & TDiary::TDiaryBase::DIRTY_COMMENT) != 0

  store_parser_cache(date, diaries) if dirty || !cache
end

Private Instance Methods

db() click to toggle source
# File lib/tdiary/io/rdb.rb, line 213
def db
  self.class.db(@tdiary.conf)
end
restore(date, diaries, month = true) click to toggle source
# File lib/tdiary/io/rdb.rb, line 167
def restore(date, diaries, month = true)
  query = db[:diaries].select(:diary_id, :title, :last_modified, :visible, :body, :style)
  query = if month && /(\d\d\d\d)(\d\d)(\d\d)/ =~ date
            query.filter(:year => $1, month: $2)
          else
            query.filter(:diary_id => date)
          end
  query.each do |row|
    style = if row[:style].nil? || row[:style].empty?
              'wiki'
            else
              row[:style].downcase
            end
    diary = eval("#{style(style)}::new(row[:diary_id], row[:title], row[:body], Time::at(row[:last_modified].to_i))")
    diary.show(row[:visible])
    diaries[row[:diary_id]] = diary
  end
end
store(diaries) click to toggle source
# File lib/tdiary/io/rdb.rb, line 186
def store(diaries)
  diaries.each do |diary_id, diary|
    date = if /(\d\d\d\d)(\d\d)(\d\d)/ =~ diary_id
             {
        year: $1,
        month: $2,
        day: $3,
        diary_id: diary_id
      }
           end
    body = {
      title: diary.title,
      last_modified: diary.last_modified.to_i,
      style: diary.style,
      visible: diary.visible?,
      body: diary.to_src
    }

    entry = db[:diaries].filter(date)
    if entry.count > 0
      entry.update(body)
    else
      db[:diaries].insert(date.merge(body))
    end
  end
end