Class: Baza::Dump
- Inherits:
-
Object
- Object
- Baza::Dump
- 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
- #debug(message) ⇒ Object
-
#dump(io) ⇒ Object
Dumps all tables into the given IO.
- #dump_foreign_keys(_io) ⇒ Object
-
#dump_insert_multi(io, table_obj, rows) ⇒ Object
Dumps the given rows from the given table into the given IO.
-
#dump_table(io, table_obj) ⇒ Object
Dumps the given table into the given IO.
- #each_table ⇒ Object
-
#initialize(args) ⇒ Dump
constructor
Constructor.
-
#on_status(&block) ⇒ Object
A block can be executed when a new status occurs.
-
#update_status ⇒ Object
Method used to update the status.
Constructor Details
#initialize(args) ⇒ Dump
Constructor.
Examples
dump = Baza::Dump.new(:db => db)
6 7 8 9 10 11 12 13 14 15 16 17 |
# File 'lib/baza/dump.rb', line 6 def initialize(args) @db = args.fetch(:db) @db_type = args[:db_type] @debug = args[:debug] @tables = args[:tables] if @db_type @export_db = Baza::Db.new(type: @db_type) else @export_db = @db end end |
Instance Method Details
#debug(message) ⇒ Object
64 65 66 |
# File 'lib/baza/dump.rb', line 64 def debug() puts if @debug end |
#dump(io) ⇒ Object
Dumps all tables into the given IO.
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 30 def dump(io) debug "Going through tables." @rows_count = 0 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 each_table do |table_obj| # 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 dump_foreign_keys(io) end |
#dump_foreign_keys(_io) ⇒ Object
132 133 134 135 136 137 138 139 140 |
# File 'lib/baza/dump.rb', line 132 def dump_foreign_keys(_io) each_table do |table| next unless table.respond_to?(:foreign_keys) table.foreign_keys.each do |foreign_key| # Dump foreign key end end end |
#dump_insert_multi(io, table_obj, rows) ⇒ Object
Dumps the given rows from the given table into the given IO.
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/baza/dump.rb', line 113 def dump_insert_multi(io, table_obj, rows) debug "Inserting #{rows.length} into #{table_obj.name}." sqls = @export_db.insert_multi( table_obj.name, rows, replace_line_breaks: true, 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 110 |
# File 'lib/baza/dump.rb', line 69 def dump_table(io, table_obj) create_data = table_obj.data.clone create_data.delete(:name) create_data[:return_sql] = true # Get SQL for creating table and add it to IO. sqls = @export_db.tables.create(table_obj.name, **create_data) 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 @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 |
#each_table ⇒ Object
142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/baza/dump.rb', line 142 def each_table if @tables tables = @tables else tables = @db.tables.list 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? yield table_obj end 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_status ⇒ Object
Method used to update the status.
20 21 22 23 24 25 26 27 |
# File 'lib/baza/dump.rb', line 20 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 |