sdbcli 0.3.8 → 0.3.9

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/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.8'
4
+ Version = '0.3.9'
5
5
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
6
  HISTSIZE = 500
7
7
 
@@ -40,39 +40,58 @@ end
40
40
 
41
41
  def execute(src, show_rows = false)
42
42
  ss = StringScanner.new(src.dup)
43
+ buf = ''
44
+
45
+ until ss.eos?
46
+ if (tok = ss.scan %r{[^-`'";\\/#]+})
47
+ buf << tok
48
+ elsif (tok = ss.scan /`(?:[^`]|``)*`/)
49
+ buf << tok
50
+ elsif (tok = ss.scan /'(?:[^']|'')*'/) #'
51
+ buf << tok
52
+ elsif (tok = ss.scan /"(?:[^"]|"")*"/) #"
53
+ buf << tok
54
+ elsif (tok = ss.scan %r{/\*/?(\n|[^/]|[^*]/)*\*/})
55
+ # nothing to do
56
+ elsif (tok = ss.scan /--[^\r\n]*(?:\r\n|\r|\n|\Z)/)
57
+ # nothing to do
58
+ elsif (tok = ss.scan /#[^\r\n]*(?:\r\n|\r|\n|\Z)/)
59
+ # nothing to do
60
+ elsif (tok = ss.scan /(?:;|\\G)/)
61
+ src.replace(ss.rest)
62
+ query = buf
63
+ buf = ''
64
+
65
+ if tok == '\G'
66
+ inline = false
67
+ else
68
+ inline = true
69
+ end
43
70
 
44
- while query = ss.scan_until(/(?:;|\\G)/i)
45
- src.replace(ss.rest.strip)
46
- query.strip!
71
+ if query.strip.empty?
72
+ output_error('No query specified')
73
+ next
74
+ end
47
75
 
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
76
+ out = $runner.execute(query, inline)
55
77
 
56
- if query.empty?
57
- output_error('No query specified')
58
- next
59
- end
78
+ if out
79
+ str = YAML.dump(out).sub(/(?:\r\n|\r|\n)*\Z/, "\n")
60
80
 
61
- out = $runner.execute(query, inline)
81
+ if show_rows and out.kind_of?(Array)
82
+ str << "# #{out.length} #{out.length > 1 ? 'rows' : 'row'} in set\n"
83
+ end
62
84
 
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"
85
+ str << "\n"
86
+ puts str
68
87
  end
69
-
70
- str << "\n"
71
- puts str
88
+ elsif (tok = ss.scan /./)
89
+ buf << tok
72
90
  end
73
91
  end
74
92
 
75
- ss.rest.strip
93
+ src.replace(buf.strip)
94
+ buf
76
95
  end
77
96
 
78
97
  if not $stdin.tty? or command
@@ -177,7 +196,12 @@ while buf = Readline.readline(prompt, true)
177
196
  rv = nil
178
197
 
179
198
  begin
180
- src << (' ' + buf)
199
+ if src.empty?
200
+ src << buf
201
+ else
202
+ src << ("\n" + buf)
203
+ end
204
+
181
205
  execute(src, true)
182
206
  rescue => e
183
207
  output_error e.message.strip
data/bin/sdbcli.orig ADDED
@@ -0,0 +1,188 @@
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
@@ -10,14 +10,14 @@ module SimpleDB
10
10
  'sdb.us-west-2.amazonaws.com' => 'us-west-2',
11
11
  'sdb.eu-west-1.amazonaws.com' => 'eu-west-1',
12
12
  'sdb.ap-southeast-1.amazonaws.com' => 'ap-southeast-1',
13
+ 'sdb.ap-southeast-2.amazonaws.com' => 'ap-southeast-2',
13
14
  'sdb.ap-northeast-1.amazonaws.com' => 'ap-northeast-1',
14
15
  'sdb.sa-east-1.amazonaws.com' => 'sa-east-1',
15
16
  }
16
17
 
17
18
  class Runner
18
- attr_reader :driver
19
-
20
19
  def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
20
+ endpoint = region_to_endpoint(endpoint)
21
21
  @driver = Driver.new(accessKeyId, secretAccessKey, endpoint)
22
22
  end
23
23
 
@@ -26,6 +26,7 @@ module SimpleDB
26
26
  end
27
27
 
28
28
  def endpoint=(v)
29
+ v = region_to_endpoint(v)
29
30
  @driver.endpoint = v
30
31
  end
31
32
 
@@ -35,6 +36,7 @@ module SimpleDB
35
36
 
36
37
  def execute(query, inline = true)
37
38
  parsed = Parser.parse(query)
39
+ p parsed
38
40
  command = parsed.class.name.split('::').last.to_sym
39
41
 
40
42
  case command
@@ -72,12 +74,36 @@ module SimpleDB
72
74
  @driver.drop_domain(parsed.domain)
73
75
  nil
74
76
  when :SHOW
75
- @driver.show_domains
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
76
88
  when :DESCRIBE
77
89
  @driver.describe(parsed.domain)
78
90
  else
79
91
  raise 'must not happen'
80
92
  end
81
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
82
108
  end # Runner
83
109
  end # SimpleDB
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdbcli
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 8
10
- version: 0.3.8
9
+ - 9
10
+ version: 0.3.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - winebarrel
@@ -42,6 +42,7 @@ extra_rdoc_files: []
42
42
  files:
43
43
  - README
44
44
  - bin/sdbcli
45
+ - bin/sdbcli.orig
45
46
  - lib/sdbcli/sdb-client.rb
46
47
  - lib/sdbcli/sdb-driver.rb
47
48
  - lib/sdbcli/sdb-parser.tab.rb