mycmd 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -6
- data/lib/mycmd.rb +1 -0
- data/lib/mycmd/cli.rb +29 -18
- data/lib/mycmd/cli/config_commands.rb +35 -0
- data/lib/mycmd/{clis → cli}/settings_commands.rb +0 -0
- data/lib/mycmd/cli/status_commands.rb +48 -0
- data/lib/mycmd/client.rb +14 -0
- data/lib/mycmd/sql.rb +16 -0
- data/lib/mycmd/version.rb +1 -1
- data/spec/mycmd/{clis → cli}/config_commands_spec.rb +28 -24
- data/spec/mycmd/{clis → cli}/settings_commands_spec.rb +0 -0
- data/spec/mycmd/cli/status_commands_spec.rb +198 -0
- data/spec/mycmd/cli_spec.rb +83 -36
- data/spec/mycmd/client_spec.rb +10 -0
- data/spec/support/spec_utils.rb +21 -0
- metadata +13 -12
- data/lib/mycmd/clis/config_commands.rb +0 -27
- data/lib/mycmd/clis/status_commands.rb +0 -43
- data/spec/mycmd/clis/status_commands_spec.rb +0 -113
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b24c37c49a4bae08b918d206beb5a4a3882df2e0
|
4
|
+
data.tar.gz: 367143249fa9bf1c78d2b55c9e76114ccfb1ff5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af74e85f9785004c12c8c41a065cce5fdfde0a6a42e1cc1c77a5e2c828224efe45e066032811476892b278ba23874c6cec4d5408fca1dd5d659072fb7f646029
|
7
|
+
data.tar.gz: cb36fbd4f939f2aef815191b92c90a89a3335ef278f4d3588cb5017b506ba7265fce83c011da34628df486a7e43d5f845dade69f2a7dae05f88a2a4f3c0e81a3
|
data/README.md
CHANGED
@@ -21,10 +21,6 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
$ gem install mycmd
|
23
23
|
|
24
|
-
Or clone from Github:
|
25
|
-
|
26
|
-
$ git clone https://github.com/i2bskn/mycmd.git
|
27
|
-
|
28
24
|
## Settings
|
29
25
|
|
30
26
|
Create settings file:
|
@@ -59,11 +55,11 @@ Execute sql:
|
|
59
55
|
|
60
56
|
#### Config Commands
|
61
57
|
|
62
|
-
|
58
|
+
Display current config file path:
|
63
59
|
|
64
60
|
$ mycmd config which
|
65
61
|
|
66
|
-
|
62
|
+
Display current config:
|
67
63
|
|
68
64
|
$ mycmd config cat
|
69
65
|
|
@@ -77,6 +73,24 @@ Search settings:
|
|
77
73
|
|
78
74
|
$ mycmd settings search innodb_buffer_pool_size
|
79
75
|
|
76
|
+
Display memory related settings:
|
77
|
+
|
78
|
+
$ mycmd settings memories
|
79
|
+
|
80
|
+
#### Status Commands
|
81
|
+
|
82
|
+
Display database sizes:
|
83
|
+
|
84
|
+
$ mycmd status size
|
85
|
+
|
86
|
+
Display query cache hit rate:
|
87
|
+
|
88
|
+
$ mycmd status qcache_hit_rate
|
89
|
+
|
90
|
+
Display innodb buffer pool hit rate:
|
91
|
+
|
92
|
+
$ mycmd status innodb_buffer_hit_rate
|
93
|
+
|
80
94
|
## Contributing
|
81
95
|
|
82
96
|
1. Fork it
|
data/lib/mycmd.rb
CHANGED
data/lib/mycmd/cli.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require "mycmd/
|
4
|
-
require "mycmd/
|
5
|
-
require "mycmd/
|
3
|
+
require "mycmd/cli/config_commands"
|
4
|
+
require "mycmd/cli/settings_commands"
|
5
|
+
require "mycmd/cli/status_commands"
|
6
6
|
|
7
7
|
module Mycmd
|
8
8
|
class CLI < Thor
|
@@ -13,29 +13,40 @@ module Mycmd
|
|
13
13
|
|
14
14
|
desc "console", "console will start sql shell."
|
15
15
|
def console
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
when :port then c << "-P#{v}"
|
22
|
-
when :username then c << "-u#{v}"
|
23
|
-
when :password then c << "-p#{v}"
|
24
|
-
when :database then c << v
|
25
|
-
end
|
16
|
+
begin
|
17
|
+
raise "mysql command not found" unless Kernel.system("which mysql > /dev/null")
|
18
|
+
Kernel.system(Client.command)
|
19
|
+
rescue => e
|
20
|
+
puts e.message
|
26
21
|
end
|
27
|
-
|
28
|
-
Kernel.system(cmd.join(" "))
|
29
22
|
end
|
30
23
|
|
31
24
|
desc 'query "[SQL]"', "query will execute sql."
|
32
25
|
def query(sql)
|
33
|
-
|
26
|
+
begin
|
27
|
+
Client.query(sql).print
|
28
|
+
rescue => e
|
29
|
+
puts e.message
|
30
|
+
end
|
34
31
|
end
|
35
32
|
|
36
33
|
desc 'tasks [TASK NAME]p', "tasks will execute register sql."
|
37
|
-
|
38
|
-
|
34
|
+
option :list, aliases: "-l", desc: "Display the tasks"
|
35
|
+
def tasks(task=nil)
|
36
|
+
if options[:list].nil?
|
37
|
+
begin
|
38
|
+
Client.execute_task(task).print
|
39
|
+
rescue => e
|
40
|
+
puts e.message
|
41
|
+
end
|
42
|
+
else
|
43
|
+
conf = Configuration.new
|
44
|
+
if conf.tasks.nil?
|
45
|
+
puts "task is not registered"
|
46
|
+
else
|
47
|
+
conf.tasks.each{|k,v| puts "#{k}:\t#{v}"}
|
48
|
+
end
|
49
|
+
end
|
39
50
|
end
|
40
51
|
end
|
41
52
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Mycmd
|
4
|
+
class ConfigCommands < Thor
|
5
|
+
namespace :config
|
6
|
+
|
7
|
+
desc "which", "which will find config file"
|
8
|
+
def which
|
9
|
+
conf = Configuration.config_find
|
10
|
+
puts conf.nil? ? "config not found" : conf
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "cat", "cat will print configuration"
|
14
|
+
def cat
|
15
|
+
begin
|
16
|
+
conf = Configuration.config_find
|
17
|
+
raise "config not found" if conf.nil?
|
18
|
+
File.open(conf, "r").each {|line| puts line}
|
19
|
+
rescue => e
|
20
|
+
puts e.message
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "edit", "edit will edit configuration"
|
25
|
+
def edit
|
26
|
+
begin
|
27
|
+
conf = Configuration.config_find
|
28
|
+
raise "config not found" if conf.nil?
|
29
|
+
Kernel.system("#{ENV['EDITOR']} #{conf}")
|
30
|
+
rescue => e
|
31
|
+
puts e.message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
File without changes
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Mycmd
|
4
|
+
class StatusCommands < Thor
|
5
|
+
namespace :status
|
6
|
+
|
7
|
+
desc "size", "size will print database/table size"
|
8
|
+
option :database, aliases: "-d", desc: "target database."
|
9
|
+
def size
|
10
|
+
begin
|
11
|
+
sql = options["database"].nil? ? SQL::ALL_DATABASE_SIZES : SQL.table_sizes(options['database'])
|
12
|
+
Client.query(sql).print
|
13
|
+
rescue => e
|
14
|
+
puts e.message
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "qcache_hit_rate", "qcache_hit_rate will print query cache hit rate"
|
19
|
+
def qcache_hit_rate
|
20
|
+
begin
|
21
|
+
raise "Query cache is disabled." if Client.query(SQL::QCACHE_SIZE).result.first["size"] == "0"
|
22
|
+
print_rate(Client.query(SQL::QCACHE_HIT_RATE).result, 20)
|
23
|
+
rescue => e
|
24
|
+
puts e.message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "innodb_buffer_hit_rate", "innodb_buffer_hit_rate will print buffer hit rate"
|
29
|
+
def innodb_buffer_hit_rate
|
30
|
+
begin
|
31
|
+
print_rate(Client.query(SQL::INNODB_BUFFER_HIT_RATE).result, 90)
|
32
|
+
rescue => e
|
33
|
+
puts e.message
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def print_rate(rate, threshold)
|
39
|
+
if rate.nil?
|
40
|
+
rate = "\e[31munknown\e[m"
|
41
|
+
else
|
42
|
+
rate = rate.first["rate"].to_i
|
43
|
+
rate = rate >= threshold ? "\e[32m#{rate} %\e[m" : "\e[31m#{rate} %\e[m"
|
44
|
+
end
|
45
|
+
puts rate
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/mycmd/client.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Mycmd
|
4
4
|
class Client
|
5
|
+
attr_reader :result
|
6
|
+
|
5
7
|
def initialize
|
6
8
|
@configuration = Configuration.new
|
7
9
|
@connection = @configuration.connect
|
@@ -21,6 +23,18 @@ module Mycmd
|
|
21
23
|
Printer.new(@result, header).print
|
22
24
|
end
|
23
25
|
|
26
|
+
def command
|
27
|
+
@configuration.to_hash.inject(["mysql"]) do |c,(k,v)|
|
28
|
+
case k
|
29
|
+
when :host then c << "-h#{v}"
|
30
|
+
when :port then c << "-P#{v}"
|
31
|
+
when :username then c << "-u#{v}"
|
32
|
+
when :password then c << "-p#{v}"
|
33
|
+
when :database then c << v
|
34
|
+
end
|
35
|
+
end.join(" ")
|
36
|
+
end
|
37
|
+
|
24
38
|
class << self
|
25
39
|
def method_missing(action, *args)
|
26
40
|
client = self.new
|
data/lib/mycmd/sql.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Mycmd
|
4
|
+
module SQL
|
5
|
+
ALL_DATABASE_SIZES = "SELECT T.TABLE_SCHEMA, CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T GROUP BY T.TABLE_SCHEMA UNION SELECT 'all_databases', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T"
|
6
|
+
QCACHE_SIZE = "SELECT G.VARIABLE_VALUE AS size FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES AS G WHERE G.VARIABLE_NAME = 'QUERY_CACHE_SIZE'"
|
7
|
+
QCACHE_HIT_RATE = "SELECT (SELECT (SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'QCACHE_HITS')/(SELECT SUM(G.VARIABLE_VALUE) FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME IN ('QCACHE_HITS','QCACHE_INSERTS','QCACHE_NOT_CACHED')) * 100) AS rate"
|
8
|
+
INNODB_BUFFER_HIT_RATE = "SELECT (1 - ((SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READS')/(SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READ_REQUESTS'))) * 100 AS rate"
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def table_sizes(db)
|
12
|
+
"SELECT T.TABLE_NAME, CAST(((T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = '#{db}' UNION SELECT 'all_tables', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = '#{db}'"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/mycmd/version.rb
CHANGED
@@ -18,8 +18,8 @@ describe Mycmd::ConfigCommands do
|
|
18
18
|
expect(
|
19
19
|
capture(:stdout){
|
20
20
|
Mycmd::ConfigCommands.start(args)
|
21
|
-
}
|
22
|
-
).to eq("config not found
|
21
|
+
}.chomp
|
22
|
+
).to eq("config not found")
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should print config path" do
|
@@ -28,48 +28,52 @@ describe Mycmd::ConfigCommands do
|
|
28
28
|
expect(
|
29
29
|
capture(:stdout){
|
30
30
|
Mycmd::ConfigCommands.start(args)
|
31
|
-
}
|
32
|
-
).to eq(
|
31
|
+
}.chomp
|
32
|
+
).to eq(config)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
describe "#
|
37
|
-
let(:args) {["
|
36
|
+
describe "#cat" do
|
37
|
+
let(:args) {["cat"]}
|
38
38
|
|
39
|
-
it "should
|
40
|
-
Mycmd::Configuration.
|
41
|
-
|
39
|
+
it "should call Configuration.config_find" do
|
40
|
+
Mycmd::Configuration.should_receive(:config_find).and_return(".mycmd.yml")
|
41
|
+
File.stub(:open).and_return([])
|
42
42
|
Mycmd::ConfigCommands.start(args)
|
43
43
|
end
|
44
44
|
|
45
|
-
it "should
|
45
|
+
it "should print error message if file not found" do
|
46
46
|
Mycmd::Configuration.stub(:config_find).and_return(nil)
|
47
|
-
expect
|
48
|
-
|
49
|
-
|
47
|
+
expect(
|
48
|
+
capture(:stdout){
|
49
|
+
Mycmd::ConfigCommands.start(args)
|
50
|
+
}.chomp
|
51
|
+
).to eq("config not found")
|
50
52
|
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#edit" do
|
56
|
+
let(:args) {["edit"]}
|
51
57
|
|
52
58
|
it "should call Configuration.config_find" do
|
53
59
|
Mycmd::Configuration.should_receive(:config_find).and_return(".mycmd.yml")
|
54
60
|
Kernel.stub(:system)
|
55
61
|
Mycmd::ConfigCommands.start(args)
|
56
62
|
end
|
57
|
-
end
|
58
63
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
it "should call Configuration.config_find" do
|
63
|
-
Mycmd::Configuration.should_receive(:config_find).and_return(".mycmd.yml")
|
64
|
-
File.stub(:open).and_return([])
|
64
|
+
it "should execute edit command" do
|
65
|
+
Mycmd::Configuration.stub(:config_find).and_return(".mycmd.yml")
|
66
|
+
Kernel.should_receive(:system).with("#{ENV['EDITOR']} .mycmd.yml")
|
65
67
|
Mycmd::ConfigCommands.start(args)
|
66
68
|
end
|
67
69
|
|
68
|
-
it "should
|
70
|
+
it "should print error message if file not found" do
|
69
71
|
Mycmd::Configuration.stub(:config_find).and_return(nil)
|
70
|
-
expect
|
71
|
-
|
72
|
-
|
72
|
+
expect(
|
73
|
+
capture(:stdout){
|
74
|
+
Mycmd::ConfigCommands.start(args)
|
75
|
+
}.chomp
|
76
|
+
).to eq("config not found")
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
File without changes
|
@@ -0,0 +1,198 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mycmd::StatusCommands do
|
4
|
+
let(:conn_mock) {double("connection mock")}
|
5
|
+
let(:client) {create_configuration_mock}
|
6
|
+
|
7
|
+
describe "#size" do
|
8
|
+
context "with not arguments" do
|
9
|
+
let(:args) {["size"]}
|
10
|
+
let(:sql) {"SELECT T.TABLE_SCHEMA, CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T GROUP BY T.TABLE_SCHEMA UNION SELECT 'all_databases', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T"}
|
11
|
+
|
12
|
+
context "without failed" do
|
13
|
+
after {Mycmd::StatusCommands.start(args)}
|
14
|
+
|
15
|
+
it "should call Mycmd::Client.#query" do
|
16
|
+
Mycmd::Client.should_receive(:query).with(sql).and_return(client)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should call Mycmd::Client#print" do
|
20
|
+
client.should_receive(:print)
|
21
|
+
Mycmd::Client.stub(:query).and_return(client)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with failed" do
|
26
|
+
it "should display error message" do
|
27
|
+
Mycmd::Client.should_receive(:query).with(sql).and_raise("test")
|
28
|
+
expect(
|
29
|
+
capture(:stdout){
|
30
|
+
Mycmd::StatusCommands.start(args)
|
31
|
+
}.chomp
|
32
|
+
).to eq("test")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with arguments" do
|
38
|
+
let(:args) {["size", "-d", "some_db"]}
|
39
|
+
let(:sql) {"SELECT T.TABLE_NAME, CAST(((T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = 'some_db' UNION SELECT 'all_tables', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = 'some_db'"}
|
40
|
+
|
41
|
+
context "without failed" do
|
42
|
+
after {Mycmd::StatusCommands.start(args)}
|
43
|
+
|
44
|
+
it "should call Mycmd::Client.#query" do
|
45
|
+
Mycmd::Client.should_receive(:query).with(sql).and_return(client)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should call Mycmd::Client#print" do
|
49
|
+
client.should_receive(:print)
|
50
|
+
Mycmd::Client.stub(:query).and_return(client)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "with failed" do
|
55
|
+
it "should display error message" do
|
56
|
+
Mycmd::Client.should_receive(:query).with(sql).and_raise("test")
|
57
|
+
expect(
|
58
|
+
capture(:stdout){
|
59
|
+
Mycmd::StatusCommands.start(args)
|
60
|
+
}.chomp
|
61
|
+
).to eq("test")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#qcache_hit_rate" do
|
68
|
+
let(:args) {["qcache_hit_rate"]}
|
69
|
+
|
70
|
+
context "with qcache enabled" do
|
71
|
+
let(:sql) {"SELECT (SELECT (SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'QCACHE_HITS')/(SELECT SUM(G.VARIABLE_VALUE) FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME IN ('QCACHE_HITS','QCACHE_INSERTS','QCACHE_NOT_CACHED')) * 100) AS rate"}
|
72
|
+
|
73
|
+
before do
|
74
|
+
Mycmd::Client.stub(:query).with("SELECT G.VARIABLE_VALUE AS size FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES AS G WHERE G.VARIABLE_NAME = 'QUERY_CACHE_SIZE'").and_return(double("Mycmd::Client Mock", result: [{"size" => "4000"}]))
|
75
|
+
Mycmd::Client.stub(:query).with(sql).and_return(client)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should call Client.#query" do
|
79
|
+
client.stub(:result).and_return([{"rate" => 20}])
|
80
|
+
Mycmd::Client.should_receive(:query).with(sql).and_return(client)
|
81
|
+
capture(:stdout) {
|
82
|
+
Mycmd::StatusCommands.start(args)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should output the query cache hit rate" do
|
87
|
+
client.stub(:result).and_return([{"rate" => 20}])
|
88
|
+
expect(
|
89
|
+
capture(:stdout) {
|
90
|
+
Mycmd::StatusCommands.start(args)
|
91
|
+
}.chomp
|
92
|
+
).to eq("\e[32m20 %\e[m")
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should output red color of char if rate is unknown" do
|
96
|
+
client.stub(:result).and_return(nil)
|
97
|
+
expect(
|
98
|
+
capture(:stdout) {
|
99
|
+
Mycmd::StatusCommands.start(args)
|
100
|
+
}.chomp
|
101
|
+
).to eq("\e[31munknown\e[m")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should output red color of char if rate < 20" do
|
105
|
+
client.stub(:result).and_return([{"rate" => 10}])
|
106
|
+
expect(
|
107
|
+
capture(:stdout) {
|
108
|
+
Mycmd::StatusCommands.start(args)
|
109
|
+
}.chomp
|
110
|
+
).to eq("\e[31m10 %\e[m")
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should output green color of char if rate >= 20" do
|
114
|
+
client.stub(:result).and_return([{"rate" => 20}])
|
115
|
+
expect(
|
116
|
+
capture(:stdout) {
|
117
|
+
Mycmd::StatusCommands.start(args)
|
118
|
+
}.chomp
|
119
|
+
).to eq("\e[32m20 %\e[m")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "with qcache disabled" do
|
124
|
+
it "should display error message" do
|
125
|
+
Mycmd::Client.stub(:query).with("SELECT G.VARIABLE_VALUE AS size FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES AS G WHERE G.VARIABLE_NAME = 'QUERY_CACHE_SIZE'").and_return(double("Mycmd::Client Mock", result: [{"size" => "0"}]))
|
126
|
+
expect(
|
127
|
+
capture(:stdout) {
|
128
|
+
Mycmd::StatusCommands.start(args)
|
129
|
+
}.chomp
|
130
|
+
).to eq("Query cache is disabled.")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "#innodb_buffer_hit_rate" do
|
136
|
+
let(:args) {["innodb_buffer_hit_rate"]}
|
137
|
+
|
138
|
+
context "without failed" do
|
139
|
+
before {Mycmd::Client.stub(:query).and_return(client)}
|
140
|
+
|
141
|
+
it "should call Client.#query" do
|
142
|
+
client.should_receive(:result).and_return([{"rate" => 95}])
|
143
|
+
expect(
|
144
|
+
capture(:stdout) {
|
145
|
+
Mycmd::StatusCommands.start(args)
|
146
|
+
}.chomp
|
147
|
+
).not_to be_nil
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should output the innodb buffer hit rate" do
|
151
|
+
client.stub(:result).and_return([{"rate" => 95}])
|
152
|
+
expect(
|
153
|
+
capture(:stdout) {
|
154
|
+
Mycmd::StatusCommands.start(args)
|
155
|
+
}.chomp
|
156
|
+
).to eq("\e[32m95 %\e[m")
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should output red color of char if rate is unknown" do
|
160
|
+
client.stub(:result).and_return(nil)
|
161
|
+
expect(
|
162
|
+
capture(:stdout) {
|
163
|
+
Mycmd::StatusCommands.start(args)
|
164
|
+
}.chomp
|
165
|
+
).to eq("\e[31munknown\e[m")
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should output red color of char if rate < 90" do
|
169
|
+
client.stub(:result).and_return([{"rate" => 85}])
|
170
|
+
expect(
|
171
|
+
capture(:stdout) {
|
172
|
+
Mycmd::StatusCommands.start(args)
|
173
|
+
}.chomp
|
174
|
+
).to eq("\e[31m85 %\e[m")
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should output green color of char if rate >= 90" do
|
178
|
+
client.stub(:result).and_return([{"rate" => 95}])
|
179
|
+
expect(
|
180
|
+
capture(:stdout) {
|
181
|
+
Mycmd::StatusCommands.start(args)
|
182
|
+
}.chomp
|
183
|
+
).to eq("\e[32m95 %\e[m")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context "with failed" do
|
188
|
+
it "should display error message" do
|
189
|
+
Mycmd::Client.should_receive(:query).and_raise("test")
|
190
|
+
expect(
|
191
|
+
capture(:stdout) {
|
192
|
+
Mycmd::StatusCommands.start(args)
|
193
|
+
}.chomp
|
194
|
+
).to eq("test")
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
data/spec/mycmd/cli_spec.rb
CHANGED
@@ -3,68 +3,115 @@ require "spec_helper"
|
|
3
3
|
describe Mycmd::CLI do
|
4
4
|
let(:client) {double("client mock").as_null_object}
|
5
5
|
|
6
|
-
let(:conn_mock) {double("connection mock").as_null_object}
|
7
|
-
let(:printer_mock) {double("printer mock").as_null_object}
|
8
|
-
|
9
6
|
describe "#console" do
|
10
7
|
let(:args) {["console"]}
|
11
|
-
|
12
|
-
before do
|
13
|
-
Mycmd::Configuration.stub(:config_find).and_return(nil)
|
14
|
-
end
|
8
|
+
before {Mycmd::Client.stub(:command)}
|
15
9
|
|
16
10
|
it "should call Kernel.system" do
|
17
|
-
conf = Mycmd::Configuration.new
|
18
|
-
conf.password = "secret"
|
19
|
-
conf.database = "test"
|
20
|
-
Mycmd::Configuration.should_receive(:new).and_return(conf)
|
21
11
|
Kernel.should_receive(:system).exactly(2).and_return(true)
|
22
12
|
expect {
|
23
13
|
Mycmd::CLI.start(args)
|
24
14
|
}.not_to raise_error
|
25
15
|
end
|
26
16
|
|
27
|
-
it "should
|
28
|
-
Kernel.should_receive(:system).and_return(false)
|
29
|
-
expect
|
30
|
-
|
31
|
-
|
17
|
+
it "should print message if mysql command not found" do
|
18
|
+
Kernel.should_receive(:system).with("which mysql > /dev/null").exactly(1).and_return(false)
|
19
|
+
expect(
|
20
|
+
capture(:stdout){
|
21
|
+
Mycmd::CLI.start(args)
|
22
|
+
}.chomp
|
23
|
+
).to eq("mysql command not found")
|
32
24
|
end
|
33
25
|
end
|
34
26
|
|
35
27
|
describe "#query" do
|
36
|
-
|
28
|
+
let(:args) {["query", "some sql"]}
|
37
29
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
30
|
+
context "with execution of sql is successfull" do
|
31
|
+
after do
|
32
|
+
expect {
|
33
|
+
Mycmd::CLI.start(args)
|
34
|
+
}.not_to raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should call Client.#query" do
|
38
|
+
Mycmd::Client.should_receive(:query).and_return(client)
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
41
|
+
it "should call Client#print" do
|
42
|
+
client.should_receive(:print)
|
43
|
+
Mycmd::Client.stub(:query).and_return(client)
|
44
|
+
end
|
46
45
|
end
|
47
46
|
|
48
|
-
|
49
|
-
|
47
|
+
context "with execution of sql is failed" do
|
48
|
+
it "should print error message" do
|
49
|
+
Mycmd::Client.should_receive(:query).and_raise("some error")
|
50
|
+
expect(
|
51
|
+
capture(:stdout){
|
52
|
+
Mycmd::CLI.start(args)
|
53
|
+
}.chomp
|
54
|
+
).to eq("some error")
|
55
|
+
end
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
53
59
|
describe "#tasks" do
|
54
|
-
|
60
|
+
context "without list option" do
|
61
|
+
let(:args) {["tasks", "some_task"]}
|
55
62
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
63
|
+
context "with execution of task is successfull" do
|
64
|
+
after do
|
65
|
+
expect {
|
66
|
+
Mycmd::CLI.start(args)
|
67
|
+
}.not_to raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should call Client.#execute_task" do
|
71
|
+
Mycmd::Client.should_receive(:execute_task).and_return(client)
|
72
|
+
end
|
61
73
|
|
62
|
-
|
63
|
-
|
74
|
+
it "should call Client#print" do
|
75
|
+
client.should_receive(:print)
|
76
|
+
Mycmd::Client.stub(:execute_task).and_return(client)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "with execution of task is failed" do
|
81
|
+
it "should print error message" do
|
82
|
+
Mycmd::Client.should_receive(:execute_task).and_raise("some error")
|
83
|
+
expect(
|
84
|
+
capture(:stdout){
|
85
|
+
Mycmd::CLI.start(args)
|
86
|
+
}.chomp
|
87
|
+
).to eq("some error")
|
88
|
+
end
|
89
|
+
end
|
64
90
|
end
|
65
91
|
|
66
|
-
|
67
|
-
|
92
|
+
context "with list option" do
|
93
|
+
let(:configuration) {create_configuration_mock}
|
94
|
+
let(:args) {["tasks", "-l"]}
|
95
|
+
|
96
|
+
before {Mycmd::Configuration.should_receive(:new).and_return(configuration)}
|
97
|
+
|
98
|
+
it "should print message if tasks is not registered" do
|
99
|
+
configuration.should_receive(:tasks).and_return(nil)
|
100
|
+
expect(
|
101
|
+
capture(:stdout){
|
102
|
+
Mycmd::CLI.start(args)
|
103
|
+
}.chomp
|
104
|
+
).to eq("task is not registered")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should print tasks" do
|
108
|
+
configuration.stub(:tasks).and_return({"key" => "value"})
|
109
|
+
expect(
|
110
|
+
capture(:stdout){
|
111
|
+
Mycmd::CLI.start(args)
|
112
|
+
}.chomp
|
113
|
+
).to eq("key:\tvalue")
|
114
|
+
end
|
68
115
|
end
|
69
116
|
end
|
70
117
|
end
|
data/spec/mycmd/client_spec.rb
CHANGED
@@ -82,6 +82,16 @@ describe Mycmd::Client do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
describe "#command" do
|
86
|
+
before do
|
87
|
+
Mycmd::Configuration.stub(:new).and_return(create_configuration_mock)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should" do
|
91
|
+
expect(client.command).to eq("mysql -hlocalhost -uroot -psecret -P3306 sample")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
85
95
|
describe ".#method_missing" do
|
86
96
|
before do
|
87
97
|
connection.stub(:query)
|
data/spec/support/spec_utils.rb
CHANGED
@@ -13,6 +13,27 @@ module SpecUtils
|
|
13
13
|
result
|
14
14
|
end
|
15
15
|
|
16
|
+
def create_configuration_mock
|
17
|
+
configuration = double("Mycmd::Configuration Mock").as_null_object
|
18
|
+
configuration.stub(:to_hash).and_return(setting_variables)
|
19
|
+
configuration.stub(:connect).and_return(create_connection_mock)
|
20
|
+
configuration
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_connection_mock
|
24
|
+
double("Mysql2::Client Mock").as_null_object
|
25
|
+
end
|
26
|
+
|
27
|
+
def setting_variables
|
28
|
+
{
|
29
|
+
host: "localhost",
|
30
|
+
username: "root",
|
31
|
+
password: "secret",
|
32
|
+
port: 3306,
|
33
|
+
database: "sample"
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
16
37
|
def create_variables
|
17
38
|
{
|
18
39
|
innodb_buffer_pool_size: "268435456",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mycmd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- i2bskn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -98,19 +98,20 @@ files:
|
|
98
98
|
- bin/mycmd
|
99
99
|
- lib/mycmd.rb
|
100
100
|
- lib/mycmd/cli.rb
|
101
|
+
- lib/mycmd/cli/config_commands.rb
|
102
|
+
- lib/mycmd/cli/settings_commands.rb
|
103
|
+
- lib/mycmd/cli/status_commands.rb
|
101
104
|
- lib/mycmd/client.rb
|
102
|
-
- lib/mycmd/clis/config_commands.rb
|
103
|
-
- lib/mycmd/clis/settings_commands.rb
|
104
|
-
- lib/mycmd/clis/status_commands.rb
|
105
105
|
- lib/mycmd/configuration.rb
|
106
106
|
- lib/mycmd/printer.rb
|
107
|
+
- lib/mycmd/sql.rb
|
107
108
|
- lib/mycmd/version.rb
|
108
109
|
- mycmd.gemspec
|
110
|
+
- spec/mycmd/cli/config_commands_spec.rb
|
111
|
+
- spec/mycmd/cli/settings_commands_spec.rb
|
112
|
+
- spec/mycmd/cli/status_commands_spec.rb
|
109
113
|
- spec/mycmd/cli_spec.rb
|
110
114
|
- spec/mycmd/client_spec.rb
|
111
|
-
- spec/mycmd/clis/config_commands_spec.rb
|
112
|
-
- spec/mycmd/clis/settings_commands_spec.rb
|
113
|
-
- spec/mycmd/clis/status_commands_spec.rb
|
114
115
|
- spec/mycmd/configuration_spec.rb
|
115
116
|
- spec/mycmd/printer_spec.rb
|
116
117
|
- spec/spec_helper.rb
|
@@ -135,16 +136,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
136
|
version: '0'
|
136
137
|
requirements: []
|
137
138
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.1.
|
139
|
+
rubygems_version: 2.1.6
|
139
140
|
signing_key:
|
140
141
|
specification_version: 4
|
141
142
|
summary: MySQL command line tool
|
142
143
|
test_files:
|
144
|
+
- spec/mycmd/cli/config_commands_spec.rb
|
145
|
+
- spec/mycmd/cli/settings_commands_spec.rb
|
146
|
+
- spec/mycmd/cli/status_commands_spec.rb
|
143
147
|
- spec/mycmd/cli_spec.rb
|
144
148
|
- spec/mycmd/client_spec.rb
|
145
|
-
- spec/mycmd/clis/config_commands_spec.rb
|
146
|
-
- spec/mycmd/clis/settings_commands_spec.rb
|
147
|
-
- spec/mycmd/clis/status_commands_spec.rb
|
148
149
|
- spec/mycmd/configuration_spec.rb
|
149
150
|
- spec/mycmd/printer_spec.rb
|
150
151
|
- spec/spec_helper.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Mycmd
|
4
|
-
class ConfigCommands < Thor
|
5
|
-
namespace :config
|
6
|
-
|
7
|
-
desc "which", "which will find config file"
|
8
|
-
def which
|
9
|
-
conf = Configuration.config_find
|
10
|
-
puts conf.nil? ? "config not found" : conf
|
11
|
-
end
|
12
|
-
|
13
|
-
desc "cat", "cat will print configuration"
|
14
|
-
def cat
|
15
|
-
conf = Configuration.config_find
|
16
|
-
raise "config not found" if conf.nil?
|
17
|
-
File.open(conf, "r").each {|line| puts line}
|
18
|
-
end
|
19
|
-
|
20
|
-
desc "edit", "edit will edit configuration"
|
21
|
-
def edit
|
22
|
-
conf = Configuration.config_find
|
23
|
-
raise "config not found" if conf.nil?
|
24
|
-
Kernel.system("#{ENV['EDITOR']} #{conf}")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Mycmd
|
4
|
-
class StatusCommands < Thor
|
5
|
-
namespace :status
|
6
|
-
|
7
|
-
desc "size", "size will print database/table size"
|
8
|
-
option :database, aliases: "-d", desc: "target database."
|
9
|
-
def size
|
10
|
-
if options["database"].nil?
|
11
|
-
sql = "SELECT T.TABLE_SCHEMA, CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T GROUP BY T.TABLE_SCHEMA UNION SELECT 'all_databases', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T"
|
12
|
-
else
|
13
|
-
sql = "SELECT T.TABLE_NAME, CAST(((T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = '#{options['database']}' UNION SELECT 'all_tables', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = '#{options['database']}'"
|
14
|
-
end
|
15
|
-
Client.query(sql).print
|
16
|
-
end
|
17
|
-
|
18
|
-
desc "qcache_hit_rate", "qcache_hit_rate will print query cache hit rate"
|
19
|
-
def qcache_hit_rate
|
20
|
-
client = Configuration.connect
|
21
|
-
rate = client.query("SELECT (SELECT (SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'QCACHE_HITS')/(SELECT SUM(G.VARIABLE_VALUE) FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME IN ('QCACHE_HITS','QCACHE_INSERTS','QCACHE_NOT_CACHED')) * 100) AS rate")
|
22
|
-
print_rate(rate, 20)
|
23
|
-
end
|
24
|
-
|
25
|
-
desc "innodb_buffer_hit_rate", "innodb_buffer_hit_rate will print buffer hit rate"
|
26
|
-
def innodb_buffer_hit_rate
|
27
|
-
client = Configuration.connect
|
28
|
-
rate = client.query("SELECT (1 - ((SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READS')/(SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READ_REQUESTS'))) * 100 AS rate")
|
29
|
-
print_rate(rate, 90)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def print_rate(rate, threshold)
|
34
|
-
if rate.nil?
|
35
|
-
rate = "\e[31munknown\e[m"
|
36
|
-
else
|
37
|
-
rate = rate.first["rate"]
|
38
|
-
rate = rate >= threshold ? "\e[32m#{rate} %\e[m" : "\e[31m#{rate} %\e[m"
|
39
|
-
end
|
40
|
-
puts rate
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,113 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Mycmd::StatusCommands do
|
4
|
-
let(:conn_mock) {double("connection mock")}
|
5
|
-
|
6
|
-
describe "#size" do
|
7
|
-
let(:client) {double("Mycmd::Client Mock").as_null_object}
|
8
|
-
|
9
|
-
context "with not arguments" do
|
10
|
-
let(:args) {["size"]}
|
11
|
-
let(:sql) {"SELECT T.TABLE_SCHEMA, CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T GROUP BY T.TABLE_SCHEMA UNION SELECT 'all_databases', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T"}
|
12
|
-
|
13
|
-
after {Mycmd::StatusCommands.start(args)}
|
14
|
-
|
15
|
-
it "should call Mycmd::Client.#query" do
|
16
|
-
Mycmd::Client.should_receive(:query).with(sql).and_return(client)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should call Mycmd::Client#print" do
|
20
|
-
client.should_receive(:print)
|
21
|
-
Mycmd::Client.stub(:query).and_return(client)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "with arguments" do
|
26
|
-
let(:args) {["size", "-d", "some_db"]}
|
27
|
-
let(:sql) {"SELECT T.TABLE_NAME, CAST(((T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) AS SIZE_MB FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = 'some_db' UNION SELECT 'all_tables', CAST((SUM(T.DATA_LENGTH+T.INDEX_LENGTH)/1024/1024) AS CHAR) FROM INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_SCHEMA = 'some_db'"}
|
28
|
-
|
29
|
-
after {Mycmd::StatusCommands.start(args)}
|
30
|
-
|
31
|
-
it "should call Mycmd::Client.#query" do
|
32
|
-
Mycmd::Client.should_receive(:query).with(sql).and_return(client)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should call Mycmd::Client#print" do
|
36
|
-
client.should_receive(:print)
|
37
|
-
Mycmd::Client.stub(:query).and_return(client)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "#qcache_hit_rate" do
|
43
|
-
let(:args) {["qcache_hit_rate"]}
|
44
|
-
|
45
|
-
before do
|
46
|
-
conn_mock.stub(:query).and_return(double.as_null_object)
|
47
|
-
Mycmd::Configuration.stub(:connect).and_return(conn_mock)
|
48
|
-
end
|
49
|
-
|
50
|
-
after do
|
51
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).not_to be_nil
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should call Configuration.#connect" do
|
55
|
-
Mycmd::Configuration.should_receive(:connect).and_return(conn_mock)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should output the query cache hit rate" do
|
59
|
-
conn_mock.should_receive(:query).with("SELECT (SELECT (SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'QCACHE_HITS')/(SELECT SUM(G.VARIABLE_VALUE) FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME IN ('QCACHE_HITS','QCACHE_INSERTS','QCACHE_NOT_CACHED')) * 100) AS rate").and_return(double.as_null_object)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should output red color of char if rate is unknown" do
|
63
|
-
conn_mock.should_receive(:query).and_return(nil)
|
64
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[31munknown\e[m\n")
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should output red color of char if rate < 20" do
|
68
|
-
conn_mock.should_receive(:query).and_return([{'rate' => 10}])
|
69
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[31m10 %\e[m\n")
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should output green color of char if rate >= 20" do
|
73
|
-
conn_mock.should_receive(:query).and_return([{'rate' => 20}])
|
74
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[32m20 %\e[m\n")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "#innodb_buffer_hit_rate" do
|
79
|
-
let(:args) {["innodb_buffer_hit_rate"]}
|
80
|
-
|
81
|
-
before do
|
82
|
-
conn_mock.stub(:query).and_return(double.as_null_object)
|
83
|
-
Mycmd::Configuration.stub(:connect).and_return(conn_mock)
|
84
|
-
end
|
85
|
-
|
86
|
-
after do
|
87
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).not_to be_nil
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should call Configuration.#connect" do
|
91
|
-
Mycmd::Configuration.should_receive(:connect).and_return(conn_mock)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should output the innodb buffer hit rate" do
|
95
|
-
conn_mock.should_receive(:query).with("SELECT (1 - ((SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READS')/(SELECT G.VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS AS G WHERE G.VARIABLE_NAME = 'INNODB_BUFFER_POOL_READ_REQUESTS'))) * 100 AS rate").and_return(double.as_null_object)
|
96
|
-
end
|
97
|
-
|
98
|
-
it "should output red color of char if rate is unknown" do
|
99
|
-
conn_mock.should_receive(:query).and_return(nil)
|
100
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[31munknown\e[m\n")
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should output red color of char if rate < 90" do
|
104
|
-
conn_mock.should_receive(:query).and_return([{'rate' => 80}])
|
105
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[31m80 %\e[m\n")
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should output green color of char if rate >= 90" do
|
109
|
-
conn_mock.should_receive(:query).and_return([{'rate' => 90}])
|
110
|
-
expect(capture(:stdout){Mycmd::StatusCommands.start(args)}).to eq("\e[32m90 %\e[m\n")
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|