slyce 1.3.2 → 1.3.4

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/slyce +35 -31
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d593f1fb756c6af9643dfa496027cb39cd85451f351d3dd2541cbfa340b1c7b3
4
- data.tar.gz: 13753300c5bbebb1b40998bc1cb1c9397b0a2c9ab2691fb9a21f0de1252c3b68
3
+ metadata.gz: 9e63de054e38ac6dd6b847b8aec37b750955c285c710bf8cc713c61c3e309b78
4
+ data.tar.gz: 6a1222e3f162739c198eb83084a6b73688a6acface1d094477884da68f797e6c
5
5
  SHA512:
6
- metadata.gz: d11b2bad746f523480a8bdcc8659f64e381e63803cabfe4311741f3fe7f40129bfcd65dc1374ef77842c3f4bb2896d4280c2eb4697e1ff66a8c6f04f45d78657
7
- data.tar.gz: 8da310dc995ca7b73439081666e9e6c62bc56fb9be8e06f8076976ee624923058a2f867f8a326a13c0e76c99391677d670f70cc482117fcc71b634812e5780d2
6
+ metadata.gz: 176b6aa4493b0e10a0a122d414e2924fe764b18016076b1bb0ecf95127cc4927fc8fc946e878232ab5e4e634a054e095f36fa0467bae6381ee7197c12b8e64a2
7
+ data.tar.gz: 24732fe38c896f45b6322594af7c55ed3c55e863029ba65146157bf4196e009c032d5d94e8dc68aacdfd19040fbec15b6979516ef1421b4924c7c887708c393c
data/bin/slyce CHANGED
@@ -11,7 +11,7 @@ dbas = nil
11
11
  tabl = nil
12
12
 
13
13
  OptionParser.new.instance_eval do
14
- @version = "1.3.2"
14
+ @version = "1.3.4"
15
15
  @banner = "usage: #{program_name} [options] <database> <table>"
16
16
 
17
17
  on "--csv" , "Output comma separated values"
@@ -19,7 +19,7 @@ OptionParser.new.instance_eval do
19
19
  on "--tsv" , "Output tab separated values"
20
20
  on "-a", "--ascii" , "Convert data to ASCII using AnyAscii"
21
21
  on "-c", "--columns" , "Display column names and quit"
22
- on "-d", "--dump" , "Display table schema and quit"
22
+ on "-d", "--dump" , "Dump database schema and quit"
23
23
  on "-h", "--help" , "Show help and command usage" do Kernel.abort to_s; end
24
24
  on "-n", "--natural" , "Sort naturally, not numerically"
25
25
  on "-r", "--rows <count>" , "Rows of data to show", Integer
@@ -27,7 +27,7 @@ OptionParser.new.instance_eval do
27
27
  on "-t", "--tables" , "Display table names and quit"
28
28
  on "-v", "--version" , "Show version number" do Kernel.abort "#{program_name} #{@version}"; end
29
29
  on "-w", "--where <cond>" , "Where clause (eg - 'age>50 and state='AZ')"
30
- on "-x", "--extract <a,b,c...>" , "Comma separated list of columns (or tables) to extract"
30
+ on "-x", "--extract <a,b,c...>" , "Comma separated list of columns or tables to extract"
31
31
 
32
32
  self
33
33
  end.parse!(into: opts={}) rescue abort($!.message)
@@ -38,11 +38,12 @@ xtsv = opts[:tsv]
38
38
  xprt = xcsv || xpsv || xtsv and require "censive"
39
39
 
40
40
  asky = opts[:ascii ] and require "any_ascii"
41
- filt = opts[:where ] and filt = "where\n #{filt}"
42
- hide = opts[:suppress]
41
+ dump = opts[:dump]
42
+ want = opts[:extract ].to_s.downcase.split(",")
43
43
  natu = opts[:natural ]
44
44
  show = opts[:rows ]
45
- want = opts[:extract].to_s.downcase.split(",")
45
+ hide = opts[:suppress]
46
+ filt = opts[:where ] and filt = "\nwhere\n #{filt}"
46
47
 
47
48
  dbas ||= ARGV.shift or abort "no database given"
48
49
  tabl ||= ARGV.shift or opts[:tables] or !want.empty? or abort "no table given"
@@ -78,7 +79,9 @@ end
78
79
  # ==[ Let 'er rip! ]==
79
80
 
80
81
  # get database connection
81
- if dbas.include?("/")
82
+ if !dbas.include?("/")
83
+ conf = { database: dbas }
84
+ else
82
85
  dbas = $' if dbas =~ %r|^mysql://| # drop mysql:// prefix, if present
83
86
  auth, dbas = dbas.split("/", 2)
84
87
  if auth =~ /^(?:(\w+)(?::([^@]+))?@)?(?:([^:]+)?(?::(\d+))?)$/
@@ -93,20 +96,21 @@ if dbas.include?("/")
93
96
  else
94
97
  abort "invalid database value #{dbas.inspect}"
95
98
  end
96
- else
97
- conf = { database: dbas }
98
99
  end
99
100
 
101
+ # connect to database and get server version
100
102
  conn = Mysql2::Client.new(**conf, as: :array)
