sdbcli 0.2.8 → 0.2.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.
@@ -1,242 +1,253 @@
1
- class Parser
2
- options no_result_var
3
- rule
4
- stmt : get_stmt
5
- | insert_stmt
6
- | update_stmt
7
- | delete_stmt
8
- | select_stmt
9
- | create_stmt
10
- | drop_stmt
11
- | show_stmt
12
- | use_stmt
13
-
14
- get_stmt : GET get_output_list FROM IDENTIFIER WHERE ITEMNAME '=' VALUE
15
- {
16
- struct(:GET, :domain => val[3], :item_name => val[7], :attr_names => val[1])
17
- }
18
-
19
- get_output_list :
20
- {
21
- []
22
- }
23
- | '*'
24
- {
25
- []
26
- }
27
- | identifier_list
28
-
29
- insert_stmt : INSERT INTO IDENTIFIER '(' insert_identifier_list ')' VALUES '(' value_list ')'
30
- {
31
- unless val[4].length == val[8].length
32
- raise Racc::ParseError, 'The number of an attribute and values differs'
33
- end
34
-
35
- attrs = {}
36
- val[4].zip(val[8]).each {|k, v| attrs[k] = v }
37
- item_name = attrs.find {|k, v| k =~ /\AitemName\Z/i }
38
-
39
- unless item_name
40
- raise Racc::ParseError,'itemName is not contained in the INSERT statement'
41
- end
42
-
43
- attrs.delete(item_name[0])
44
- item_name = item_name[1]
45
-
46
- struct(:INSERT, :domain => val[2], :item_name => item_name, :attrs => attrs)
47
- }
48
-
49
-
50
- insert_identifier_list : itemname_identifier
51
- {
52
- [val[0]]
53
- }
54
- | insert_identifier_list ',' itemname_identifier
55
- {
56
- val[0] + [val[2]]
57
- }
58
-
59
- itemname_identifier : ITEMNAME
60
- | IDENTIFIER
61
-
62
- update_stmt : UPDATE IDENTIFIER SET set_clause_list WHERE ITEMNAME '=' VALUE
63
- {
64
- attrs = {}
65
- val[3].each {|k, v| attrs[k] = v }
66
- struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
67
- }
68
-
69
- set_clause_list : set_clause
70
- {
71
- [val[0]]
72
- }
73
- | set_clause_list ',' set_clause
74
- {
75
- val[0] + [val[2]]
76
- }
77
-
78
- set_clause : IDENTIFIER '=' VALUE
79
- {
80
- [val[0], val[2]]
81
- }
82
-
83
- delete_stmt : DELETE delete_attr_list FROM IDENTIFIER WHERE ITEMNAME '=' VALUE
84
- {
85
- struct(:DELETE, :domain => val[3], :items => [[val[7], val[1]]])
86
- }
87
-
88
- delete_attr_list :
89
- {
90
- []
91
- }
92
- | identifier_list
93
-
94
- select_stmt : SELECT
95
- {
96
- struct(:SELECT, :query => val[0])
97
- }
98
-
99
- create_stmt : CREATE DOMAIN IDENTIFIER
100
- {
101
- struct(:CREATE, :domain => val[2])
102
- }
103
-
104
- drop_stmt : DROP DOMAIN IDENTIFIER
105
- {
106
- struct(:DROP, :domain => val[2])
107
- }
108
-
109
- show_stmt : SHOW DOMAINS
110
- {
111
- struct(:SHOW, :operand => :domains)
112
- }
113
-
114
- identifier_list: IDENTIFIER
115
- {
116
- [val[0]]
117
- }
118
- | identifier_list ',' IDENTIFIER
119
- {
120
- val[0] + [val[2]]
121
- }
122
-
123
- value_list : VALUE
124
- {
125
- [val[0]]
126
- }
127
- | value_list ',' VALUE
128
- {
129
- [val[0], val[2]].flatten
130
- }
131
-
132
- ---- header
133
-
134
- require 'strscan'
135
-
136
- module SimpleDB
137
-
138
- ---- inner
139
-
140
- KEYWORDS = %w(
141
- AND
142
- ASC
143
- BETWEEN
144
- BY
145
- CREATE
146
- DELETE
147
- DESC
148
- DOMAINS
149
- DOMAIN
150
- DROP
151
- EVERY
152
- FROM
153
- GET
154
- INSERT
155
- INTERSECTION
156
- INTO
157
- IN
158
- IS
159
- ITEMNAME
160
- LIKE
161
- LIMIT
162
- NOT
163
- ORDER
164
- OR
165
- SET
166
- SHOW
167
- UPDATE
168
- VALUES
169
- WHERE
170
- )
171
-
172
- KEYWORD_REGEXP = Regexp.compile("#{KEYWORDS.join '|'}\\b", Regexp::IGNORECASE)
173
-
174
- def initialize(obj)
175
- src = obj.is_a?(IO) ? obj.read : obj.to_s
176
- @ss = StringScanner.new(src)
177
- end
178
-
179
- @@structs = {}
180
-
181
- def struct(name, attrs = {})
182
- unless (clazz = @@structs[name])
183
- clazz = attrs.empty? ? Struct.new(name.to_s) : Struct.new(name.to_s, *attrs.keys)
184
- @@structs[name] = clazz
185
- end
186
-
187
- obj = clazz.new
188
-
189
- attrs.each do |key, val|
190
- obj.send("#{key}=", val)
191
- end
192
-
193
- return obj
194
- end
195
- private :struct
196
-
197
- def scan
198
- tok = nil
199
-
200
- until @ss.eos?
201
- if (tok = @ss.scan /\s+/)
202
- # nothing to do
203
- elsif (tok = @ss.scan /(?:!=|>=|<=|>|<|=)/)
204
- yield [tok, tok]
205
- elsif (tok = @ss.scan KEYWORD_REGEXP)
206
- yield [tok.upcase.to_sym, tok]
207
- elsif (tok = @ss.scan /SELECT\b/i)
208
- yield [:SELECT, tok + @ss.scan(/.*/)]
209
- elsif (tok = @ss.scan /NULL\b/i)
210
- yield [:NULL, nil]
211
- elsif (tok = @ss.scan /`([^`]|``)*`/)
212
- yield [:IDENTIFIER, tok.slice(1...-1).gsub(/``/, '`')]
213
- elsif (tok = @ss.scan /'([^']|'')*'/) #'
214
- yield [:VALUE, tok.slice(1...-1).gsub(/''/, "'")]
215
- elsif (tok = @ss.scan /"([^"]|"")*"/) #"
216
- yield [:VALUE, tok.slice(1...-1).gsub(/""/, '"')]
217
- elsif (tok = @ss.scan /(0|[1-9]\d*)/)
218
- yield [:NATURAL_NUMBER, tok.to_i]
219
- elsif (tok = @ss.scan /[,\(\)\*]/)
220
- yield [tok, tok]
221
- elsif (tok = @ss.scan /[a-z_$][0-9a-z_$]*\b/i)
222
- yield [:IDENTIFIER, tok]
223
- else
224
- raise Racc::ParseError, ('parse error on value "%s"' % @ss.rest.inspect)
225
- end
226
- end
227
-
228
- yield [false, '$']
229
- end
230
- private :scan
231
-
232
- def parse
233
- yyparse self, :scan
234
- end
235
-
236
- def self.parse(obj)
237
- self.new(obj).parse
238
- end
239
-
240
- ---- footer
241
-
242
- end # module SimpleDB
1
+ class Parser
2
+ options no_result_var
3
+ rule
4
+ stmt : get_stmt
5
+ | insert_stmt
6
+ | update_stmt
7
+ | delete_stmt
8
+ | select_stmt
9
+ | create_stmt
10
+ | drop_stmt
11
+ | show_stmt
12
+ | use_stmt
13
+ | desc_stmt
14
+
15
+ get_stmt : GET get_output_list FROM IDENTIFIER WHERE ITEMNAME '=' VALUE
16
+ {
17
+ struct(:GET, :domain => val[3], :item_name => val[7], :attr_names => val[1])
18
+ }
19
+
20
+ get_output_list :
21
+ {
22
+ []
23
+ }
24
+ | '*'
25
+ {
26
+ []
27
+ }
28
+ | identifier_list
29
+
30
+ insert_stmt : INSERT INTO IDENTIFIER '(' insert_identifier_list ')' VALUES '(' value_list ')'
31
+ {
32
+ unless val[4].length == val[8].length
33
+ raise Racc::ParseError, 'The number of an attribute and values differs'
34
+ end
35
+
36
+ attrs = {}
37
+ val[4].zip(val[8]).each {|k, v| attrs[k] = v }
38
+ item_name = attrs.find {|k, v| k =~ /\AitemName\Z/i }
39
+
40
+ unless item_name
41
+ raise Racc::ParseError,'itemName is not contained in the INSERT statement'
42
+ end
43
+
44
+ attrs.delete(item_name[0])
45
+ item_name = item_name[1]
46
+
47
+ struct(:INSERT, :domain => val[2], :item_name => item_name, :attrs => attrs)
48
+ }
49
+
50
+
51
+ insert_identifier_list : itemname_identifier
52
+ {
53
+ [val[0]]
54
+ }
55
+ | insert_identifier_list ',' itemname_identifier
56
+ {
57
+ val[0] + [val[2]]
58
+ }
59
+
60
+ itemname_identifier : ITEMNAME
61
+ | IDENTIFIER
62
+
63
+ update_stmt : UPDATE IDENTIFIER SET set_clause_list WHERE ITEMNAME '=' VALUE
64
+ {
65
+ attrs = {}
66
+ val[3].each {|k, v| attrs[k] = v }
67
+ struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
68
+ }
69
+
70
+ set_clause_list : set_clause
71
+ {
72
+ [val[0]]
73
+ }
74
+ | set_clause_list ',' set_clause
75
+ {
76
+ val[0] + [val[2]]
77
+ }
78
+
79
+ set_clause : IDENTIFIER '=' VALUE
80
+ {
81
+ [val[0], val[2]]
82
+ }
83
+
84
+ delete_stmt : DELETE delete_attr_list FROM IDENTIFIER WHERE ITEMNAME '=' VALUE
85
+ {
86
+ struct(:DELETE, :domain => val[3], :items => [[val[7], val[1]]])
87
+ }
88
+
89
+ delete_attr_list :
90
+ {
91
+ []
92
+ }
93
+ | identifier_list
94
+
95
+ select_stmt : SELECT
96
+ {
97
+ struct(:SELECT, :query => val[0])
98
+ }
99
+
100
+ create_stmt : CREATE DOMAIN IDENTIFIER
101
+ {
102
+ struct(:CREATE, :domain => val[2])
103
+ }
104
+
105
+ drop_stmt : DROP DOMAIN IDENTIFIER
106
+ {
107
+ struct(:DROP, :domain => val[2])
108
+ }
109
+
110
+ show_stmt : SHOW DOMAINS
111
+ {
112
+ struct(:SHOW, :operand => :domains)
113
+ }
114
+
115
+ desc_stmt : DESC IDENTIFIER
116
+ {
117
+ struct(:DESCRIBE, :domain => val[1])
118
+ }
119
+ | DESCRIBE IDENTIFIER
120
+ {
121
+ struct(:DESCRIBE, :domain => val[1])
122
+ }
123
+
124
+ identifier_list: IDENTIFIER
125
+ {
126
+ [val[0]]
127
+ }
128
+ | identifier_list ',' IDENTIFIER
129
+ {
130
+ val[0] + [val[2]]
131
+ }
132
+
133
+ value_list : VALUE
134
+ {
135
+ [val[0]]
136
+ }
137
+ | value_list ',' VALUE
138
+ {
139
+ [val[0], val[2]].flatten
140
+ }
141
+
142
+ ---- header
143
+
144
+ require 'strscan'
145
+
146
+ module SimpleDB
147
+
148
+ ---- inner
149
+
150
+ KEYWORDS = %w(
151
+ AND
152
+ ASC
153
+ BETWEEN
154
+ BY
155
+ CREATE
156
+ DELETE
157
+ DESCRIBE
158
+ DESC
159
+ DOMAINS
160
+ DOMAIN
161
+ DROP
162
+ EVERY
163
+ FROM
164
+ GET
165
+ INSERT
166
+ INTERSECTION
167
+ INTO
168
+ IN
169
+ IS
170
+ ITEMNAME
171
+ LIKE
172
+ LIMIT
173
+ NOT
174
+ ORDER
175
+ OR
176
+ SET
177
+ SHOW
178
+ UPDATE
179
+ VALUES
180
+ WHERE
181
+ )
182
+
183
+ KEYWORD_REGEXP = Regexp.compile("#{KEYWORDS.join '|'}\\b", Regexp::IGNORECASE)
184
+
185
+ def initialize(obj)
186
+ src = obj.is_a?(IO) ? obj.read : obj.to_s
187
+ @ss = StringScanner.new(src)
188
+ end
189
+
190
+ @@structs = {}
191
+
192
+ def struct(name, attrs = {})
193
+ unless (clazz = @@structs[name])
194
+ clazz = attrs.empty? ? Struct.new(name.to_s) : Struct.new(name.to_s, *attrs.keys)
195
+ @@structs[name] = clazz
196
+ end
197
+
198
+ obj = clazz.new
199
+
200
+ attrs.each do |key, val|
201
+ obj.send("#{key}=", val)
202
+ end
203
+
204
+ return obj
205
+ end
206
+ private :struct
207
+
208
+ def scan
209
+ tok = nil
210
+
211
+ until @ss.eos?
212
+ if (tok = @ss.scan /\s+/)
213
+ # nothing to do
214
+ elsif (tok = @ss.scan /(?:!=|>=|<=|>|<|=)/)
215
+ yield [tok, tok]
216
+ elsif (tok = @ss.scan KEYWORD_REGEXP)
217
+ yield [tok.upcase.to_sym, tok]
218
+ elsif (tok = @ss.scan /SELECT\b/i)
219
+ yield [:SELECT, tok + @ss.scan(/.*/)]
220
+ elsif (tok = @ss.scan /NULL\b/i)
221
+ yield [:NULL, nil]
222
+ elsif (tok = @ss.scan /`([^`]|``)*`/)
223
+ yield [:IDENTIFIER, tok.slice(1...-1).gsub(/``/, '`')]
224
+ elsif (tok = @ss.scan /'([^']|'')*'/) #'
225
+ yield [:VALUE, tok.slice(1...-1).gsub(/''/, "'")]
226
+ elsif (tok = @ss.scan /"([^"]|"")*"/) #"
227
+ yield [:VALUE, tok.slice(1...-1).gsub(/""/, '"')]
228
+ elsif (tok = @ss.scan /(0|[1-9]\d*)/)
229
+ yield [:NATURAL_NUMBER, tok.to_i]
230
+ elsif (tok = @ss.scan /[,\(\)\*]/)
231
+ yield [tok, tok]
232
+ elsif (tok = @ss.scan /[a-z_$][0-9a-z_$]*\b/i)
233
+ yield [:IDENTIFIER, tok]
234
+ else
235
+ raise Racc::ParseError, ('parse error on value "%s"' % @ss.rest.inspect)
236
+ end
237
+ end
238
+
239
+ yield [false, '$']
240
+ end
241
+ private :scan
242
+
243
+ def parse
244
+ yyparse self, :scan
245
+ end
246
+
247
+ def self.parse(obj)
248
+ self.new(obj).parse
249
+ end
250
+
251
+ ---- footer
252
+
253
+ end # module SimpleDB
@@ -1,79 +1,81 @@
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
- def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
19
- @driver = Driver.new(accessKeyId, secretAccessKey, endpoint)
20
- end
21
-
22
- def endpoint
23
- @driver.endpoint
24
- end
25
-
26
- def endpoint=(v)
27
- @driver.endpoint = v
28
- end
29
-
30
- def region
31
- REGIONS[endpoint]
32
- end
33
-
34
- def execute(query, inline = true)
35
- parsed = Parser.parse(query)
36
- command = parsed.class.name.split('::').last.to_sym
37
-
38
- case command
39
- when :GET
40
- item = @driver.get(parsed.domain, parsed.item_name, parsed.attr_names)
41
-
42
- if inline
43
- def item.to_yaml_style; :inline; end
44
- end
45
-
46
- item
47
- when :INSERT
48
- @driver.insert(parsed.domain, parsed.item_name, parsed.attrs)
49
- nil
50
- when :UPDATE
51
- @driver.update(parsed.domain, parsed.items)
52
- nil
53
- when :DELETE
54
- @driver.delete(parsed.domain, parsed.items)
55
- nil
56
- when :SELECT
57
- items = @driver.select(parsed.query)
58
-
59
- if inline
60
- items.each do |item|
61
- def item.to_yaml_style; :inline; end
62
- end
63
- end
64
-
65
- items
66
- when :CREATE
67
- @driver.create_domain(parsed.domain)
68
- nil
69
- when :DROP
70
- @driver.drop_domain(parsed.domain)
71
- nil
72
- when :SHOW
73
- @driver.show_domains
74
- else
75
- raise 'must not happen'
76
- end
77
- end
78
- end # Runner
79
- end # SimpleDB
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
+ def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
19
+ @driver = Driver.new(accessKeyId, secretAccessKey, endpoint)
20
+ end
21
+
22
+ def endpoint
23
+ @driver.endpoint
24
+ end
25
+
26
+ def endpoint=(v)
27
+ @driver.endpoint = v
28
+ end
29
+
30
+ def region
31
+ REGIONS[endpoint]
32
+ end
33
+
34
+ def execute(query, inline = true)
35
+ parsed = Parser.parse(query)
36
+ command = parsed.class.name.split('::').last.to_sym
37
+
38
+ case command
39
+ when :GET
40
+ item = @driver.get(parsed.domain, parsed.item_name, parsed.attr_names)
41
+
42
+ if inline
43
+ def item.to_yaml_style; :inline; end
44
+ end
45
+
46
+ item
47
+ when :INSERT
48
+ @driver.insert(parsed.domain, parsed.item_name, parsed.attrs)
49
+ nil
50
+ when :UPDATE
51
+ @driver.update(parsed.domain, parsed.items)
52
+ nil
53
+ when :DELETE
54
+ @driver.delete(parsed.domain, parsed.items)
55
+ nil
56
+ when :SELECT
57
+ items = @driver.select(parsed.query)
58
+
59
+ if inline
60
+ items.each do |item|
61
+ def item.to_yaml_style; :inline; end
62
+ end
63
+ end
64
+
65
+ items
66
+ when :CREATE
67
+ @driver.create_domain(parsed.domain)
68
+ nil
69
+ when :DROP
70
+ @driver.drop_domain(parsed.domain)
71
+ nil
72
+ when :SHOW
73
+ @driver.show_domains
74
+ when :DESCRIBE
75
+ @driver.describe(parsed.domain)
76
+ else
77
+ raise 'must not happen'
78
+ end
79
+ end
80
+ end # Runner
81
+ end # SimpleDB
data/lib/sdbcli.rb CHANGED
@@ -1,3 +1,3 @@
1
- require 'sdbcli/sdb-client'
2
- require 'sdbcli/sdb-driver'
3
- require 'sdbcli/sdb-runner'
1
+ require 'sdbcli/sdb-client'
2
+ require 'sdbcli/sdb-driver'
3
+ require 'sdbcli/sdb-runner'