sdbcli 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
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
+