sdbcli 0.3.9 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -0
- data/bin/sdbcli +38 -4
- metadata +48 -50
- data/bin/sdbcli.orig +0 -188
- data/lib/sdbcli/sdb-runner.rb.orig +0 -109
data/README
CHANGED
@@ -17,6 +17,7 @@ https://bitbucket.org/winebarrel/sdbcli
|
|
17
17
|
-s, --secret-key=SECRET_KEY
|
18
18
|
-r, --region=REGION
|
19
19
|
-e, --eval=COMMAND
|
20
|
+
-f, --format=YAML_OR_JSON
|
20
21
|
shell> export AWS_ACCESS_KEY_ID='...'
|
21
22
|
shell> export AWS_SECRET_ACCESS_KEY='...'
|
22
23
|
shell> export SDB_ENDPOINT='sdb.ap-northeast-1.amazonaws.com' # or REGION_NAME=ap-northeast-1
|
@@ -24,6 +25,11 @@ https://bitbucket.org/winebarrel/sdbcli
|
|
24
25
|
---
|
25
26
|
- test
|
26
27
|
- test-2
|
28
|
+
shell> sdbcli -f json -e 'show domains'
|
29
|
+
[
|
30
|
+
"test",
|
31
|
+
"test-2"
|
32
|
+
]
|
27
33
|
shell> sdbcli # show prompt
|
28
34
|
|
29
35
|
== Example
|
data/bin/sdbcli
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
|
3
3
|
|
4
|
-
Version = '0.
|
4
|
+
Version = '0.4.0'
|
5
5
|
HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
|
6
6
|
HISTSIZE = 500
|
7
7
|
|
@@ -13,17 +13,20 @@ require 'readline'
|
|
13
13
|
require 'strscan'
|
14
14
|
require 'syck' if /\A1\.9/ =~ RUBY_VERSION
|
15
15
|
require 'yaml'
|
16
|
+
require 'json'
|
16
17
|
|
17
18
|
access_key_id = ENV['AWS_ACCESS_KEY_ID']
|
18
19
|
secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
|
19
20
|
sdb_endpoint = ENV['SDB_ENDPOINT'] || ENV['REGION_NAME'] || 'sdb.amazonaws.com'
|
20
21
|
command = nil
|
22
|
+
$format = :yaml
|
21
23
|
|
22
24
|
ARGV.options do |opt|
|
23
25
|
opt.on('-k', '--access-key=ACCESS_KEY') {|v| access_key_id = v }
|
24
26
|
opt.on('-s', '--secret-key=SECRET_KEY') {|v| secret_access_key = v }
|
25
27
|
opt.on('-r', '--region=REGION') {|v| sdb_endpoint = v }
|
26
28
|
opt.on('-e', '--eval=COMMAND') {|v| command = v }
|
29
|
+
opt.on('-f', '--format=YAML_OR_JSON', [:yaml, :json]) {|v| $format = v }
|
27
30
|
opt.parse!
|
28
31
|
|
29
32
|
unless access_key_id and secret_access_key and sdb_endpoint
|
@@ -35,7 +38,16 @@ end
|
|
35
38
|
$runner = SimpleDB::Runner.new(access_key_id, secret_access_key, sdb_endpoint)
|
36
39
|
|
37
40
|
def output_error(msg)
|
38
|
-
$
|
41
|
+
case $format
|
42
|
+
when :yaml
|
43
|
+
msg = "# #{msg}\n\n"
|
44
|
+
when :json
|
45
|
+
msg = "// #{msg}\n\n"
|
46
|
+
else
|
47
|
+
msg = "# #{msg}\n\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
$stderr.puts msg
|
39
51
|
end
|
40
52
|
|
41
53
|
def execute(src, show_rows = false)
|
@@ -76,10 +88,32 @@ def execute(src, show_rows = false)
|
|
76
88
|
out = $runner.execute(query, inline)
|
77
89
|
|
78
90
|
if out
|
79
|
-
str =
|
91
|
+
str = nil
|
92
|
+
|
93
|
+
case $format
|
94
|
+
when :yaml
|
95
|
+
str = YAML.dump(out)
|
96
|
+
when :json
|
97
|
+
str = JSON.pretty_generate(out)
|
98
|
+
else
|
99
|
+
output_error('Unknown format')
|
100
|
+
end
|
101
|
+
|
102
|
+
str.sub!(/(?:\r\n|\r|\n)*\Z/, "\n")
|
80
103
|
|
81
104
|
if show_rows and out.kind_of?(Array)
|
82
|
-
|
105
|
+
rows_msg = nil
|
106
|
+
|
107
|
+
case $format
|
108
|
+
when :yaml
|
109
|
+
rows_msg = "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
|
110
|
+
when :json
|
111
|
+
rows_msg = "// #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
|
112
|
+
else
|
113
|
+
rows_msg = "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
|
114
|
+
end
|
115
|
+
|
116
|
+
str << rows_msg
|
83
117
|
end
|
84
118
|
|
85
119
|
str << "\n"
|
metadata
CHANGED
@@ -1,87 +1,85 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sdbcli
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 9
|
10
|
-
version: 0.3.9
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- winebarrel
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-01-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
22
23
|
prerelease: false
|
23
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
24
33
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
32
38
|
type: :runtime
|
33
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
34
46
|
description:
|
35
47
|
email: sgwr_dts@yahoo.co.jp
|
36
|
-
executables:
|
48
|
+
executables:
|
37
49
|
- sdbcli
|
38
50
|
extensions: []
|
39
|
-
|
40
51
|
extra_rdoc_files: []
|
41
|
-
|
42
|
-
files:
|
52
|
+
files:
|
43
53
|
- README
|
44
54
|
- bin/sdbcli
|
45
|
-
- bin/sdbcli.orig
|
46
55
|
- lib/sdbcli/sdb-client.rb
|
47
56
|
- lib/sdbcli/sdb-driver.rb
|
48
57
|
- lib/sdbcli/sdb-parser.tab.rb
|
49
58
|
- lib/sdbcli/sdb-parser.y
|
50
59
|
- lib/sdbcli/sdb-runner.rb
|
51
|
-
- lib/sdbcli/sdb-runner.rb.orig
|
52
60
|
- lib/sdbcli.rb
|
53
61
|
homepage: https://bitbucket.org/winebarrel/sdbcli
|
54
62
|
licenses: []
|
55
|
-
|
56
63
|
post_install_message:
|
57
64
|
rdoc_options: []
|
58
|
-
|
59
|
-
require_paths:
|
65
|
+
require_paths:
|
60
66
|
- lib
|
61
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
68
|
none: false
|
63
|
-
requirements:
|
64
|
-
- -
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
|
67
|
-
|
68
|
-
- 0
|
69
|
-
version: "0"
|
70
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
74
|
none: false
|
72
|
-
requirements:
|
73
|
-
- -
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
|
76
|
-
segments:
|
77
|
-
- 0
|
78
|
-
version: "0"
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
79
|
requirements: []
|
80
|
-
|
81
80
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.8.
|
81
|
+
rubygems_version: 1.8.23
|
83
82
|
signing_key:
|
84
83
|
specification_version: 3
|
85
84
|
summary: sdbcli is an interactive command-line client of Amazon SimpleDB.
|
86
85
|
test_files: []
|
87
|
-
|
data/bin/sdbcli.orig
DELETED
@@ -1,188 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
|
3
|
-
|
4
|
-
Version = '0.3.8'
|
5
|
-
HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
|
6
|
-
HISTSIZE = 500
|
7
|
-
|
8
|
-
require 'rubygems'
|
9
|
-
require 'sdbcli'
|
10
|
-
|
11
|
-
require 'optparse'
|
12
|
-
require 'readline'
|
13
|
-
require 'strscan'
|
14
|
-
require 'syck' if /\A1\.9/ =~ RUBY_VERSION
|
15
|
-
require 'yaml'
|
16
|
-
|
17
|
-
access_key_id = ENV['AWS_ACCESS_KEY_ID']
|
18
|
-
secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
|
19
|
-
sdb_endpoint = ENV['SDB_ENDPOINT'] || ENV['REGION_NAME'] || 'sdb.amazonaws.com'
|
20
|
-
command = nil
|
21
|
-
|
22
|
-
ARGV.options do |opt|
|
23
|
-
opt.on('-k', '--access-key=ACCESS_KEY') {|v| access_key_id = v }
|
24
|
-
opt.on('-s', '--secret-key=SECRET_KEY') {|v| secret_access_key = v }
|
25
|
-
opt.on('-r', '--region=REGION') {|v| sdb_endpoint = v }
|
26
|
-
opt.on('-e', '--eval=COMMAND') {|v| command = v }
|
27
|
-
opt.parse!
|
28
|
-
|
29
|
-
unless access_key_id and secret_access_key and sdb_endpoint
|
30
|
-
puts opt.help
|
31
|
-
exit 1
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
$runner = SimpleDB::Runner.new(access_key_id, secret_access_key, sdb_endpoint)
|
36
|
-
|
37
|
-
def output_error(msg)
|
38
|
-
$stderr.puts "# #{msg}\n\n"
|
39
|
-
end
|
40
|
-
|
41
|
-
def execute(src, show_rows = false)
|
42
|
-
ss = StringScanner.new(src.gsub(%r{/\*/?(?:(?:\r\n|\r|\n)|[^/]|[^*]/)*\*/}m, ''))
|
43
|
-
|
44
|
-
while query = ss.scan_until(/(?:;|\\G)/i)
|
45
|
-
src.replace(ss.rest.strip)
|
46
|
-
query.strip!
|
47
|
-
|
48
|
-
if query =~ /\s*\\G\Z/i
|
49
|
-
query = query.sub(/\s*\\G\Z/i, '')
|
50
|
-
inline = false
|
51
|
-
else
|
52
|
-
query = query.strip.sub(/\s*;\Z/, '')
|
53
|
-
inline = true
|
54
|
-
end
|
55
|
-
|
56
|
-
if query.empty?
|
57
|
-
output_error('No query specified')
|
58
|
-
next
|
59
|
-
end
|
60
|
-
|
61
|
-
out = $runner.execute(query, inline)
|
62
|
-
|
63
|
-
if out
|
64
|
-
str = YAML.dump(out).sub(/(?:\r\n|\r|\n)*\Z/, "\n")
|
65
|
-
|
66
|
-
if show_rows and out.kind_of?(Array)
|
67
|
-
str << "# #{out.length} rows in set\n"
|
68
|
-
end
|
69
|
-
|
70
|
-
str << "\n"
|
71
|
-
puts str
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
ss.rest.strip
|
76
|
-
end
|
77
|
-
|
78
|
-
if not $stdin.tty? or command
|
79
|
-
src = command || $stdin.read.strip
|
80
|
-
|
81
|
-
unless src =~ /\s*(?:;|\\G)\Z/i
|
82
|
-
src << ';'
|
83
|
-
end
|
84
|
-
|
85
|
-
begin
|
86
|
-
execute(src)
|
87
|
-
exit 0
|
88
|
-
rescue => e
|
89
|
-
output_error e.message.strip
|
90
|
-
exit 1
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def help
|
95
|
-
<<-EOS
|
96
|
-
SHOW DOMAINS
|
97
|
-
displays a domain list
|
98
|
-
|
99
|
-
SHOW REGIONS
|
100
|
-
displays a region list
|
101
|
-
|
102
|
-
CREATE domain domain_name
|
103
|
-
creates a domain
|
104
|
-
|
105
|
-
DROP DOMAIN domain_name
|
106
|
-
deletes a domain
|
107
|
-
|
108
|
-
GET [attr_list] FROM domain_name WHERE itemName = '...'
|
109
|
-
gets the attribute of an item
|
110
|
-
|
111
|
-
INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name', 'val1', ...)
|
112
|
-
creates an item
|
113
|
-
|
114
|
-
UPDATE domain_name set attr1 = 'val1', ... WHERE itemName = '...'
|
115
|
-
updates an item
|
116
|
-
|
117
|
-
DELETE [attr1, ...] FROM domain_name WHERE itemName = '...'
|
118
|
-
deletes the attribute of an item or an item
|
119
|
-
|
120
|
-
SELECT output_list FROM domain_name [WHERE expression] [sort_instructions] [LIMIT limit]
|
121
|
-
queries using the SELECT statement
|
122
|
-
see http://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/UsingSelect.html
|
123
|
-
|
124
|
-
DESC domain_name
|
125
|
-
displays information about the domain
|
126
|
-
|
127
|
-
USE region_or_endpoint
|
128
|
-
changes an endpoint
|
129
|
-
|
130
|
-
EOS
|
131
|
-
end
|
132
|
-
|
133
|
-
if File.exist?(HISTORY_FILE)
|
134
|
-
open(HISTORY_FILE) do |f|
|
135
|
-
f.each_line do |line|
|
136
|
-
line = line.strip
|
137
|
-
Readline::HISTORY.push(line) unless line.empty?
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
at_exit do
|
143
|
-
unless Readline::HISTORY.empty?
|
144
|
-
open(HISTORY_FILE, 'wb') do |f|
|
145
|
-
(Readline::HISTORY.to_a.slice(-(Readline::HISTORY.length < HISTSIZE ? Readline::HISTORY.length : HISTSIZE)..-1) || []).each do |line|
|
146
|
-
next if /\A\s*\Z/ =~ line
|
147
|
-
f.puts line
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
src = ''
|
154
|
-
prompt1 = lambda { "#{$runner.region || 'unknown'}> " }
|
155
|
-
prompt2 = lambda { "#{' ' * (($runner.region || 'unknown').length - 1)}-> " }
|
156
|
-
prompt = prompt1.call
|
157
|
-
|
158
|
-
while buf = Readline.readline(prompt, true)
|
159
|
-
if /\A\s*\Z/ =~ buf
|
160
|
-
Readline::HISTORY.pop
|
161
|
-
next
|
162
|
-
end
|
163
|
-
|
164
|
-
if src.empty? and buf =~ /\A\.(.+)/
|
165
|
-
r = /\A#{Regexp.compile($1.downcase)}/
|
166
|
-
|
167
|
-
if r =~ 'help'
|
168
|
-
puts help
|
169
|
-
elsif r =~ 'exit' or r =~ 'quit'
|
170
|
-
exit
|
171
|
-
elsif r =~ 'version'
|
172
|
-
puts "sdbcli #{Version}"
|
173
|
-
else
|
174
|
-
output_error('Unknown command')
|
175
|
-
end
|
176
|
-
else
|
177
|
-
rv = nil
|
178
|
-
|
179
|
-
begin
|
180
|
-
src << (' ' + buf)
|
181
|
-
execute(src, true)
|
182
|
-
rescue => e
|
183
|
-
output_error e.message.strip
|
184
|
-
end
|
185
|
-
|
186
|
-
prompt = src.empty? ? prompt1.call : prompt2.call
|
187
|
-
end
|
188
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
require 'sdbcli/sdb-driver'
|
2
|
-
require 'sdbcli/sdb-parser.tab'
|
3
|
-
|
4
|
-
module SimpleDB
|
5
|
-
class Error < StandardError; end
|
6
|
-
|
7
|
-
REGIONS = {
|
8
|
-
'sdb.amazonaws.com' => 'us-east-1',
|
9
|
-
'sdb.us-west-1.amazonaws.com' => 'us-west-1',
|
10
|
-
'sdb.us-west-2.amazonaws.com' => 'us-west-2',
|
11
|
-
'sdb.eu-west-1.amazonaws.com' => 'eu-west-1',
|
12
|
-
'sdb.ap-southeast-1.amazonaws.com' => 'ap-southeast-1',
|
13
|
-
'sdb.ap-southeast-2.amazonaws.com' => 'ap-southeast-2',
|
14
|
-
'sdb.ap-northeast-1.amazonaws.com' => 'ap-northeast-1',
|
15
|
-
'sdb.sa-east-1.amazonaws.com' => 'sa-east-1',
|
16
|
-
}
|
17
|
-
|
18
|
-
class Runner
|
19
|
-
def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
|
20
|
-
endpoint = region_to_endpoint(endpoint)
|
21
|
-
@driver = Driver.new(accessKeyId, secretAccessKey, endpoint)
|
22
|
-
end
|
23
|
-
|
24
|
-
def endpoint
|
25
|
-
@driver.endpoint
|
26
|
-
end
|
27
|
-
|
28
|
-
def endpoint=(v)
|
29
|
-
v = region_to_endpoint(v)
|
30
|
-
@driver.endpoint = v
|
31
|
-
end
|
32
|
-
|
33
|
-
def region
|
34
|
-
REGIONS[endpoint]
|
35
|
-
end
|
36
|
-
|
37
|
-
def execute(query, inline = true)
|
38
|
-
parsed = Parser.parse(query)
|
39
|
-
p parsed
|
40
|
-
command = parsed.class.name.split('::').last.to_sym
|
41
|
-
|
42
|
-
case command
|
43
|
-
when :GET
|
44
|
-
item = @driver.get(parsed.domain, parsed.item_name, parsed.attr_names)
|
45
|
-
|
46
|
-
if inline
|
47
|
-
def item.to_yaml_style; :inline; end
|
48
|
-
end
|
49
|
-
|
50
|
-
item
|
51
|
-
when :INSERT
|
52
|
-
@driver.insert(parsed.domain, parsed.item_name, parsed.attrs)
|
53
|
-
nil
|
54
|
-
when :UPDATE
|
55
|
-
@driver.update(parsed.domain, parsed.items)
|
56
|
-
nil
|
57
|
-
when :DELETE
|
58
|
-
@driver.delete(parsed.domain, parsed.items)
|
59
|
-
nil
|
60
|
-
when :SELECT
|
61
|
-
items = @driver.select(parsed.query)
|
62
|
-
|
63
|
-
if inline
|
64
|
-
items.each do |item|
|
65
|
-
def item.to_yaml_style; :inline; end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
items
|
70
|
-
when :CREATE
|
71
|
-
@driver.create_domain(parsed.domain)
|
72
|
-
nil
|
73
|
-
when :DROP
|
74
|
-
@driver.drop_domain(parsed.domain)
|
75
|
-
nil
|
76
|
-
when :SHOW
|
77
|
-
case parsed.operand
|
78
|
-
when :domains
|
79
|
-
@driver.show_domains
|
80
|
-
when :regions
|
81
|
-
SimpleDB::REGIONS.values.sort
|
82
|
-
else
|
83
|
-
raise 'must not happen'
|
84
|
-
end
|
85
|
-
when :USE
|
86
|
-
self.endpoint = parsed.endpoint
|
87
|
-
nil
|
88
|
-
when :DESCRIBE
|
89
|
-
@driver.describe(parsed.domain)
|
90
|
-
else
|
91
|
-
raise 'must not happen'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def region_to_endpoint(region)
|
98
|
-
if /\A[^.]+\Z/ =~ region
|
99
|
-
region = SimpleDB::REGIONS.find {|k, v| v == region }
|
100
|
-
raise SimpleDB::Error, 'Unknown region' unless region
|
101
|
-
region = region.first
|
102
|
-
end
|
103
|
-
|
104
|
-
raise SimpleDB::Error, 'Unknown endpoint' unless SimpleDB::REGIONS[region]
|
105
|
-
|
106
|
-
return region
|
107
|
-
end
|
108
|
-
end # Runner
|
109
|
-
end # SimpleDB
|