sqlconv 0.9.2 → 1.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.
- checksums.yaml +4 -4
- data/bin/sqlconv +51 -38
- data/sqlconv.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 953b48afedc6e52ef6430f3d1bc1b66d6d652dfdc33c494b5950a961f157b6ec
|
4
|
+
data.tar.gz: 6d6d791ba8c0611245143d0198a9ef8a2be00f84e2b5faf1d01c16a3426826e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a9cfa9b993be6d3ffbeadd9deef4e6c5af05933a1d680e0e4975a335530d11029066f7b26cd76d7e2466bc809d16a15f98164fc60664ec86dab67f423d0184f
|
7
|
+
data.tar.gz: 2cbe842f8898108c0b627151f6ae5014df61b5d6ea5f3d31300f11067563739bd96520cfec746d670e4951a7d0e7ee38ba55c7aed99a110e1deec4048d8d02c7
|
data/bin/sqlconv
CHANGED
@@ -61,10 +61,31 @@ def grok(want)
|
|
61
61
|
end or raise "invalid selector '#{want}'"
|
62
62
|
end
|
63
63
|
|
64
|
+
# display table output
|
65
|
+
def table(cols, rows)
|
66
|
+
cols.is_a?(Array) && cols.size > 0 or return
|
67
|
+
rows.is_a?(Array) && rows.size > 0 or return
|
68
|
+
join = " | "
|
69
|
+
both = [cols] + rows
|
70
|
+
flip = both.transpose
|
71
|
+
wide = flip.map {|row| row.map {|col| col.to_s.size }.max }
|
72
|
+
pict = wide.map {|len| "%-#{len}.#{len}s" }.join(join)
|
73
|
+
pict = [join, pict, join].join.strip
|
74
|
+
line = (pict % ([""] * cols.size)).tr("| ", "+-")
|
75
|
+
seen = -1
|
76
|
+
puts "", line
|
77
|
+
both.each do |vals|
|
78
|
+
puts pict % vals
|
79
|
+
puts line if (seen += 1) == 0
|
80
|
+
end
|
81
|
+
puts line, "#{seen} rows displayed", ""
|
82
|
+
end
|
83
|
+
|
64
84
|
# convert the insert statements
|
65
85
|
def conv(tab1, map1, tab2, map2, mode, dump)
|
66
86
|
data = StringScanner.new("")
|
67
87
|
need = grok(map1)
|
88
|
+
rows = nil
|
68
89
|
cols = nil
|
69
90
|
len1 = nil
|
70
91
|
len2 = nil
|
@@ -86,6 +107,8 @@ def conv(tab1, map1, tab2, map2, mode, dump)
|
|
86
107
|
# if needed, output pipes header
|
87
108
|
if mode == "pipes" && map2
|
88
109
|
puts map2.gsub(',','|')
|
110
|
+
elsif mode == "table"
|
111
|
+
rows = []
|
89
112
|
end
|
90
113
|
|
91
114
|
# process each line
|
@@ -109,7 +132,7 @@ def conv(tab1, map1, tab2, map2, mode, dump)
|
|
109
132
|
puts sep, "| col | %-*.*s |" % [max, max, 'data'], sep
|
110
133
|
len1.times do |pos|
|
111
134
|
val = cols[pos]
|
112
|
-
val[max-3
|
135
|
+
val[max-3..-1] = '...' if val.size > max
|
113
136
|
puts "| %3d | %-*.*s | " % [pos + 1, max, max, val]
|
114
137
|
end
|
115
138
|
puts sep
|
@@ -171,21 +194,31 @@ def conv(tab1, map1, tab2, map2, mode, dump)
|
|
171
194
|
cols or exit
|
172
195
|
end
|
173
196
|
|
174
|
-
# output
|
175
|
-
if mode == "pipes"
|
197
|
+
# generate output
|
198
|
+
if mode == "pipes" || mode == "table"
|
176
199
|
ours.map! {|e| e == 'NULL' ? '' : e !~ /\A['"]/ ? e : e[1..-2].gsub("|","~").gsub("''", "'")}
|
200
|
+
end
|
201
|
+
if mode == "pipes"
|
177
202
|
puts ours * "|"
|
203
|
+
elsif mode == "table"
|
204
|
+
rows << ours.dup
|
178
205
|
else
|
179
206
|
puts [pref, ours * ",", ");"].join
|
180
207
|
end
|
181
208
|
end
|
209
|
+
|
210
|
+
# output table
|
211
|
+
if mode == "table"
|
212
|
+
cols = map2 ? map2.split(',') : rows[0].size.times.map {|i| "col#{i+1}"}
|
213
|
+
table cols, rows
|
214
|
+
end
|
182
215
|
end
|
183
216
|
|
184
217
|
# ==[ invoke the cli ]==
|
185
218
|
|
186
219
|
argv = -1
|
187
220
|
ARGV.size.times do
|
188
|
-
if ARGV[argv += 1] == "-
|
221
|
+
if ARGV[argv += 1] == "-x"
|
189
222
|
begin
|
190
223
|
require plugin = ARGV[argv += 1]
|
191
224
|
rescue LoadError
|
@@ -195,15 +228,11 @@ ARGV.size.times do
|
|
195
228
|
end
|
196
229
|
end
|
197
230
|
|
198
|
-
|
199
|
-
|
200
|
-
elsif ARGV.delete "
|
201
|
-
|
202
|
-
end
|
203
|
-
|
204
|
-
if ARGV.delete "-s"
|
205
|
-
mode = "show"
|
206
|
-
end
|
231
|
+
# mutually exclusive options
|
232
|
+
if ARGV.delete "-s" then mode = "show"
|
233
|
+
elsif ARGV.delete "-r" then mode = "replace"
|
234
|
+
elsif ARGV.delete "-p" then mode = "pipes"
|
235
|
+
elsif ARGV.delete "-t" then mode = "table"; end
|
207
236
|
|
208
237
|
if ARGV.shift =~ /^([a-z][-\w]*):?(.+)?$/
|
209
238
|
tab1 = $1
|
@@ -219,30 +248,14 @@ if ARGV.size > 0 and !File.exists?(ARGV.first)
|
|
219
248
|
end
|
220
249
|
|
221
250
|
tab1 or die [
|
222
|
-
"Usage: #{File.basename $0}"
|
223
|
-
"
|
224
|
-
"[
|
225
|
-
"
|
226
|
-
"
|
227
|
-
"
|
228
|
-
"
|
229
|
-
|
251
|
+
"Usage: #{File.basename $0} <options> " +
|
252
|
+
"<src_table>(:[sel1,sel2,...]) " +
|
253
|
+
"[dst_table][:][col1,col2,...] file",
|
254
|
+
" -p (output pipe separated values instead of SQL",
|
255
|
+
" -r (use 'replace into' instead of 'insert into')",
|
256
|
+
" -s (show column indexes and values for the first row)",
|
257
|
+
" -t (display output as a formatted table)",
|
258
|
+
" -x <plugin1.rb> [-x <plugin2.rb>]...]",
|
259
|
+
] * "\n"
|
230
260
|
|
231
261
|
conv tab1, map1, tab2 || tab1, map2, mode, ARGF
|
232
|
-
|
233
|
-
__END__
|
234
|
-
|
235
|
-
# show opt parsing
|
236
|
-
p [:tab1, tab1]
|
237
|
-
p [:map1, map1]
|
238
|
-
p [:tab2, tab2]
|
239
|
-
p [:map2, map2]
|
240
|
-
p [:argv, ARGV]
|
241
|
-
exit
|
242
|
-
|
243
|
-
# values for testing
|
244
|
-
tab1 = 'adonis_schema'
|
245
|
-
map1 = nil
|
246
|
-
tab2 = nil
|
247
|
-
map2 = nil
|
248
|
-
ARGV.push 'db1.sql'
|
data/sqlconv.gemspec
CHANGED