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_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.
-
#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 |
# 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() puts 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_status ⇒ Object
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 |