Class: DbAgent::Seeder

Inherits:
Object
  • Object
show all
Defined in:
lib/db_agent/seeder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(handler) ⇒ Seeder

Returns a new instance of Seeder.



4
5
6
# File 'lib/db_agent/seeder.rb', line 4

def initialize(handler)
  @handler = handler
end

Instance Attribute Details

#handlerObject (readonly)

Returns the value of attribute handler.



7
8
9
# File 'lib/db_agent/seeder.rb', line 7

def handler
  @handler
end

Instance Method Details

#each_seed(install = true) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/db_agent/seeder.rb', line 70

def each_seed(install = true)
  handler.data_folder.glob('**/*') do |file|
    next unless file.directory?
    next unless (file/"metadata.json").exists?

    base = file.relative_to(handler.data_folder)
    begin
      Seeder.new(handler).install(base)
      puts "#{base} OK"
      yield(self, file) if block_given?
    rescue => ex
      puts "KO on #{file}"
      puts ex.message
    end if install
  end
end

#flush(to) ⇒ Object



42
43
44
45
46
47
48
49
50
51
# File 'lib/db_agent/seeder.rb', line 42

def flush(to)
  target = (handler.data_folder/to).rm_rf.mkdir_p
  source = (handler.data_folder/"empty")
  (target/"metadata.json").write <<-JSON.strip
    { "inherits": "empty" }
  JSON
  seed_files(source).each do |f|
    flush_seed_file(f, to)
  end
end

#flush_empty(to = "empty") ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/db_agent/seeder.rb', line 32

def flush_empty(to = "empty")
  target = (handler.data_folder/to).rm_rf.mkdir_p
  (target/"metadata.json").write <<-JSON.strip
    {}
  JSON
  TableOrderer.new(handler).tsort.each_with_index do |table_name, index|
    (target/"#{(index*10).to_s.rjust(5,"0")}-#{table_name}.json").write("[]")
  end
end

#flush_seed_file(f, to) ⇒ Object



53
54
55
56
57
# File 'lib/db_agent/seeder.rb', line 53

def flush_seed_file(f, to)
  target = (handler.data_folder/to)
  table = file2table(f)
  flush_table(table, target, f.basename, true)
end

#flush_table(table_name, target_folder, file_name, skip_empty) ⇒ Object



59
60
61
62
63
64
65
66
67
68
# File 'lib/db_agent/seeder.rb', line 59

def flush_table(table_name, target_folder, file_name, skip_empty)
  data = viewpoint.send(table_name.to_sym).to_a
  if data.empty? && skip_empty
    LOGGER.info("Skipping table `#{table_name}` since empty")
  else
    LOGGER.info("Flushing table `#{table_name}`")
    json = JSON.pretty_generate(data)
    (target_folder/file_name).write(json)
  end
end

#install(from) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/db_agent/seeder.rb', line 9

def install(from)
  handler.sequel_db.transaction do
    folder = handler.data_folder/from

    # load files in order
    pairs = merged_data(from)
    names = pairs.keys.sort{|p1,p2|
      pairs[p1].basename <=> pairs[p2].basename
    }

    # Truncate tables then fill them
    names.reverse.each do |name|
      LOGGER.info("Emptying table `#{name}`")
      handler.sequel_db[name.to_sym].delete
    end
    names.each do |name|
      LOGGER.info("Filling table `#{name}`")
      file = pairs[name]
      handler.sequel_db[name.to_sym].multi_insert(file.load)
    end
  end
end