db_sucker 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/CHANGELOG.md +45 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +193 -0
  7. data/Rakefile +1 -0
  8. data/VERSION +1 -0
  9. data/bin/db_sucker +12 -0
  10. data/bin/db_sucker.sh +14 -0
  11. data/db_sucker.gemspec +29 -0
  12. data/doc/config_example.rb +53 -0
  13. data/doc/container_example.yml +150 -0
  14. data/lib/db_sucker/adapters/mysql2.rb +103 -0
  15. data/lib/db_sucker/application/colorize.rb +28 -0
  16. data/lib/db_sucker/application/container/accessors.rb +60 -0
  17. data/lib/db_sucker/application/container/ssh.rb +225 -0
  18. data/lib/db_sucker/application/container/validations.rb +53 -0
  19. data/lib/db_sucker/application/container/variation/accessors.rb +45 -0
  20. data/lib/db_sucker/application/container/variation/helpers.rb +21 -0
  21. data/lib/db_sucker/application/container/variation/worker_api.rb +65 -0
  22. data/lib/db_sucker/application/container/variation.rb +60 -0
  23. data/lib/db_sucker/application/container.rb +70 -0
  24. data/lib/db_sucker/application/container_collection.rb +47 -0
  25. data/lib/db_sucker/application/core.rb +222 -0
  26. data/lib/db_sucker/application/dispatch.rb +364 -0
  27. data/lib/db_sucker/application/evented_resultset.rb +149 -0
  28. data/lib/db_sucker/application/fake_channel.rb +22 -0
  29. data/lib/db_sucker/application/output_helper.rb +197 -0
  30. data/lib/db_sucker/application/sklaven_treiber/log_spool.rb +57 -0
  31. data/lib/db_sucker/application/sklaven_treiber/worker/accessors.rb +105 -0
  32. data/lib/db_sucker/application/sklaven_treiber/worker/core.rb +168 -0
  33. data/lib/db_sucker/application/sklaven_treiber/worker/helpers.rb +144 -0
  34. data/lib/db_sucker/application/sklaven_treiber/worker/io/base.rb +240 -0
  35. data/lib/db_sucker/application/sklaven_treiber/worker/io/file_copy.rb +81 -0
  36. data/lib/db_sucker/application/sklaven_treiber/worker/io/file_gunzip.rb +58 -0
  37. data/lib/db_sucker/application/sklaven_treiber/worker/io/file_import_sql.rb +80 -0
  38. data/lib/db_sucker/application/sklaven_treiber/worker/io/file_shasum.rb +49 -0
  39. data/lib/db_sucker/application/sklaven_treiber/worker/io/pv_wrapper.rb +73 -0
  40. data/lib/db_sucker/application/sklaven_treiber/worker/io/sftp_download.rb +57 -0
  41. data/lib/db_sucker/application/sklaven_treiber/worker/io/throughput.rb +219 -0
  42. data/lib/db_sucker/application/sklaven_treiber/worker/routines.rb +313 -0
  43. data/lib/db_sucker/application/sklaven_treiber/worker.rb +48 -0
  44. data/lib/db_sucker/application/sklaven_treiber.rb +281 -0
  45. data/lib/db_sucker/application/slot_pool.rb +137 -0
  46. data/lib/db_sucker/application/tie.rb +25 -0
  47. data/lib/db_sucker/application/window/core.rb +185 -0
  48. data/lib/db_sucker/application/window/dialog.rb +142 -0
  49. data/lib/db_sucker/application/window/keypad/core.rb +85 -0
  50. data/lib/db_sucker/application/window/keypad.rb +174 -0
  51. data/lib/db_sucker/application/window/prompt.rb +124 -0
  52. data/lib/db_sucker/application/window.rb +329 -0
  53. data/lib/db_sucker/application.rb +168 -0
  54. data/lib/db_sucker/patches/beta-warning.rb +374 -0
  55. data/lib/db_sucker/patches/developer.rb +29 -0
  56. data/lib/db_sucker/patches/net-sftp.rb +20 -0
  57. data/lib/db_sucker/patches/thread-count.rb +30 -0
  58. data/lib/db_sucker/version.rb +4 -0
  59. data/lib/db_sucker.rb +81 -0
  60. metadata +217 -0
