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