slyce 0.9.1 → 0.9.5

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/slyce +14 -11
  3. data/bin/slyce3 +114 -0
  4. metadata +3 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 057777cd908c785455b4ab4fc4c20b3aa545901bf552d0d1d568583424606103
4
- data.tar.gz: 0cd8af51f8c809244bf308157d02adf5bcd4d0a6038acd2cb0abd73e9f609bd3
3
+ metadata.gz: 81d5ddf505bb1b8f75770447e2c6015a3cf2c1ce2003b543cbce2c3364b8c9cf
4
+ data.tar.gz: 2b4ae78ed3f654619e9b2d01e1d50a2cdc561f0e541416cb8739400fa8980e1a
5
5
  SHA512:
6
- metadata.gz: 10e034e61797fa5cbad886553f00ff4017e4c0a8a78d473ec2790ebe179a6d914f2194ca1d4c6283516fe39c69f8532ace24be807591431c2a52b1b202c48b78
7
- data.tar.gz: 1115cb037df547637f2c0d3f67b41297c27e37fba4d4f12d8cfe0780c2fa962d9d75d7527a1dc232f22b30c0d5cf6ef60221b3113b08b4eae31a7a005218ef41
6
+ metadata.gz: 90657cc538cfaff2540321d9fe3862593d1136820ca02a5c604d5994c495f5d91164554a1de2b142b131dca37309423cda926ed4abb12a6a941d93a3ff6c2f7c
7
+ data.tar.gz: 59eb8d3217d38f71972dff57fcf331746a866c8fa5c5cda60d69eeb96de7bb778aa8ac0e3b6d013f6d59e0bbcebfe03191423a244fc97654df7359f6e0665291
data/bin/slyce CHANGED
@@ -1,10 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- STDOUT.sync = true
3
+ VERSION="0.9.5"
4
4
 
5
- VERSION="0.9.1"
5
+ STDOUT.sync = true
6
6
 
7
- require "bundler/setup"
8
7
  require "mysql2"
9
8
  require "optparse"
10
9
 
@@ -28,19 +27,23 @@ OptionParser.new.instance_eval do
28
27
  end.parse!(into: opts={}) rescue abort($!.message)
29
28
 
30
29
  abcd = opts[:alpha]
30
+ filt = opts[:where] and filt = "where\n #{filt}"
31
31
  show = opts[:show]
32
32
  want = opts[:extract].to_s.downcase.split(",")
33
- filt = opts[:where] and filt = "where\n #{filt}"
34
33
 
35
- dbas ||= ARGV.shift or Kernel.abort "no database given"
36
- tabl ||= ARGV.shift or Kernel.abort "no table given"
34
+ dbas ||= ARGV.shift or abort "no database given"
35
+ tabl ||= ARGV.shift or abort "no table given"
37
36
 
38
37
  # ==[ Helpers ]==
39
38
 
40
39
  class Mysql2::Client
41
- def query!(stmt, *args, **, &)
40
+ def sql(...)
41
+ query(...)
42
+ end
43
+
44
+ def sql!(stmt, *args, **, &)
42
45
  puts "\n==[ SQL statement ]==\n\n", stmt.strip, ";"
43
- query(stmt, *args, **, &)
46
+ sql(stmt, *args, **, &)
44
47
  end
45
48
  end
46
49
 
@@ -73,7 +76,7 @@ end
73
76
  want.each do |name|
74
77
  sort = abcd ? "" : "cnt desc,"
75
78
  stmt = show ? "limit #{show}" : ""
76
- data = conn.query(<<~"" + stmt).to_a
79
+ data = conn.sql(<<~"" + stmt).to_a
77
80
  select
78
81
  count(*) as cnt,
79
82
  `#{name}` as val
@@ -88,14 +91,14 @@ want.each do |name|
88
91
  -if(regexp_like(`#{name}`, '^\\\\d'), regexp_instr(`#{name}`, '[^\\\\d]'), null) desc,
89
92
  `#{name}` is null, `#{name}`
90
93
 
91
- uniq = conn.query(<<~"").to_a[0][0]
94
+ uniq = conn.sql(<<~"").to_a[0][0]
92
95
  select
93
96
  count(distinct(ifnull(`#{name}`,0)))
94
97
  from
95
98
  `#{tabl}`
96
99
  #{filt}
97
100
 
98
- tots = conn.query(<<~"").to_a[0][0]
101
+ tots = conn.sql(<<~"").to_a[0][0]
99
102
  select
100
103
  count(ifnull(`#{name}`,0))
101
104
  from