@@ -0,0 +1,374 @@
1
+ module DbSucker
2
+ module Patches
3
+ class BetaWarning < Application::Tie
4
+ AcceptedContinue = Class.new(::StandardError)
5
+
6
+ def self.hook!(app)
7
+ app.send(:extend, DispatchOverrides)
8
+ end
9
+
10
+ module WindowExtensions
11
+ def _view_beta_warning
12
+ # render monkey
13
+ current_frame = monkey_frames[@tick % 16 / 2]
14
+
15
+ cyan " " << " || ||".ljust(33, " ")
16
+ current_frame.each do |line|
17
+ y = true
18
+ yellow " "
19
+ line.split(/(�[^�]+�)/).each do |m|
20
+ send(y ? :cyan : :green, m.tr("�", ""))
21
+ y = !y
22
+ end
23
+
24
+ next_line
25
+ break if @line > lines - 1
26
+ end
27
+ (lines - @line).times do |i|
28
+ inset = i % 3 == 0 ? "======" : " "
29
+ cyan " " << " ||#{inset}||".ljust(33, " ")
30
+ next_line
31
+ end
32
+
33
+ # render text
34
+ @line = -1
35
+ self.x_offset = 24
36
+
37
+ font_frame.each do |line|
38
+ red line.ljust(30, " ")
39
+ next_line
40
+ end
41
+
42
+ self.x_offset = 37
43
+ next_line
44
+
45
+ dialog! do |d|
46
+ d.border_color = :gray
47
+ d.line "DbSucker v3 is a complete rewrite and has few testers.", :blue
48
+ d.line "If you encounter issues, have suggestions or want to", :blue
49
+ d.line "add support for other DBMS please let me know on Github!", :blue
50
+ d.br
51
+ d.line "https://github.com/2called-chaos/db_sucker", :cyan
52
+ d.hr
53
+ d.line "I swear that I have backups before testing this tool and", :red
54
+ d.line "that I won't beat the cute monkey if something goes south", :red
55
+ d.br
56
+ d.button_group(5) do |g|
57
+ g << d.build_button("ABORT (n/f/0/q/ESC)", :yellow)
58
+ g << d.build_button("ACCEPT & CONTINUE (y/t/1)", :green)
59
+ end
60
+ end
61
+
62
+ if lines < 27 || cols < 98
63
+ setpos(0, 0)
64
+ red "INCREASE WINDOW SIZE!"
65
+ end
66
+ end
67
+
68
+ def frames
69
+ @frames ||= File.read(__FILE__).split("__END__").last.split("-----").map{|frame| frame.split("\n") }
70
+ end
71
+
72
+ def font_frame
73
+ frames[0]
74
+ end
75
+
76
+ def monkey_frames
77
+ frames[1..-1]
78
+ end
79
+ end
80
+
81
+ module DispatchOverrides
82
+ def _suck_variation identifier, ctn, variation, var
83
+ touch_file = "#{core_cfg_path}/.beta-warning"
84
+ return super if File.exist?(touch_file)
85
+
86
+ begin
87
+ _thr = Thread.current
88
+ begin
89
+ trap_signals
90
+ @sklaventreiber = Application::SklavenTreiber.new(self, uniqid)
91
+ @sklaventreiber.spooled do
92
+ begin
93
+ @sklaventreiber._init_window
94
+ @sklaventreiber.window.force_kill = true
95
+ @sklaventreiber.window.send(:extend, WindowExtensions)
96
+
97
+ view_was = @sklaventreiber.window.change_view(:beta_warning)
98
+ @sklaventreiber.window.keypad.prompt!("[press any key to return]",
99
+ return_on_buffer: Proc.new{|b, c| %w[y t 1 n f 0 q 27].include?(c.to_s.downcase) },
100
+ capture_enter: false,
101
+ has_cursor: false,
102
+ capture_escape: false,
103
+ cursor_visible: false
104
+ ) do |response|
105
+ if %w[y t 1].include?(response)
106
+ FileUtils.mkdir_p(File.dirname(touch_file))
107
+ FileUtils.touch(touch_file)
108
+ _thr.raise(AcceptedContinue)
109
+ else
110
+ $core_runtime_exiting = 1
111
+ end
112
+ end
113
+
114
+ loop do
115
+ break if $core_runtime_exiting
116
+ sleep 0.1
117
+ end
118
+ ensure
119
+ sandboxed { @sklaventreiber.window.try(:stop) }
120
+ end
121
+ end
122
+ ensure
123
+ release_signals
124
+ end
125
+
126
+ throw :dispatch_handled
127
+ rescue AcceptedContinue
128
+ super
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ __END__
137
+ ____ ______ _______ _
138
+ | _ \| ____|__ __|/\ | |
139
+ | |_) | |__ | | / \ | |
140
+ | _ <| __| | | / /\ \ | |
141
+ | |_) | |____ | |/ ____ \|_|
142
+ |____/|______| |_/_/ \_(_)
143
+ -----
144
+ || ||
145
+ ||======||
146
+ || ||
147
+ ||�___� ||
148
+ ||�\_`\�==||
149
+ |�(`__/� ||
150
+ || �\ \ :-"""-.�
151
+ ||=�| \/-=-.,` \ ,,,,�
152
+ || �\(|o o /`,|) _/,,,/�
153
+ || �\/ " \`,_) (_` ,/�
154
+ ||====�\ U /_/ /, /�
155
+ || �/`--'`-`-,,,,,/` /�
156
+ || �( ` ______/�
157
+ ||===�(`_/\_` ) /�
158
+ || �| |�
159
+ || �\' " " /�
160
+ |�'````` "''_ /\�
161
+ �/ _____,( \\\�
162
+ �/ / �||�\ \\\�
163
+ �,`-/�======||� , ) ||�
164
+ �/ '_) �||�/ / //�
165
+ �/ /�|| |�/ / ||�
166
+ �\_/ �||======�(_` \ \\ ,-.�
167
+ || ||�\ \ \`-'/�
168
+ || ||� \_| `"`�
169
+ ||======||
170
+ || ||
171
+ || ||
172
+ -----
173
+ || ||
174
+ ||======||
175
+ || ||
176
+ ||�___� ||
177
+ ||�\_`\�==||
178
+ |�(`__/� ||
179
+ || �\ \ :-"""-.�
180
+ ||=�| \/-=-.,` \ ,,,,�
181
+ || �\(|o o /`,|) |,,,|�
182
+ || �\/ " \`,_) (_` ,|�
183
+ ||====�\ U /_/ |,|�
184
+ || �/`--'`-`-,,,,,|`|�
185
+ || �( ` ______/�
186
+ ||===�(`_/\_` ) /�
187
+ || �| |�
188
+ || �\' " " /�
189
+ |�'````` "''_ /;�
190
+ �/ _____,( \ \\�
191
+ �/ /� ||�\ \ \\�
192
+ �,`-/�======||� , ) ||�
193
+ �/ '_)� ||�/ / //�
194
+ �/ /�|| |�/ / ||�
195
+ �\_/� ||======�(_` \ || ,�
196
+ || ||�\ \ \\_//�
197
+ || ||� \_| \-/�
198
+ ||======||
199
+ || ||
200
+ || ||
201
+ -----
202
+ || ||
203
+ ||======||
204
+ || ||
205
+ ||�___� ||
206
+ ||�\_`\�==||
207
+ |�(`__/� ||
208
+ || �\ \ :-"""-.�
209
+ ||=�| \/-=-.,` \,,,,�
210
+ || �\(|o o /`,|\,,,\�
211
+ || �\/ " \`,_(_` ,\�
212
+ ||====�\ U /_/ \, \�
213
+ || �/`--'`-`-,,,,,\` |�
214
+ || �( ` ______/�
215
+ ||===�(`_/\_` ) /�
216
+ || �| |�
217
+ || �\' " " /�
218
+ |�'````` "''_ /;�
219
+ �/ _____,( \ \\�
220
+ �/ /� ||�\ \ \\�
221
+ �,`-/�======||� , ) \\�
222
+ �/ '_)� ||�/ / ||�
223
+ �/ /�|| |�/ / ||�
224
+ �\_/� ||======�(_` \ ||�
225
+ || ||�\ \ \\,,,,�
226
+ || ||� \_| \----'�
227
+ ||======||
228
+ || ||
229
+ || ||
230
+ -----
231
+ || ||
232
+ ||======||
233
+ || ||
234
+ ||�___� ||
235
+ ||�\_`\�==||
236
+ |�(`__/� ||
237
+ || �\ \ :-"""-.�
238
+ ||=�| \/-=-.,` \ ,,,,�
239
+ || �\(|o o /`,|) |,,,|�
240
+ || �\/ " \`,_) (_` ,|�
241
+ ||====�\ U /_/ |,|�
242
+ || �/`--'`-`-,,,,,|`|�
243
+ || �( ` ______/�
244
+ ||===�(`_/\_` ) /�
245
+ || �| |�
246
+ || �\' " " /�
247
+ |�'````` "''_ /\�
248
+ �/ _____,( \\\�
249
+ �/ /� ||�\ \\\�
250
+ �,`-/�======||� , ) ||�
251
+ �/ '_)� ||�/ / //�
252
+ �/ /�|| |�/ / ||�
253
+ �\_/� ||======�(_` \ \\�
254
+ || ||�\ \ \\�
255
+ || || �\_| \\�
256
+ ||======|| �\\,,�
257
+ || || �\-'�
258
+ || ||
259
+ -----
260
+ || ||
261
+ ||======||
262
+ || ||
263
+ ||�___� ||
264
+ ||�\_`\�==||
265
+ |�(`__/� ||
266
+ || �\ \ :-"""-.�
267
+ ||=�| \/-=-.,` \ ,,,,�
268
+ || �\(|o o /`,|) _/,,,/�
269
+ || �\/ " \`,_) (_` ,/�
270
+ ||====�\ U /_/ /, /�
271
+ || �/`--'`-`-,,,,,/` /�
272
+ || �( ` ______/�
273
+ ||===�(`_/\_` ) /�
274
+ || �| |�
275
+ || �\' " " /�
276
+ |�'````` "''_ /\�
277
+ �/ _____,( \\\�
278
+ �/ /� ||�\ \\\�
279
+ �,`-/�======||� , ) ||�
280
+ �/ '_)� ||�/ / //�
281
+ �/ /�|| |�/ / ||�
282
+ �\_/� ||======�(_` \ \\ ,-.�
283
+ || ||�\ \ \`-'/�
284
+ || || �\_| `"`�
285
+ ||======||
286
+ || ||
287
+ || ||
288
+ -----
289
+ || ||
290
+ ||======||
291
+ || ||
292
+ ||�___� ||
293
+ ||�\_`\�==||
294
+ |�(`__/� ||
295
+ || �\ \ :-"""-.�
296
+ ||=�| \/-=-.,` \ ,,,,�
297
+ || �\(|o o /`,|) |,,,|�
298
+ || �\/ " \`,_) (_` ,|�
299
+ ||====�\ U /_/ |,|�
300
+ || �/`--'`-`-,,,,,|`|�
301
+ || �( ` ______/�
302
+ ||===�(`_/\_` ) /�
303
+ || �| |�
304
+ || �\' " " /�
305
+ |�'````` "''_ /;�
306
+ �/ _____,( \ \\�
307
+ �/ /� ||�\ \ \\�
308
+ �,`-/�======|| �, ) ||�
309
+ �/ '_)� ||�/ / //�
310
+ �/ /�|| |�/ / ||�
311
+ �\_/� ||======�(_` \ || ,�
312
+ || ||�\ \ \\_//�
313
+ || || �\_| \-/�
314
+ ||======||
315
+ || ||
316
+ || ||
317
+ -----
318
+ || ||
319
+ ||======||
320
+ || ||
321
+ ||�___� ||
322
+ ||�\_`\�==||
323
+ |�(`__/� ||
324
+ || �\ \ :-"""-.�
325
+ ||=�| \/-=-.,` \,,,,�
326
+ || �\(|- - /`,|\,,,\�
327
+ || �\/ " \`,_(_` ,\�
328
+ ||====�\ U /_/ \, \�
329
+ || �/`--'`-`-,,,,,\` |�
330
+ || �( ` ______/�
331
+ ||===�(`_/\_` ) /�
332
+ || �| |�
333
+ || �\' " " /�
334
+ |�'````` "''_ /;�
335
+ �/ _____,( \ \\�
336
+ �/ /� ||�\ \ \\�
337
+ �,`-/�======|| �, ) \\�
338
+ �/ '_)� ||�/ / ||�
339
+ �/ /�|| |�/ / ||�
340
+ �\_/� ||======�(_` \ ||�
341
+ || ||�\ \ \\,,,,�
342
+ || || �\_| \----'�
343
+ ||======||
344
+ || ||
345
+ || ||
346
+ -----
347
+ || ||
348
+ ||======||
349
+ || ||
350
+ ||�___� ||
351
+ ||�\_`\�==||
352
+ |�(`__/� ||
353
+ || �\ \ :-"""-.�
354
+ ||=�| \/-=-.,` \ ,,,,�
355
+ || �\(|o o /`,|) |,,,|�
356
+ || �\/ " \`,_) (_` ,|�
357
+ ||====�\ U /_/ |,|�
358
+ || �/`--'`-`-,,,,,|`|�
359
+ || �( ` ______/�
360
+ ||===�(`_/\_` ) /�
361
+ || �| |�
362
+ || �\' " " /�
363
+ |�'````` "''_ /\�
364
+ �/ _____,( \\\�
365
+ �/ /� ||�\ \\\�
366
+ �,`-/�======|| �, ) ||�
367
+ �/ '_)� ||�/ / //�
368
+ �/ /�|| |�/ / ||�
369
+ �\_/� ||======�(_` \ \\�
370
+ || ||�\ \ \\�
371
+ || || �\_| \\�
372
+ ||======|| �\\,,�
373
+ || || �\-'�
374
+ || ||
@@ -0,0 +1,29 @@
1
+ # Add event listeners to inject some debug information.
2
+ # This is for developing or debugging.
3
+
4
+ module DbSucker
5
+ module Patches
6
+ class Developer < Application::Tie
7
+ def self.hook!(app)
8
+ app.hook :core_shutdown do
9
+ if app.sklaventreiber
10
+ iostats = app.sklaventreiber.throughput.stats.sort_by{|k,v|k}.map do |k, v|
11
+ %{:#{k}=>#{v}(#{app.human_bytes(v)})}
12
+ end
13
+ app.debug "IO-stats: {#{iostats * ", "}}"
14
+ end
15
+ app.dump_core if Thread.list.length > 1
16
+ app.debug "RSS: #{app.human_bytes(`ps h -p #{Process.pid} -o rss`.strip.split("\n").last.to_i * 1024)}"
17
+ end
18
+
19
+ app.hook :worker_routine_before do |_, worker, routine|
20
+ app.debug "RSS-before-#{worker.table}-#{routine}: #{app.human_bytes(`ps h -p #{Process.pid} -o rss`.strip.split("\n").last.to_i * 1024)}"
21
+ end
22
+
23
+ app.hook :worker_routine_after do |_, worker, routine|
24
+ app.debug "RSS-after-#{worker.table}-#{routine}: #{app.human_bytes(`ps h -p #{Process.pid} -o rss`.strip.split("\n").last.to_i * 1024)}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ # Monkeypatch™ Net::SFTP download to stop current file if requested to do so
2
+
3
+ module DbSucker
4
+ module Patches
5
+ module SftpStopDownload
6
+ def on_read response
7
+ if !active?
8
+ response.instance_eval do
9
+ def eof?
10
+ true
11
+ end
12
+ end
13
+ end
14
+ super(response)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ Net::SFTP::Operations::Download.prepend(DbSucker::Patches::SftpStopDownload)
@@ -0,0 +1,30 @@
1
+ # Monkeypatch™ Thread class to count threads being created.
2
+ # This is for developing but you can see the amount if debug is enabled.
3
+
4
+ module DbSucker
5
+ module Patches
6
+ class ThreadCounter < Application::Tie
7
+ def self.hook!(app)
8
+ $thread_count = 0
9
+ $thread_count_monitor = Monitor.new
10
+
11
+ ::Thread.class_eval do
12
+ class << self
13
+ def new_with_counter *a, &b
14
+ $thread_count_monitor.synchronize { $thread_count += 1 }
15
+ new_without_counter(*a, &b)
16
+ end
17
+ alias_method :new_without_counter, :new
18
+ alias_method :new, :new_with_counter
19
+ end
20
+ end
21
+
22
+ app.hook :core_shutdown do
23
+ app.debug "#{$thread_count} threads spawned"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # [DEBUG] 13 threads spawned
@@ -0,0 +1,4 @@
1
+ module DbSucker
2
+ VERSION = "3.0.0"
3
+ UPDATE_URL = "https://raw.githubusercontent.com/2called-chaos/db_sucker/master/VERSION"
4
+ end
data/lib/db_sucker.rb ADDED
@@ -0,0 +1,81 @@
1
+ module DbSucker
2
+ ROOT = File.expand_path("../..", __FILE__)
3
+ end
4
+
5
+ # stdlib
6
+ require "benchmark"
7
+ require "optparse"
8
+ require "fileutils"
9
+ require "thread"
10
+ require "monitor"
11
+ require "pathname"
12
+ require "yaml"
13
+ require "ostruct"
14
+ require "optparse"
15
+ require "securerandom"
16
+ require "open3"
17
+ require "shellwords"
18
+ require "net/http"
19
+
20
+ # 3rd party
21
+ require "curses"
22
+ require "active_support"
23
+ require "active_support/core_ext"
24
+ require "active_support/time_with_zone"
25
+ require "net/ssh"
26
+ require "net/sftp"
27
+
28
+ # application
29
+ require "db_sucker/version"
30
+ require "db_sucker/application/tie"
31
+ require "db_sucker/application/output_helper"
32
+ require "db_sucker/application/sklaven_treiber/log_spool"
33
+ require "db_sucker/application/sklaven_treiber/worker/io/base"
34
+ require "db_sucker/application/sklaven_treiber/worker/io/throughput"
35
+ require "db_sucker/application/sklaven_treiber/worker/io/sftp_download"
36
+ require "db_sucker/application/sklaven_treiber/worker/io/file_copy"
37
+ require "db_sucker/application/sklaven_treiber/worker/io/file_gunzip"
38
+ require "db_sucker/application/sklaven_treiber/worker/io/file_shasum"
39
+ require "db_sucker/application/sklaven_treiber/worker/io/file_import_sql"
40
+ require "db_sucker/application/sklaven_treiber/worker/io/pv_wrapper"
41
+ require "db_sucker/application/sklaven_treiber/worker/core"
42
+ require "db_sucker/application/sklaven_treiber/worker/accessors"
43
+ require "db_sucker/application/sklaven_treiber/worker/helpers"
44
+ require "db_sucker/application/sklaven_treiber/worker/routines"
45
+ require "db_sucker/application/sklaven_treiber/worker"
46
+ require "db_sucker/application/sklaven_treiber"
47
+ require "db_sucker/application/window/core"
48
+ require "db_sucker/application/window/keypad/core"
49
+ require "db_sucker/application/window/keypad"
50
+ require "db_sucker/application/window/prompt"
51
+ require "db_sucker/application/window/dialog"
52
+ require "db_sucker/application/window"
53
+ require "db_sucker/application/container/accessors"
54
+ require "db_sucker/application/container/validations"
55
+ require "db_sucker/application/container/variation/accessors"
56
+ require "db_sucker/application/container/variation/helpers"
57
+ require "db_sucker/application/container/variation/worker_api"
58
+ require "db_sucker/application/container/variation"
59
+ require "db_sucker/application/container/ssh"
60
+ require "db_sucker/application/container"
61
+ require "db_sucker/application/container_collection"
62
+ require "db_sucker/application/dispatch"
63
+ require "db_sucker/application/colorize"
64
+ require "db_sucker/application/slot_pool"
65
+ require "db_sucker/application/evented_resultset"
66
+ require "db_sucker/application/fake_channel"
67
+ require "db_sucker/application/core"
68
+ require "db_sucker/application"
69
+
70
+ # adapters
71
+ require "db_sucker/adapters/mysql2"
72
+
73
+ # patches
74
+ require "db_sucker/patches/net-sftp"
75
+ require "db_sucker/patches/beta-warning"
76
+ if ENV["DBS_DEVELOPER"] && ENV["DBS_DEVELOPER"] != "false"
77
+ require "pry"
78
+ require "pry-remote"
79
+ require "db_sucker/patches/developer"
80
+ require "db_sucker/patches/thread-count"
81
+ end