itds 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +13 -0
- data/README.md +31 -11
- data/Rakefile +4 -0
- data/itds.gemspec +1 -0
- data/lib/itds/client.rb +8 -2
- data/lib/itds/repl.rb +58 -9
- data/lib/itds/version.rb +1 -1
- data/spec/itds/client_spec.rb +21 -0
- data/spec/spec_helper.rb +2 -0
- metadata +24 -3
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,24 @@
|
|
1
|
-
# Itds
|
1
|
+
# Itds [![CI] (https://travis-ci.org/andl/itds.svg?branch=master)] (https://travis-ci.org/andl/itds)
|
2
2
|
|
3
|
-
A
|
3
|
+
A deadly simple SQL server CLI tools just to ease the developer working on Mac or Linux.
|
4
|
+
|
5
|
+
# Dependency
|
6
|
+
|
7
|
+
Install freetds using the package manager of your system.
|
8
|
+
## Mac
|
9
|
+
```
|
10
|
+
$homebrew install freetds
|
11
|
+
```
|
12
|
+
|
13
|
+
## Ubuntu
|
14
|
+
```
|
15
|
+
$sudo apt-get install freetds-dev
|
16
|
+
```
|
17
|
+
|
18
|
+
# Install
|
19
|
+
```
|
20
|
+
$gem install itds
|
21
|
+
```
|
4
22
|
|
5
23
|
# Usage
|
6
24
|
|
@@ -11,7 +29,7 @@ $itds --help
|
|
11
29
|
|
12
30
|
Command parameters:
|
13
31
|
```
|
14
|
-
$itds -h <hostname> -
|
32
|
+
$itds -h <hostname> -p <password> -u <username> -d <contained_database> [SQL]
|
15
33
|
```
|
16
34
|
|
17
35
|
Execute a command
|
@@ -24,15 +42,17 @@ $itds -h <hostname> -d <database> select 1
|
|
24
42
|
+---+
|
25
43
|
```
|
26
44
|
|
27
|
-
|
45
|
+
Cancel a request in interactive mode.
|
28
46
|
```
|
29
47
|
$itds -h <hostname> -d <mydb>
|
30
|
-
mydb>
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
|
35
|
-
|
36
|
-
|
48
|
+
mydb> waitfor delay '00:00:04'
|
49
|
+
^C
|
50
|
+
mydb> select * from test
|
51
|
+
+----+
|
52
|
+
| id |
|
53
|
+
+----+
|
54
|
+
| 10 |
|
55
|
+
+----+
|
56
|
+
mydb> ^C
|
37
57
|
$
|
38
58
|
```
|
data/Rakefile
CHANGED
data/itds.gemspec
CHANGED
data/lib/itds/client.rb
CHANGED
@@ -8,15 +8,21 @@ module Itds
|
|
8
8
|
def_delegators :@backend, :close
|
9
9
|
|
10
10
|
DEFAULT_OPTS = {
|
11
|
-
port:
|
11
|
+
port: 1433,
|
12
12
|
username: 'sa',
|
13
|
+
timeout: 5,
|
13
14
|
}
|
14
15
|
|
15
16
|
def initialize(opts={})
|
16
17
|
opts = DEFAULT_OPTS.merge(opts)
|
17
18
|
opts[:azure] = true if(opts[:database])
|
19
|
+
opts[:login_timeout] = opts[:timeout]
|
18
20
|
|
19
|
-
@backend =
|
21
|
+
@backend = new_backend(opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
def new_backend(opts)
|
25
|
+
TinyTds::Client.new(opts)
|
20
26
|
end
|
21
27
|
|
22
28
|
def execute(sql)
|
data/lib/itds/repl.rb
CHANGED
@@ -8,15 +8,24 @@ module Itds
|
|
8
8
|
def config(options)
|
9
9
|
@options = options
|
10
10
|
@client = Client.new(options)
|
11
|
-
self
|
12
11
|
end
|
13
12
|
|
14
13
|
def run
|
14
|
+
print_help
|
15
|
+
|
15
16
|
while cmd = Readline.readline(prompt, true)
|
16
17
|
execute_cmd(cmd)
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
21
|
+
def print_help
|
22
|
+
msg = <<-EOT
|
23
|
+
itds SQL server interactive console.
|
24
|
+
Press Ctrl-C to cancel current query, press again to quit.
|
25
|
+
EOT
|
26
|
+
puts msg
|
27
|
+
end
|
28
|
+
|
20
29
|
def prompt
|
21
30
|
@prompt ||= "#{@options[:database]}> "
|
22
31
|
end
|
@@ -24,10 +33,19 @@ module Itds
|
|
24
33
|
def execute_cmd(cmd)
|
25
34
|
begin
|
26
35
|
stop if cmd == "exit"
|
27
|
-
res = @client.execute(cmd)
|
28
|
-
print_result(res)
|
36
|
+
@res = @client.execute(cmd)
|
37
|
+
print_result(@res)
|
29
38
|
rescue => e
|
30
39
|
print_err(e)
|
40
|
+
ensure
|
41
|
+
cancel_request
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def cancel_request
|
46
|
+
if @res
|
47
|
+
@res.cancel
|
48
|
+
@res = nil
|
31
49
|
end
|
32
50
|
end
|
33
51
|
|
@@ -38,15 +56,42 @@ module Itds
|
|
38
56
|
rows << rowset.values
|
39
57
|
end
|
40
58
|
|
41
|
-
|
42
|
-
|
59
|
+
output = {}
|
60
|
+
output[:headings] = fields unless fields.empty?
|
61
|
+
output[:rows] = rows unless rows.empty?
|
62
|
+
|
63
|
+
unless output.empty?
|
64
|
+
puts Terminal::Table.new output
|
65
|
+
end
|
66
|
+
|
67
|
+
print_affected_row(res)
|
68
|
+
end
|
69
|
+
|
70
|
+
def print_affected_row(res)
|
71
|
+
# tiny_tds seems not only return affected_rows for update/delete
|
72
|
+
# but also select.
|
73
|
+
affected = res.affected_rows
|
74
|
+
|
75
|
+
if affected > 0
|
76
|
+
puts ""
|
77
|
+
puts "Affected Rows: #{affected}"
|
78
|
+
end
|
43
79
|
end
|
44
80
|
|
45
81
|
def print_err(err)
|
46
82
|
puts "Error: #{err.message}"
|
47
83
|
end
|
48
84
|
|
85
|
+
def singal
|
86
|
+
if @res
|
87
|
+
cancel_request
|
88
|
+
else
|
89
|
+
stop
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
49
93
|
def stop
|
94
|
+
@client.close
|
50
95
|
exit
|
51
96
|
end
|
52
97
|
end
|
@@ -65,7 +110,7 @@ module Itds
|
|
65
110
|
options[:host] = h
|
66
111
|
end
|
67
112
|
|
68
|
-
opts.on("-
|
113
|
+
opts.on("-P", "--port [PORT]", Integer, "port number, default is 1433") do |p|
|
69
114
|
options[:port] = p
|
70
115
|
end
|
71
116
|
|
@@ -77,10 +122,14 @@ module Itds
|
|
77
122
|
options[:database] = d
|
78
123
|
end
|
79
124
|
|
80
|
-
opts.on("-
|
125
|
+
opts.on("-p", "--password [PASSWORD]", "optional password") do |p|
|
81
126
|
options[:password] = p
|
82
127
|
end
|
83
128
|
|
129
|
+
opts.on("--timeout [TIMEOUT]", "connect and query timeout, 5 secs by default") do |t|
|
130
|
+
options[:timeout] = t
|
131
|
+
end
|
132
|
+
|
84
133
|
opts.on_tail("--help", "show this help message") do
|
85
134
|
puts opts
|
86
135
|
exit
|
@@ -105,8 +154,8 @@ module Itds
|
|
105
154
|
end
|
106
155
|
|
107
156
|
Repl.config(options)
|
108
|
-
if args.empty?
|
109
|
-
trap("INT") {
|
157
|
+
if args.empty? #interactive
|
158
|
+
trap("INT") { Repl.singal }
|
110
159
|
Repl.run
|
111
160
|
else
|
112
161
|
Repl.execute_cmd(args.join(" "))
|
data/lib/itds/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Itds
|
4
|
+
describe Client do
|
5
|
+
|
6
|
+
it "able to set login timeout" do
|
7
|
+
timeout = 2
|
8
|
+
t = Thread.new do
|
9
|
+
Client.new(
|
10
|
+
{
|
11
|
+
host: localhost,
|
12
|
+
timeout: timeout,
|
13
|
+
}
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
sleep(timeout + 1)
|
18
|
+
t.alive?.should be_false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tiny_tds
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description:
|
79
95
|
email:
|
80
96
|
- liusandrew@gmail.com
|
@@ -84,6 +100,7 @@ extensions: []
|
|
84
100
|
extra_rdoc_files: []
|
85
101
|
files:
|
86
102
|
- .gitignore
|
103
|
+
- .travis.yml
|
87
104
|
- Gemfile
|
88
105
|
- LICENSE.txt
|
89
106
|
- README.md
|
@@ -94,6 +111,8 @@ files:
|
|
94
111
|
- lib/itds/client.rb
|
95
112
|
- lib/itds/repl.rb
|
96
113
|
- lib/itds/version.rb
|
114
|
+
- spec/itds/client_spec.rb
|
115
|
+
- spec/spec_helper.rb
|
97
116
|
homepage: http://github.com/andl/itds
|
98
117
|
licenses:
|
99
118
|
- MIT
|
@@ -119,5 +138,7 @@ rubygems_version: 1.8.23
|
|
119
138
|
signing_key:
|
120
139
|
specification_version: 3
|
121
140
|
summary: A very simple SQL server client.
|
122
|
-
test_files:
|
141
|
+
test_files:
|
142
|
+
- spec/itds/client_spec.rb
|
143
|
+
- spec/spec_helper.rb
|
123
144
|
has_rdoc:
|