Module: Tapsoob::Utils

Extended by:
Utils
Included in:
Utils
Defined in:
lib/tapsoob/utils.rb

Instance Method Summary collapse

Instance Method Details

#base64decode(data) ⇒ Object



36
37
38
# File 'lib/tapsoob/utils.rb', line 36

def base64decode(data)
  data.unpack("m").first
end

#base64encode(data) ⇒ Object



32
33
34
# File 'lib/tapsoob/utils.rb', line 32

def base64encode(data)
  [data].pack("m")
end

#bin(cmd) ⇒ Object



19
20
21
22
# File 'lib/tapsoob/utils.rb', line 19

def bin(cmd)
  cmd = "#{cmd}.cmd" if windows?
  cmd
end

#calculate_chunksize(old_chunksize) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/tapsoob/utils.rb', line 105

def calculate_chunksize(old_chunksize)
  c = Tapsoob::Chunksize.new(old_chunksize)

  begin
    c.start_time = Time.now
    c.time_in_db = yield c
  rescue Errno::EPIPE
    c.retries += 1
    raise if c.retries > 2

    # we got disconnected, the chunksize could be too large
    # reset the chunksize based on the number of retries
    c.reset_chunksize
    retry
  end

  c.end_time = Time.now
  c.calc_new_chunksize
end

#checksum(data) ⇒ Object



24
25
26
# File 'lib/tapsoob/utils.rb', line 24

def checksum(data)
  Zlib.crc32(data)
end

#encode_blobs(row, columns) ⇒ Object



97
98
99
100
101
102
103
# File 'lib/tapsoob/utils.rb', line 97

def encode_blobs(row, columns)
  return row if columns.size == 0
  columns.each do |c|
    row[c] = base64encode(row[c]) unless row[c].nil?
  end
  row
end

#export_indexes(dump_path, table, index_data) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/tapsoob/utils.rb', line 131

def export_indexes(dump_path, table, index_data)
  data = [index_data]
  if File.exists?(File.join(dump_path, "indexes", "#{table}.json"))
    previous_data = JSON.parse(File.read(File.join(dump_path, "indexes", "#{table}.json")))
    data = data + previous_data
  end

  File.open(File.join(dump_path, "indexes", "#{table}.json"), 'w') do |file|
    file.write(JSON.generate(data))
  end
end

#export_rows(dump_path, table, row_data) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
# File 'lib/tapsoob/utils.rb', line 143

def export_rows(dump_path, table, row_data)
  data = row_data
  if File.exists?(File.join(dump_path, "data", "#{table}.json"))
    previous_data = JSON.parse(File.read(File.join(dump_path, "data", "#{table}.json")))
    data[:data] = previous_data["data"] + row_data[:data]
  end

  File.open(File.join(dump_path, "data", "#{table}.json"), 'w') do |file|
    file.write(JSON.generate(data))
  end
end

#export_schema(dump_path, table, schema_data) ⇒ Object



125
126
127
128
129
# File 'lib/tapsoob/utils.rb', line 125

def export_schema(dump_path, table, schema_data)
  File.open(File.join(dump_path, "schemas", "#{table}.rb"), 'w') do |file|
    file.write(schema_data)
  end
end

#format_data(data, opts = {}) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/tapsoob/utils.rb', line 40

def format_data(data, opts = {})
  return {} if data.size == 0
  string_columns = opts[:string_columns] ||

#incorrect_blobs(db, table) ⇒ Object

mysql text and blobs fields are handled the same way internally this is not true for other databases so we must check if the field is actually text and manually convert it back to a string



86
87
88
89
90
91
92
93
94
95
# File 'lib/tapsoob/utils.rb', line 86

def incorrect_blobs(db, table)
  return [] if (db.url =~ /(mysql|mysql2):\/\//).nil?

  columns = []
  db.schema(table).each do |data|
    column, cdata = data
    columns << column if cdata[:type] == :blob
  end
  columns
end

#load_indexes(database_url, index) ⇒ Object



160
161
162
# File 'lib/tapsoob/utils.rb', line 160

def load_indexes(database_url, index)
  Tapsoob::Schema.load_indexes(database_url, index)
end

#load_schema(dump_path, database_url, table) ⇒ Object



155
156
157
158
# File 'lib/tapsoob/utils.rb', line 155

def load_schema(dump_path, database_url, table)
  schema = File.join(dump_path, "schemas", "#{table}.rb")
  schema_bin(:load, database_url, schema.to_s)
end

#order_by(db, table) ⇒ Object



181
182
183
184
185
186
187
188
189
# File 'lib/tapsoob/utils.rb', line 181

def order_by(db, table)
  pkey = primary_key(db, table)
  if pkey
    pkey.kind_of?(Array) ? pkey : [pkey.to_sym]
  else
    table = table.to_sym unless table.kind_of?(Sequel::SQL::Identifier)
    db[table].columns
  end
end

#primary_key(db, table) ⇒ Object



171
172
173
# File 'lib/tapsoob/utils.rb', line 171

def primary_key(db, table)
  db.schema(table).select { |c| c[1][:primary_key] }.map { |c| c[0] }
end

#schema_bin(command, *args) ⇒ Object



164
165
166
167
168
169
# File 'lib/tapsoob/utils.rb', line 164

def schema_bin(command, *args)
  require 'tapsoob/cli'
  subcommand = "schema"
  script = Tapsoob::CLI::Schema.new
  script.invoke(command, args.map { |a| "#{a}" })
end

#single_integer_primary_key(db, table) ⇒ Object



175
176
177
178
179
# File 'lib/tapsoob/utils.rb', line 175

def single_integer_primary_key(db, table)
  table = table.to_sym unless table.kind_of?(Sequel::SQL::Identifier)
  keys = db.schema(table).select { |c| c[1][:primary_key] and c[1][:type] == :integer }
  not keys.nil? and keys.size == 1
end

#valid_data?(data, crc32) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/tapsoob/utils.rb', line 28

def valid_data?(data, crc32)
  Zlib.crc32(data) == crc32.to_i
end

#windows?Boolean

Returns:

  • (Boolean)


13
14
15
16
17
# File 'lib/tapsoob/utils.rb', line 13

def windows?
  return @windows if defined?(@windows)
  require 'rbconfig'
  @windows = !!(::RbConfig::CONFIG['host_os'] =~ /mswin|mingw/)
end