103
+ ver5 = conn.server_info[:version] =~ /^5/
104
+
105
+ # dump database schema or show table names
106
+ if tabl.nil? || opts[:tables] || opts[:dump]
101
107
 
102
- # get table names
103
- if tabl.nil? || opts[:dump] || opts[:tables]
108
+ # get table names
104
109
  resu = conn.sql("show tables")
105
110
  tbls = resu.to_a.flatten
106
- want = (want.empty? || opts[:tables]) ? tbls : want.select {|e| tbls.include?(e) }
107
-
108
- #!# FIXME: this code is a mess... cleanup soon
111
+ want = (want.empty? || opts[:tables] || opts[:dump]) ? tbls : want.select {|e| tbls.include?(e) }
109
112
 
113
+ # dump database schema
110
114
  if opts[:dump]
111
115
  pict = "%Y-%m-%dT%H:%M:%S%z"
112
116
  puts "-- Dump of `#{dbas}` database on #{Time.now.strftime(pict)}\n\n"
@@ -125,6 +129,7 @@ if tabl.nil? || opts[:dump] || opts[:tables]
125
129
  exit
126
130
  end
127
131
 
132
+ # show table names
128
133
  puts want
129
134
  exit
130
135
  end
@@ -151,8 +156,7 @@ if xprt
151
156
  select
152
157
  #{list}
153
158
  from
154
- `#{tabl}`
155
- #{filt}
159
+ `#{tabl}`#{filt}
156
160
 
157
161
  seps = xcsv ? "," : xtsv ? "\t" : xpsv ? "|" : abort("unknown separator #{seps.inspect}")
158
162
 
@@ -166,36 +170,36 @@ if xprt
166
170
  exit
167
171
  end
168
172
 
169
- # MySQL 5.7 compatible version (still need to find replacement for regexp_instr)
170
- # -if((`#{name}` rlike '^[-+]?((0|([1-9]\\\\d*)(\\\\.\\\\d*)?)|((0|([1-9]\\\\d*))\\\\.\\\\d+))$'), `#{name}` + 0, null) desc,
171
- # -if((`#{name}` rlike '^0\\\\d+$'), length(`#{name}`), null) desc,
172
- # -if((`#{name}` rlike '^\\\\d'), regexp_instr(`#{name}`, '[^\\\\d]'), null) desc,
173
-
174
173
  want.each do |name|
175
174
  sort = natu ? "" : "cnt desc,"
176
- stmt = show ? "limit #{show}" : ""
177
- data = conn.sql(<<~"" + stmt).to_a
175
+ like =(ver5 ? <<~"" : <<~"").gsub(/(.)^/m, '\1 ').rstrip
176
+ -if((`#{name}` rlike '^[-+]?((0|([1-9][0-9]*)(\\\\.[0-9]*)?)|((0|([1-9][0-9]*))\\\\.[0-9]+))$'), `#{name}` + 0, null) desc,
177
+ -if((`#{name}` rlike '^0[0-9]+$'), length(`#{name}`), null) desc,
178
+ -if((`#{name}` rlike '^[0-9]'), length(concat("1", `#{name}`) + 0), null) desc,
179
+
180
+ -if(regexp_like(`#{name}`, '^[-+]?((0|([1-9]\\\\d*)(\\\\.\\\\d*)?)|((0|([1-9]\\\\d*))\\\\.\\\\d+))$'), `#{name}` + 0, null) desc,
181
+ -if(regexp_like(`#{name}`, '^0\\\\d+$'), length(`#{name}`), null) desc,
182
+ -if(regexp_like(`#{name}`, '^\\\\d'), regexp_instr(`#{name}`, '[^\\\\d]'), null) desc,
183
+
184
+ data = conn.sql(<<~"".rstrip).to_a
178
185
  select
179
186
  count(*) as cnt,
180
187
  `#{name}` as val
181
188
  from
182
- `#{tabl}`
183
- #{filt}
189
+ `#{tabl}`#{filt}
184
190
  group by
185
191
  val
186
192
  order by #{sort}
187
- -if(regexp_like(`#{name}`, '^[-+]?((0|([1-9]\\\\d*)(\\\\.\\\\d*)?)|((0|([1-9]\\\\d*))\\\\.\\\\d+))$'), `#{name}` + 0, null) desc,
188
- -if(regexp_like(`#{name}`, '^0\\\\d+$'), length(`#{name}`), null) desc,
189
- -if(regexp_like(`#{name}`, '^\\\\d'), regexp_instr(`#{name}`, '[^\\\\d]'), null) desc,
193
+ #{like}
190
194
  `#{name}` is null, `#{name}`
195
+ #{show ? "limit #{show}" : ""}
191
196
 
192
- uniq, tots = conn.sql(<<~"").to_a[0]
197
+ uniq, tots = conn.sql(<<~"".rstrip).to_a[0]
193
198
  select
194
199
  count(distinct(ifnull(`#{name}`,0))),
195
200
  count(ifnull(`#{name}`,0))
196
201
  from
197
- `#{tabl}`
198
- #{filt}
202
+ `#{tabl}`#{filt}
199
203
 
200
204
  display(name, data, show, uniq, tots)
201
205
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slyce
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Shreeve
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-29 00:00:00.000000000 Z
11
+ date: 2023-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: any_ascii