class S3backup::TreeInfo

Attributes

db[R]
db_name[R]

Public Class Methods

new(opt) click to toggle source
# File lib/s3backup/tree_info.rb, line 88
def initialize(opt)
  @db_name = opt[:db]
  @db = SQLite3::Database.new(opt[:db])
  if opt[:format].nil?
    make_table
  elsif opt[:format] == :directory
    make_table
    stat = File.stat(opt[:directory])
    sql = "insert into directory(name,mtime) values (:name, :mtime)"
    @db.execute(sql,:name=>opt[:directory],:mtime =>stat.mtime.to_i)
    dir_id = nil
    @db.execute('select id from directory where name=?',opt[:directory]) do |row|
      #rowは結果の配列
      dir_id = row[0].to_i
    end
    makeFileMap(opt[:directory],dir_id)
  elsif opt[:format] == :yaml
    make_table
    convert_yaml_to_sqlite3(YAML.load(opt[:data]))
  end
end

Public Instance Methods

check_dirs(p_id,p_name) click to toggle source
# File lib/s3backup/tree_info.rb, line 26
def check_dirs(p_id,p_name)
  @db.execute('select id,name from directory where parent_directory_id = ?',p_id) do |row|
    id = row[0]
    name = row[1]
    if File.basename(name) == File.basename(p_name)
      sql = "insert into file(name,size,mtime,directory_id) values (:name, :size, :mtime,:directory_id)"
      @db.execute(sql,:name=>"absolutely_no_exist_file_name#{id}",:size=>0,:mtime =>0,:directory_id=>p_id)
    end
    check_dirs(id,name)
  end
end
close(delete=false) click to toggle source
# File lib/s3backup/tree_info.rb, line 235
def close(delete=false)
  @db.close
  if delete
    if File.exist?(@db_name)
      File.unlink(@db_name)
    end
    if File.exist?(@db_name + ".gz")
      File.unlink(@db_name+".gz")
    end
  end
end
convert_yaml_to_sqlite3(file_map) click to toggle source
# File lib/s3backup/tree_info.rb, line 37
def convert_yaml_to_sqlite3(file_map)
  file_map[:directory].keys().sort{|a,b| a<=>b}.each do |key|
    file_at = file_map[:directory][key]
    sql = "insert into directory(name,mtime) values (:name, :mtime)"
    @db.execute(sql,:name=>key,:mtime => file_at[:mtime].to_i )
  end
  @db.execute('select id,name from directory' ) do |row|
    dir_id = row[0].to_i
    parent = File.dirname(row[1])
    @db.execute('select id from directory where name =?',parent ) do |row|
      @db.execute("update directory set parent_directory_id = #{row[0]} where id = #{dir_id}")
    end
  end
  #for bug (same name directory was not backuped before)
  @db.execute('select id,name from directory order by id limit 1') do |row|
    p_id = row[0]
    name = row[1]
    check_dirs(p_id,name)
  end
  file_map[:file].each do |key,val|
    file_at = file_map[:file][key]
    dir_name = File.dirname(key)
    dir_id = nil
    @db.execute('select id from directory where name=?',dir_name ) do |row|
      #rowは結果の配列
      dir_id = row[0].to_i
    end
    unless dir_id
      STDERR.print "directory name isn't exist ignore #{dir_name}"
      next
    end
    sql = "insert into file(name,size,mtime,directory_id) values (:name, :size, :mtime,:directory_id)"
    @db.execute(sql,:name=>key,:size=>file_at[:size],:mtime => file_at[:date].to_i, :directory_id=>dir_id)
  end
  file_map[:symlink].each do |key,val|
    file_at = file_map[:symlink][key]
    dir_name = File.dirname(key)
    sql="select id from directory where name = :name"
    dir_id = nil
    @db.execute('select id from directory where name=?',dir_name ) do |row|
      #rowは結果の配列
      dir_id = row[0].to_i
    end
    unless dir_id
      STDERR.print "directory name isn't exist ignore #{dir_name}"
      next
    end
    sql = "insert into symlink(name,source,directory_id) values (:name, :source,:directory_id)"
    @db.execute(sql,:name=>key,:source=>file_at[:source],:directory_id=>dir_id)
  end
end
get_level_directory(tree,p_id,level) click to toggle source
# File lib/s3backup/tree_info.rb, line 163
def get_level_directory(tree,p_id,level)
  @db.execute('select id,name,mtime from directory where parent_directory_id = ?',p_id) do |row|
    id = row[0]
    name = row[1]
    mtime = row[2].to_i
    tree[level] = {} unless tree[level]
    tree[level][name] = {:mtime=>mtime.to_i}
    get_level_directory(tree,id,level+1)
  end
end
hierarchie(dir) click to toggle source
# File lib/s3backup/tree_info.rb, line 173
def hierarchie(dir)
  tree=[]
  result = @db.execute('select id,name,mtime from directory where name = ?',dir)
  if result.length == 0
    S3log.error("#{dir} is not stored.")
    exit(-1)
  end
  id = result[0][0]
  name = result[0][1]
  mtime = result[0][2].to_i
  tree[0] = {} 
  tree[0][name]={:mtime=>mtime}
  get_level_directory(tree,id,1)
  return tree
