sdbcli 0.2.8 → 0.2.9

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