Class: Baza::Dump

Inherits:
Object
  • Object
show all
Defined in:
lib/baza/dump.rb

Overview

This class can be used to make SQL-dumps of databases, tables or however you want it.

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Dump

Constructor.

Examples

dump = Baza::Dump.new(:db => db)



6
7
8
9
10
# File 'lib/baza/dump.rb', line 6

def initialize(args)
  @db = args.fetch(:db)
  @debug = args[:debug]
  @tables = args[:tables]
end

Instance Method Details

#debug(message) ⇒ Object



64
65
66
# File 'lib/baza/dump.rb', line 64

def debug(message)
  puts message if @debug
end

#dump(io) ⇒ Object

Dumps all tables into the given IO.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/baza/dump.rb', line 23

def dump(io)
  debug "Going through tables."
  @rows_count = 0

  if @tables
    tables = @tables
  else
    tables = @db.tables.list
  end

  if @on_status
    @on_status.call(text: "Preparing.")

    @rows_count_total = 0
    tables.each do |table_obj|
      @rows_count_total += table_obj.rows_count
    end
  end

  tables.each do |table_obj|
    table_obj = @db.tables[table_obj] if table_obj.is_a?(String) || table_obj.is_a?(Symbol)
    next if table_obj.native?

    # Figure out keys.
    @keys = []
    table_obj.columns do |col|
      @keys << col.name
    end

    @table_obj = table_obj
    update_status
    debug "Dumping table: '#{table_obj.name}'."
    dump_table(io, table_obj)
  end
end

#dump_insert_multi(io, table_obj, rows) ⇒ Object

Dumps the given rows from the given table into the given IO.



112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/baza/dump.rb', line 112

def dump_insert_multi(io, table_obj, rows)
  debug "Inserting #{rows.length} into #{table_obj.name}."
  sqls = @db.insert_multi(table_obj.name, rows, return_sql: true, keys: @keys)
  sqls.each do |sql|
    io.write("#{sql};\n")
  end

  rows.clear

  # Ensure garbage collection or we might start using A LOT of memory.
  GC.start
end

#dump_table(io, table_obj) ⇒ Object

Dumps the given table into the given IO.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/baza/dump.rb', line 69

def dump_table(io, table_obj)
  create_data = table_obj.data
  create_data.delete(:name)

  # Get SQL for creating table and add it to IO.
  sqls = @db.tables.create(table_obj.name, create_data, return_sql: true)
  sqls.each do |sql|
    io.write("#{sql};\n")
  end


  # Try to find a primary column in the table.
  prim_col = nil
  table_obj.columns do |col|
    if col.primarykey?
      prim_col = col
      break
    end
  end


  debug "Dumping data for table: #{table_obj.name}"

  # Set up rows and way to fill rows.
  rows = []


  @db.select(table_obj.name, nil, unbuffered: true) do |row|
    rows << row.values
    @rows_count += 1

    if rows.length >= 1000
      update_status
      dump_insert_multi(io, table_obj, rows)
    end
  end


  # Dump the last rows if any.
  dump_insert_multi(io, table_obj, rows) unless rows.empty?
end

#on_status(&block) ⇒ Object

A block can be executed when a new status occurs.



60
61
62
# File 'lib/baza/dump.rb', line 60

def on_status(&block)
  @on_status = block
end

#update_statusObject

Method used to update the status.



13
14
15
16
17
18
19
20
# File 'lib/baza/dump.rb', line 13

def update_status
  return nil unless @on_status
  rows_count = Knj::Locales.number_out(@rows_count, 0)
  rows_count_total = Knj::Locales.number_out(@rows_count_total, 0)
  percent = (@rows_count.to_f / @rows_count_total.to_f) * 100
  percent_text = Knj::Locales.number_out(percent, 1)
  @on_status.call(text: "Dumping table: '#{@table_obj.name}' (#{rows_count}/#{rows_count_total} - #{percent_text}%).")
end