end
makeFileMap(dir,id) click to toggle source
# File lib/s3backup/tree_info.rb, line 109
def makeFileMap(dir,id)
  Dir.entries(dir).each do |e|
    if e == "." or e == ".."
      next
    end
    name = dir + "/" + e
    if File.directory?(name)
      stat = File.stat(name)
      sql = "insert into directory(name,mtime,parent_directory_id) values (:name, :mtime,:parent_directory_id)"
      @db.execute(sql,:name=>name,:mtime =>stat.mtime.to_i,:parent_directory_id=>id)
      dir_id = nil
      @db.execute('select id from directory where name=?',name) do |row|
        #rowは結果の配列
        dir_id = row[0].to_i
      end
      makeFileMap(name,dir_id)
    elsif File.symlink?(name)
      sql = "insert into symlink(name,source,directory_id) values (:name, :source,:directory_id)"
      @db.execute(sql,:name=>name,:source=>File.readlink(name),:directory_id=>id)
    else
      stat = File.stat(name)
      sql = "insert into file(name,size,mtime,directory_id) values (:name, :size, :mtime,:directory_id)"
      @db.execute(sql,:name=>name,:size=>stat.size,:mtime => stat.mtime.to_i, :directory_id=>id)
    end
  end
end
make_table() click to toggle source
# File lib/s3backup/tree_info.rb, line 6
def make_table
  sql = "create table directory ( id INTEGER PRIMARY KEY ,name varchar(2048), mtime integer, parent_directory_id integer)"
  @db.execute(sql)
  sql = "create table file ( name varchar(2048), size  integer, mtime integer,directory_id integer)"
  @db.execute(sql)
  sql = "create table symlink ( name varchar(2048), source varchar(2048),directory_id integer)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_directory_name ON directory(name)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_directory_parent_directory_id ON directory(parent_directory_id)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_file_directory_id ON file(directory_id)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_file_name  ON file(name)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_symlink_name  ON symlink(name)"
  @db.execute(sql)
  sql = "CREATE INDEX idx_symlink_directory_id  ON symlink(directory_id)"
  @db.execute(sql)
end
modify(target) { |{:name => name,:mtime=>to_i,:files => file_infos ,:links => sym_infos}| ... } click to toggle source
# File lib/s3backup/tree_info.rb, line 188
def modify(target)
  now_id = 0
  while 1
    result = @db.execute("select id,name,mtime from directory where id > ? limit 1",now_id)
    break if result.length == 0
    now_id = result[0][0].to_i
    name = result[0][1]
    mtime = result[0][2].to_i
    files = []
    links = []
    t_result = target.db.execute("select id,name from directory where name = ?",name)
    if t_result.length != 0
      t_id = t_result[0][0]
      t_files = target.db.execute("select name,size,mtime from file where directory_id = ? order by name",t_id)
      files = @db.execute("select name,size,mtime from file where directory_id = ? order by name",now_id)
      if t_files == files
        t_links = target.db.execute("select name,source from symlink where directory_id = ? order by name",t_id)
        links = @db.execute("select name,source from symlink where directory_id = ? order by name",now_id)
        if t_links == links
          next
        end
      end
    end
    file_infos = []
    files.each do |f|
      file_infos.push({:name=>f[0],:size=>f[1],:mtime=>f[2].to_i})
    end
    sym_infos = []
    links.each do |l|
      sym_infos.push({:name=>l[0],:source=>l[1]})
    end
    yield({:name => name,:mtime=>mtime.to_i,:files => file_infos ,:links => sym_infos})
  end
end
remove(target) { |{:name => name}| ... } click to toggle source
# File lib/s3backup/tree_info.rb, line 222
def remove(target)
  now_id = 0
  while 1
    t_result = target.db.execute("select id,name from directory where id > ? limit 1",now_id)
    break if t_result.length == 0
    now_id = t_result[0][0].to_i
    name = t_result[0][1]
    result = @db.execute("select id,name from directory where name = ?",name)
    if result.length == 0
      yield({:name => name})
    end
  end
end
update_dir(dir_info) click to toggle source
# File lib/s3backup/tree_info.rb, line 135
def update_dir(dir_info)
  result = @db.execute("select id from directory where name = ?",dir_info[:name])
  p_id = nil
  id = nil
  @db.execute('select id from directory where name =?',File.dirname(dir_info[:name])) do |row|
    p_id = row[0]
  end
  if result.length != 0
    id = result[0][0]
    @db.execute("delete from file where directory_id = #{id}")
    @db.execute("delete from symlink where directory_id = #{id}")

    @db.execute("update directory  set mtime = ?,parent_directory_id = ?" + 
                " where id = ?",dir_info[:mtime].to_i,p_id,id)
  else
    @db.execute("insert into directory(name,mtime,parent_directory_id) values(?,?,?)",
      dir_info[:name],dir_info[:mtime].to_i,p_id)
    result = @db.execute("select id from directory where name = ?",dir_info[:name])
    id = result[0][0]
  end
  dir_info[:files].each do |f|
    @db.execute("insert into file(name,mtime,size,directory_id) values(?,?,?,?)",
                f[:name],f[:mtime].to_i,f[:size],id)
  end
  dir_info[:links].each do |f|
    @db.execute("insert into symlink(name,source,directory_id) values(?,?,?)",f[:name],f[:source],id)
  end
end