ddbcli 0.2.1 → 0.2.2
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.
- data/README +3 -3
- data/bin/ddbcli +1 -1
- data/lib/ddbcli/cli/help.rb +3 -3
- data/lib/ddbcli/cli/options.rb +10 -0
- data/lib/ddbcli/ddb-client.rb +18 -8
- data/lib/ddbcli/ddb-driver.rb +18 -1
- data/lib/ddbcli/ddb-parser.tab.rb +29 -3
- data/lib/ddbcli/ddb-parser.y +29 -3
- metadata +2 -2
data/README
CHANGED
@@ -85,9 +85,9 @@ https://bitbucket.org/winebarrel/ddbcli
|
|
85
85
|
DELETE ALL FROM table_name WHERE [WHERE attr1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
|
86
86
|
deletes items
|
87
87
|
|
88
|
-
SELECT {*|
|
89
|
-
SELECT ALL {*|
|
90
|
-
SELECT segment/total_segments {*|
|
88
|
+
SELECT {*|attr1,attr2,...|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
|
89
|
+
SELECT ALL {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
|
90
|
+
SELECT segment/total_segments {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
|
91
91
|
queries using the Query/Scan action
|
92
92
|
see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html
|
93
93
|
|
data/bin/ddbcli
CHANGED
data/lib/ddbcli/cli/help.rb
CHANGED
@@ -50,9 +50,9 @@ DELETE FROM table_name WHERE key1 = '...' AND ..
|
|
50
50
|
DELETE ALL FROM table_name WHERE [WHERE attr1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
|
51
51
|
deletes items
|
52
52
|
|
53
|
-
SELECT {*|
|
54
|
-
SELECT ALL {*|
|
55
|
-
SELECT segment/total_segments {*|
|
53
|
+
SELECT {*|attr1,attr2,...|COUNT(*)} FROM table_name [USE INDEX (index_name)] [WHERE key1 = '...' AND ...] [ORDER {ASC|DESC}] [LIMIT limit]
|
54
|
+
SELECT ALL {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
|
55
|
+
SELECT segment/total_segments {*|attr1,attr2,...|COUNT(*)} FROM table_name [WHERE attr1 = '...' AND ...] [LIMIT limit]
|
56
56
|
queries using the Query/Scan action
|
57
57
|
see http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html
|
58
58
|
|
data/lib/ddbcli/cli/options.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'ostruct'
|
3
|
+
require 'uri'
|
3
4
|
|
4
5
|
def parse_options
|
5
6
|
options = OpenStruct.new
|
@@ -20,6 +21,15 @@ def parse_options
|
|
20
21
|
opt.on('-k', '--access-key=ACCESS_KEY') {|v| options.access_key_id = v }
|
21
22
|
opt.on('-s', '--secret-key=SECRET_KEY') {|v| options.secret_access_key = v }
|
22
23
|
opt.on('-r', '--region=REGION_OR_ENDPOINT') {|v| options.ddb_endpoint_or_region = v }
|
24
|
+
|
25
|
+
opt.on('', '--uri=URI') {|v|
|
26
|
+
uri = v
|
27
|
+
uri = "http://#{uri}" unless uri =~ %r|\A\w+://|
|
28
|
+
uri = URI.parse(uri)
|
29
|
+
raise URI::InvalidURIError, "invalid shceme: #{v}" unless /\Ahttps?\Z/ =~ uri.scheme
|
30
|
+
options.ddb_endpoint_or_region = uri
|
31
|
+
}
|
32
|
+
|
23
33
|
opt.on('-e', '--eval=COMMAND') {|v| options.command = v }
|
24
34
|
opt.on('-t', '--timeout=SECOND', Integer) {|v| options.timeout = v.to_i }
|
25
35
|
|
data/lib/ddbcli/ddb-client.rb
CHANGED
@@ -5,6 +5,7 @@ require 'time'
|
|
5
5
|
require 'stringio'
|
6
6
|
require 'zlib'
|
7
7
|
require 'pp'
|
8
|
+
require 'uri'
|
8
9
|
|
9
10
|
require 'ddbcli/ddb-error'
|
10
11
|
require 'ddbcli/ddb-endpoint'
|
@@ -18,7 +19,6 @@ module DynamoDB
|
|
18
19
|
|
19
20
|
DEFAULT_TIMEOUT = 60
|
20
21
|
|
21
|
-
attr_reader :endpoint
|
22
22
|
attr_reader :region
|
23
23
|
attr_accessor :timeout
|
24
24
|
attr_accessor :retry_num
|
@@ -36,7 +36,13 @@ module DynamoDB
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def set_endpoint_and_region(endpoint_or_region)
|
39
|
-
|
39
|
+
if endpoint_or_region.kind_of?(URI)
|
40
|
+
@endpoint = endpoint_or_region
|
41
|
+
@region = [@endpoint.host, @endpoint.port].join(':')
|
42
|
+
else
|
43
|
+
host, @region = DynamoDB::Endpoint.endpoint_and_region(endpoint_or_region)
|
44
|
+
@endpoint = URI.parse("https://#{host}")
|
45
|
+
end
|
40
46
|
end
|
41
47
|
|
42
48
|
def query(action, hash)
|
@@ -73,16 +79,20 @@ EOS
|
|
73
79
|
headers['Authorization'] = authorization(date, headers, req_body)
|
74
80
|
|
75
81
|
Net::HTTP.version_1_2
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
http = Net::HTTP.new(@endpoint.host, @endpoint.port)
|
83
|
+
|
84
|
+
if @endpoint.scheme == 'https'
|
85
|
+
http.use_ssl = true
|
86
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
87
|
+
end
|
88
|
+
|
89
|
+
http.open_timeout = @timeout
|
90
|
+
http.read_timeout = @timeout
|
81
91
|
|
82
92
|
res_code = nil
|
83
93
|
res_msg = nil
|
84
94
|
|
85
|
-
res_body =
|
95
|
+
res_body = http.start do |w|
|
86
96
|
req = Net::HTTP::Post.new('/', headers)
|
87
97
|
req.body = req_body
|
88
98
|
res = w.request(req)
|
data/lib/ddbcli/ddb-driver.rb
CHANGED
@@ -198,6 +198,12 @@ module DynamoDB
|
|
198
198
|
%w(TableStatus ItemCount TableSizeBytes).each do |i|
|
199
199
|
h[table_name][i] = table_info[i]
|
200
200
|
end
|
201
|
+
|
202
|
+
provisioned_throughput = table_info['ProvisionedThroughput']
|
203
|
+
|
204
|
+
%w(ReadCapacityUnits WriteCapacityUnits).each do |i|
|
205
|
+
h[table_name][i] = provisioned_throughput[i]
|
206
|
+
end
|
201
207
|
end
|
202
208
|
|
203
209
|
return h
|
@@ -284,7 +290,18 @@ module DynamoDB
|
|
284
290
|
end
|
285
291
|
|
286
292
|
def do_use(parsed)
|
287
|
-
|
293
|
+
eor = parsed.endpoint_or_region
|
294
|
+
|
295
|
+
if %r|\A\w+://| =~ eor or /:\d+\Z/ =~ eor
|
296
|
+
eor = "http://#{eor}" unless eor =~ %r|\A\w+://|
|
297
|
+
eor = URI.parse(eor)
|
298
|
+
|
299
|
+
unless /\Ahttps?\Z/ =~ eor.scheme
|
300
|
+
raise URI::InvalidURIError, "invalid shceme: #{parsed.endpoint_or_region}"
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
set_endpoint_and_region(eor)
|
288
305
|
nil
|
289
306
|
end
|
290
307
|
|
@@ -92,6 +92,7 @@ private :struct
|
|
92
92
|
|
93
93
|
def scan
|
94
94
|
tok = nil
|
95
|
+
@prev_tokens = []
|
95
96
|
|
96
97
|
until @ss.eos?
|
97
98
|
if (tok = @ss.scan /\s+/)
|
@@ -133,21 +134,46 @@ def scan
|
|
133
134
|
yield [:RUBY_SCRIPT, tok.slice(1..-1)]
|
134
135
|
elsif (tok = @ss.scan /\!(?:.*)/)
|
135
136
|
yield [:SHELL_SCRIPT, tok.slice(1..-1)]
|
136
|
-
elsif (tok = @ss.scan
|
137
|
+
elsif (tok = @ss.scan %r|[-.0-9a-z_:/]*|i)
|
137
138
|
yield [:IDENTIFIER, tok]
|
138
139
|
else
|
139
|
-
|
140
|
+
raise_error(tok, @prev_tokens, @ss)
|
140
141
|
end
|
142
|
+
|
143
|
+
@prev_tokens << tok
|
141
144
|
end
|
142
145
|
|
143
|
-
yield [false, '
|
146
|
+
yield [false, '']
|
144
147
|
end
|
145
148
|
private :scan
|
146
149
|
|
150
|
+
def raise_error(error_value, prev_tokens, scanner)
|
151
|
+
errmsg = ["__#{error_value}__"]
|
152
|
+
|
153
|
+
if prev_tokens and not prev_tokens.empty?
|
154
|
+
toks = prev_tokens.reverse[0, 5].reverse
|
155
|
+
toks.unshift('...') if prev_tokens.length > toks.length
|
156
|
+
errmsg.unshift(toks.join.strip) unless toks.empty?
|
157
|
+
end
|
158
|
+
|
159
|
+
if scanner and not (rest = (scanner.rest || '').strip).empty?
|
160
|
+
str = rest[0, 16]
|
161
|
+
str += '...' if rest.length > str.length
|
162
|
+
errmsg << str
|
163
|
+
end
|
164
|
+
|
165
|
+
raise Racc::ParseError, ('parse error on value: %s' % errmsg.join(' '))
|
166
|
+
end
|
167
|
+
private :raise_error
|
168
|
+
|
147
169
|
def parse
|
148
170
|
yyparse self, :scan
|
149
171
|
end
|
150
172
|
|
173
|
+
def on_error(error_token_id, error_value, value_stack)
|
174
|
+
raise_error(error_value, @prev_tokens, @ss)
|
175
|
+
end
|
176
|
+
|
151
177
|
def self.parse(obj)
|
152
178
|
self.new(obj).parse
|
153
179
|
end
|
data/lib/ddbcli/ddb-parser.y
CHANGED
@@ -567,6 +567,7 @@ private :struct
|
|
567
567
|
|
568
568
|
def scan
|
569
569
|
tok = nil
|
570
|
+
@prev_tokens = []
|
570
571
|
|
571
572
|
until @ss.eos?
|
572
573
|
if (tok = @ss.scan /\s+/)
|
@@ -608,21 +609,46 @@ def scan
|
|
608
609
|
yield [:RUBY_SCRIPT, tok.slice(1..-1)]
|
609
610
|
elsif (tok = @ss.scan /\!(?:.*)/)
|
610
611
|
yield [:SHELL_SCRIPT, tok.slice(1..-1)]
|
611
|
-
elsif (tok = @ss.scan
|
612
|
+
elsif (tok = @ss.scan %r|[-.0-9a-z_:/]*|i)
|
612
613
|
yield [:IDENTIFIER, tok]
|
613
614
|
else
|
614
|
-
|
615
|
+
raise_error(tok, @prev_tokens, @ss)
|
615
616
|
end
|
617
|
+
|
618
|
+
@prev_tokens << tok
|
616
619
|
end
|
617
620
|
|
618
|
-
yield [false, '
|
621
|
+
yield [false, '']
|
619
622
|
end
|
620
623
|
private :scan
|
621
624
|
|
625
|
+
def raise_error(error_value, prev_tokens, scanner)
|
626
|
+
errmsg = ["__#{error_value}__"]
|
627
|
+
|
628
|
+
if prev_tokens and not prev_tokens.empty?
|
629
|
+
toks = prev_tokens.reverse[0, 5].reverse
|
630
|
+
toks.unshift('...') if prev_tokens.length > toks.length
|
631
|
+
errmsg.unshift(toks.join.strip) unless toks.empty?
|
632
|
+
end
|
633
|
+
|
634
|
+
if scanner and not (rest = (scanner.rest || '').strip).empty?
|
635
|
+
str = rest[0, 16]
|
636
|
+
str += '...' if rest.length > str.length
|
637
|
+
errmsg << str
|
638
|
+
end
|
639
|
+
|
640
|
+
raise Racc::ParseError, ('parse error on value: %s' % errmsg.join(' '))
|
641
|
+
end
|
642
|
+
private :raise_error
|
643
|
+
|
622
644
|
def parse
|
623
645
|
yyparse self, :scan
|
624
646
|
end
|
625
647
|
|
648
|
+
def on_error(error_token_id, error_value, value_stack)
|
649
|
+
raise_error(error_value, @prev_tokens, @ss)
|
650
|
+
end
|
651
|
+
|
626
652
|
def self.parse(obj)
|
627
653
|
self.new(obj).parse
|
628
654
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddbcli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
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: 2013-
|
12
|
+
date: 2013-09-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|