db_sucker 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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