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



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/db_agent/seeder.rb', line 99

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



71
72
73
74
75
76
77
78
79
80
# File 'lib/db_agent/seeder.rb', line 71

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



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

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



82
83
84
85
86
# File 'lib/db_agent/seeder.rb', line 82

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



88
89
90
91
92
93
94
95
96
97
# File 'lib/db_agent/seeder.rb', line 88

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

#insert_script(from) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/db_agent/seeder.rb', line 38

def insert_script(from)
  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
  }

  # Fill them
  names.each do |name|
    file = pairs[name]
    data = file.load
    next if data.empty?

    keys = data.first.keys
    values = data.map{|t|
      keys.map{|k| t[k] }
    }
    puts handler.sequel_db[name.to_sym].multi_insert_sql(keys, values)
  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
31
32
33
34
35
36
# File 'lib/db_agent/seeder.rb', line 9

def install(from)
  handler.sequel_db.transaction do
    before_seeding!

    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
    names.reverse.each do |name|
      LOGGER.info("Emptying table `#{name}`")
      handler.sequel_db[name.to_sym].delete
    end

    # Fill them
    names.each do |name|
      LOGGER.info("Filling table `#{name}`")
      file = pairs[name]
      handler.sequel_db[name.to_sym].multi_insert(file.load)
    end

    after_seeding!(folder)
  end
end