data/bin/slyce3 ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # NOTE: Requires the 'regexp' sqlite3 extension from https://github.com/nalgeon/sqlean
4
+
5
+ VERSION="0.9.5"
6
+
7
+ STDOUT.sync = true
8
+
9
+ require "extralite"
10
+ require "optparse"
11
+
12
+ trap("INT" ) { abort "\n" }
13
+
14
+ dbas = nil
15
+ tabl = nil
16
+
17
+ OptionParser.new.instance_eval do
18
+ @banner = "usage: #{program_name} [options] <database> <table>"
19
+
20
+ on "-a", "--alpha" , "Sort alphabetically, not numerically"
21
+ on "-c", "--columns" , "Display column names and quit"
22
+ on "-h", "--help" , "Show help and command usage" do Kernel.abort to_s; end
23
+ on "-r", "--regexp <path>" , "Path to the sqlean/regexp extension"
24
+ on "-s", "--show <count>" , "Show this many values", Integer
25
+ on "-v", "--version" , "Show version number" do Kernel.abort "#{program_name} #{VERSION}"; end
26
+ on "-w", "--where <cond>" , "Filter rows (eg - 'age=33,Name=/[BW]ill/i,color=\"\"'"
27
+ on "-x", "--extract <col1,col2,...>", "Comma separated list of columns to extract"
28
+
29
+ self
30
+ end.parse!(into: opts={regexp: "regexp"}) rescue abort($!.message)
31
+
32
+ abcd = opts[:alpha]
33
+ filt = opts[:where] and filt = "where\n #{filt}"
34
+ regx = opts[:regexp]; File.exist?(regx) or abort "no regexp extension found at '#{regx}'"
35
+ show = opts[:show]
36
+ want = opts[:extract].to_s.downcase.split(",")
37
+
38
+ dbas ||= ARGV.shift or abort "no database given"
39
+ tabl ||= ARGV.shift or abort "no table given"
40
+
41
+ # ==[ Helpers ]==
42
+
43
+ class Extralite::Database
44
+ def sql(...)
45
+ query_ary(...)
46
+ end
47
+
48
+ def sql!(stmt, *args, **, &)
49
+ puts "\n==[ SQL statement ]==\n\n", stmt.strip, ";"
50
+ sql(stmt, *args, **, &)
51
+ end
52
+ end
53
+
54
+ def display(name, data, show, uniq, tots)
55
+ seen = data.inject(0) {|seen, coun| seen += coun[0] }
56
+ rows = [data.size, seen].min
57
+ wide = tots.to_s.size
58
+ fill = " " * wide
59
+ line = "=" * name.size
60
+
61
+ puts "\n#{fill} #{name}\n#{fill} #{line}\n"
62
+ data.each {|cnt, val| puts "%*d %s" % [wide, cnt, val || "NULL"] }
63
+ puts "#{fill} -----\n"
64
+ puts "%*d shown (top %d)" % [wide, rows, rows] if show
65
+ puts "%*d total (all %d)" % [wide, tots, uniq]
66
+ end
67
+
68
+ # ==[ Let 'er rip! ]==
69
+
70
+ conn = Extralite::Database.new(dbas)
71
+ resu = conn.load_extension(regx)
72
+ cols = conn.columns("select * from `#{tabl}` limit 0").map(&:to_s)
73
+ want = want.empty? ? cols : want & cols
74
+
75
+ if opts[:columns]
76
+ puts cols
77
+ exit
78
+ end
79
+
80
+ want.each do |name|
81
+ sort = abcd ? "" : "cnt desc,"
82
+ stmt = show ? "limit #{show}" : ""
83
+ data = conn.sql(<<~"" + stmt).to_a
84
+ select
85
+ count(*) as cnt,
86
+ `#{name}` as val
87
+ from
88
+ `#{tabl}`
89
+ #{filt}
90
+ group by
91
+ val
92
+ order by #{sort}
93
+ -iif(regexp_like(`#{name}`, '^[-+]?((0|([1-9]\\d*)(\\.\\d*)?)|((0|([1-9]\\d*))\\.\\d+))$'), `#{name}` + 0, null) desc,
94
+ -iif(regexp_like(`#{name}`, '^0\\d+$'), length(`#{name}`), null) desc,
95
+ -iif(regexp_like(`#{name}`, '^\\d'), length(regexp_substr(`#{name}`, '^\\d+')), null) desc,
96
+ `#{name}` is null, `#{name}`
97
+ collate nocase
98
+
99
+ uniq = conn.sql(<<~"").to_a[0][0]
100
+ select
101
+ count(distinct(ifnull(`#{name}`,0)))
102
+ from
103
+ `#{tabl}`
104
+ #{filt}
105
+
106
+ tots = conn.sql(<<~"").to_a[0][0]
107
+ select
108
+ count(ifnull(`#{name}`,0))
109
+ from
110
+ `#{tabl}`
111
+ #{filt}
112
+
113
+ display(name, data, show, uniq, tots)
114
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slyce
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Shreeve
@@ -28,6 +28,7 @@ description: Ruby utility to show data statistics for MySQL databases
28
28
  email: steve.shreeve@gmail.com
29
29
  executables:
30
30
  - slyce
31
+ - slyce3
31
32
  extensions: []
32
33
  extra_rdoc_files: []
33
34
  files:
@@ -35,6 +36,7 @@ files:
35
36
  - LICENSE
36
37
  - README.md
37
38
  - bin/slyce
39
+ - bin/slyce3
38
40
  - slyce.gemspec
39
41
  homepage: https://github.com/shreeve/slyce
40
42
  licenses: