sdbcli 0.4.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -52,13 +52,15 @@ https://bitbucket.org/winebarrel/sdbcli
52
52
  GET [attr_list] FROM domain_name WHERE itemName = '...'
53
53
  gets the attribute of an item
54
54
 
55
- INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name', 'val1', ...)
55
+ INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name1', 'val1', ...), ('name2', 'val2', ...), ...
56
56
  creates an item
57
57
 
58
- UPDATE domain_name set attr1 = 'val1', ... WHERE itemName = '...'
58
+ UPDATE domain_name {SET|ADD} attr1 = 'val1', ... WHERE itemName = '...'
59
+ UPDATE domain_name {SET|ADD} attr1 = 'val1', ... [WHERE expression] [sort_instructions] [LIMIT limit]
59
60
  updates an item
60
61
 
61
62
  DELETE [attr1, ...] FROM domain_name WHERE itemName = '...'
63
+ DELETE [attr1, ...] FROM domain_name WHERE [WHERE expression] [sort_instructions] [LIMIT limit]
62
64
  deletes the attribute of an item or an item
63
65
 
64
66
  SELECT output_list FROM domain_name [WHERE expression] [sort_instructions] [LIMIT limit]
data/bin/sdbcli CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- $LOAD_PATH << File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib')
2
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
3
 
4
- Version = '0.4.3'
4
+ Version = '1.0.0'
5
5
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
6
  HISTSIZE = 500
7
7
 
@@ -87,7 +87,16 @@ def execute(src, show_rows = false)
87
87
 
88
88
  out = $runner.execute(query, inline)
89
89
 
90
- if out
90
+ if out.kind_of?(Integer)
91
+ puts case $format
92
+ when :yaml
93
+ "# #{out} #{out > 1 ? 'rows' : 'row'} changed"
94
+ when :json
95
+ "// #{out} #{out > 1 ? 'rows' : 'row'} changed"
96
+ else
97
+ "# #{out} #{out > 1 ? 'rows' : 'row'} changed"
98
+ end
99
+ elsif out
91
100
  str = nil
92
101
 
93
102
  case $format
@@ -163,13 +172,15 @@ DROP DOMAIN domain_name
163
172
  GET [attr_list] FROM domain_name WHERE itemName = '...'
164
173
  gets the attribute of an item
165
174
 
166
- INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name', 'val1', ...)
175
+ INSERT INTO domain_name (itemName, attr1, ...) VALUES ('name1', 'val1', ...), ('name2', 'val2', ...), ...
167
176
  creates an item
168
177
 
169
- UPDATE domain_name set attr1 = 'val1', ... WHERE itemName = '...'
178
+ UPDATE domain_name {SET|ADD} attr1 = 'val1', ... WHERE itemName = '...'
179
+ UPDATE domain_name {SET|ADD} attr1 = 'val1', ... [WHERE expression] [sort_instructions] [LIMIT limit]
170
180
  updates an item
171
181
 
172
182
  DELETE [attr1, ...] FROM domain_name WHERE itemName = '...'
183
+ DELETE [attr1, ...] FROM domain_name WHERE [WHERE expression] [sort_instructions] [LIMIT limit]
173
184
  deletes the attribute of an item or an item
174
185
 
175
186
  SELECT output_list FROM domain_name [WHERE expression] [sort_instructions] [LIMIT limit]
@@ -233,8 +244,8 @@ while buf = Readline.readline(prompt, true)
233
244
  elsif r =~ 'exit' or r =~ 'quit'
234
245
  exit
235
246
  elsif r =~ 'format'
236
- case arg
237
- when nil
247
+ case (arg || '').strip
248
+ when ''
238
249
  puts $format
239
250
  when 'yaml'
240
251
  $format = :yaml
@@ -4,6 +4,8 @@ module SimpleDB
4
4
  class Error < StandardError; end
5
5
 
6
6
  class Driver
7
+ MAX_NUMBER_SUBMITTED_ITEMS = 25
8
+
7
9
  attr_accessor :iteratable
8
10
 
9
11
  def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
@@ -42,41 +44,50 @@ module SimpleDB
42
44
 
43
45
  # attr action
44
46
 
45
- def insert(domain_name, item_name, attrs = {}, consistent = false)
46
- params = {:ConsistentRead => consistent}
47
- i = 0
47
+ def insert(domain_name, items = {}, consistent = false)
48
+ until (chunk = items.slice!(0, MAX_NUMBER_SUBMITTED_ITEMS)).empty?
49
+ params = {:ConsistentRead => consistent}
50
+ i = j = 0
48
51
 
49
- attrs.each do |name, values|
50
- [values].flatten.each do |v|
52
+ chunk.each do |item_name, attrs|
51
53
  i += 1
52
- params["Attribute.#{i}.Name"] = name
53
- params["Attribute.#{i}.Value"] = v
54
- params["Attribute.#{i}.Replace"] = false
54
+ params["Item.#{i}.ItemName"] = item_name
55
+
56
+ (attrs || {}).each do |attr_name, values|
57
+ [values].flatten.each do |v|
58
+ j += 1
59
+ params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
60
+ params["Item.#{i}.Attribute.#{j}.Value"] = v
61
+ params["Item.#{i}.Attribute.#{j}.Replace"] = false
62
+ end
63
+ end
55
64
  end
56
- end
57
65
 
58
- @client.put_attributes(domain_name, item_name, params)
66
+ @client.batch_put_attributes(domain_name, params)
67
+ end
59
68
  end
60
69
 
61
70
  def update(domain_name, items = {}, consistent = false)
62
- params = {:ConsistentRead => consistent}
63
- i = j = 0
64
-
65
- items.each do |item_name, attrs|
66
- i += 1
67
- params["Item.#{i}.ItemName"] = item_name
68
-
69
- (attrs || {}).each do |attr_name, values|
70
- [values].flatten.each do |v|
71
- j += 1
72
- params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
73
- params["Item.#{i}.Attribute.#{j}.Value"] = v
74
- params["Item.#{i}.Attribute.#{j}.Replace"] = true
71
+ until (chunk = items.slice!(0, MAX_NUMBER_SUBMITTED_ITEMS)).empty?
72
+ params = {:ConsistentRead => consistent}
73
+ i = j = 0
74
+
75
+ chunk.each do |item_name, attrs|
76
+ i += 1
77
+ params["Item.#{i}.ItemName"] = item_name
78
+
79
+ (attrs || {}).each do |attr_name, values|
80
+ [values].flatten.each do |v|
81
+ j += 1
82
+ params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
83
+ params["Item.#{i}.Attribute.#{j}.Value"] = v
84
+ params["Item.#{i}.Attribute.#{j}.Replace"] = true
85
+ end
75
86
  end
76
87
  end
77
- end
78
88
 
79
- @client.batch_put_attributes(domain_name, params)
89
+ @client.batch_put_attributes(domain_name, params)
90
+ end
80
91
  end
81
92
 
82
93
  def get(domain_name, item_name, attr_names = [], consistent = false)
@@ -100,23 +111,25 @@ module SimpleDB
100
111
  end
101
112
 
102
113
  def delete(domain_name, items = {}, consistent = false)
103
- params = {:ConsistentRead => consistent}
104
- i = j = 0
105
-
106
- items.each do |item_name, attrs|
107
- i += 1
108
- params["Item.#{i}.ItemName"] = item_name
114
+ until (chunk = items.slice!(0, MAX_NUMBER_SUBMITTED_ITEMS)).empty?
115
+ params = {:ConsistentRead => consistent}
116
+ i = j = 0
109
117
 
110
- (attrs || []).each do |attr_name, values|
111
- [values].flatten.each do |v|
112
- j += 1
113
- params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
114
- params["Item.#{i}.Attribute.#{j}.Value"] = v if v
118
+ chunk.each do |item_name, attrs|
119
+ i += 1
120
+ params["Item.#{i}.ItemName"] = item_name
121
+
122
+ (attrs || []).each do |attr_name, values|
123
+ [values].flatten.each do |v|
124
+ j += 1
125
+ params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
126
+ params["Item.#{i}.Attribute.#{j}.Value"] = v if v
127
+ end
115
128
  end
116
129
  end
117
- end
118
130
 
119
- @client.batch_delete_attributes(domain_name, params)
131
+ @client.batch_delete_attributes(domain_name, params)
132
+ end
120
133
  end
121
134
 
122
135
  def describe(domain_name)
@@ -13,9 +13,10 @@ module SimpleDB
13
13
 
14
14
  class Parser < Racc::Parser
15
15
 
16
- module_eval(<<'...end sdb-parser.y/module_eval...', 'sdb-parser.y', 156)
16
+ module_eval(<<'...end sdb-parser.y/module_eval...', 'sdb-parser.y', 228)
17
17
 
18
18
  KEYWORDS = %w(
19
+ ADD
19
20
  AND
20
21
  ASC
21
22
  BETWEEN
@@ -118,111 +119,141 @@ def self.parse(obj)
118
119
  self.new(obj).parse
119
120
  end
120
121
 
122
+ def on_error(error_token_id, error_value, value_stack)
123
+ if @stmt_with_expr
124
+ @stmt_with_expr.expr << (error_value + @ss.scan_until(/\Z/))
125
+ else
126
+ super
127
+ end
128
+ end
129
+
121
130
  ...end sdb-parser.y/module_eval...
122
131
  ##### State transition tables begin ###
123
132
 
124
133
  racc_action_table = [
125
- 12, 59, 27, 58, 81, 57, 82, 25, 13, 52,
126
- 58, 60, 57, 64, 14, 65, 15, 16, 17, 36,
127
- 18, 19, 34, 35, 20, 21, 22, 37, 38, 39,
128
- 40, 41, 42, 43, 44, 41, 45, 46, 47, 48,
129
- 49, 33, 53, 54, 32, 27, 61, 62, 63, 29,
130
- 66, 52, 68, 69, 70, 71, 28, 73, 74, 75,
131
- 76, 77, 78, 80, 23, 83 ]
134
+ 13, 14, 67, 64, 25, 63, 29, 62, 42, 65,
135
+ 65, 27, 15, 43, 63, 16, 62, 44, 17, 18,
136
+ 19, 40, 20, 21, 98, 94, 22, 23, 24, 71,
137
+ 72, 36, 37, 93, 94, 57, 58, 45, 46, 47,
138
+ 43, 48, 49, 50, 51, 52, 55, 55, 39, 59,
139
+ 38, 35, 66, 41, 68, 69, 70, 34, 73, 55,
140
+ 75, 76, 77, 78, 79, 29, 81, 82, 83, 84,
141
+ 85, 87, 88, 89, 91, 92, 31, 95, 96, 91,
142
+ 30 ]
132
143
 
133
144
  racc_action_check = [
134
- 0, 50, 12, 49, 79, 49, 79, 12, 0, 43,
135
- 65, 50, 65, 55, 0, 55, 0, 0, 0, 20,
136
- 0, 0, 19, 19, 0, 0, 0, 21, 22, 23,
137
- 24, 26, 28, 29, 30, 31, 32, 33, 40, 41,
138
- 42, 18, 44, 47, 17, 15, 52, 53, 54, 14,
139
- 59, 60, 61, 62, 63, 64, 13, 66, 69, 70,
140
- 71, 73, 74, 76, 1, 82 ]
145
+ 0, 0, 56, 53, 1, 52, 14, 52, 26, 56,
146
+ 53, 14, 0, 28, 72, 0, 72, 30, 0, 0,
147
+ 0, 24, 0, 0, 97, 97, 0, 0, 0, 60,
148
+ 60, 21, 21, 90, 90, 47, 47, 31, 31, 32,
149
+ 33, 34, 35, 42, 43, 44, 45, 46, 23, 50,
150
+ 22, 20, 55, 25, 57, 58, 59, 19, 64, 65,
151
+ 66, 67, 68, 70, 71, 17, 73, 76, 77, 78,
152
+ 79, 81, 82, 83, 85, 86, 16, 92, 94, 95,
153
+ 15 ]
141
154
 
142
155
  racc_action_pointer = [
143
- -2, 64, nil, nil, nil, nil, nil, nil, nil, nil,
144
- nil, nil, -2, 45, 45, 41, nil, 23, 20, -2,
145
- 15, 23, 24, 29, 27, nil, 16, nil, 28, 16,
146
- 31, 20, 32, 33, nil, nil, nil, nil, nil, nil,
147
- 34, 35, 28, 5, 38, nil, nil, 38, nil, -1,
148
- -4, nil, 39, 42, 42, 0, nil, nil, nil, 44,
149
- 47, 44, 47, 47, 41, 6, 50, nil, nil, 51,
150
- 51, 48, nil, 53, 54, nil, 55, nil, nil, -9,
151
- nil, nil, 57, nil ]
156
+ -1, 4, nil, nil, nil, nil, nil, nil, nil, nil,
157
+ nil, nil, nil, nil, 2, 66, 72, 61, nil, 35,
158
+ 29, 6, 46, 44, 17, 53, 5, nil, 1, nil,
159
+ 13, 20, 36, 28, 37, 38, nil, nil, nil, nil,
160
+ nil, nil, 39, 40, 35, 42, 43, 31, nil, nil,
161
+ 44, nil, 1, -2, nil, 45, -3, 49, 49, 50,
162
+ 18, nil, nil, nil, 52, 55, 52, 55, 56, nil,
163
+ 56, 49, 10, 59, nil, nil, 60, 61, 61, 60,
164
+ nil, 63, 64, 65, nil, 66, 63, nil, nil, nil,
165
+ 22, nil, 67, nil, 70, 71, nil, 13, nil ]
152
166
 
153
167
  racc_action_default = [
154
- -39, -39, -1, -2, -3, -4, -5, -6, -7, -8,
155
- -9, -10, -12, -39, -39, -25, -27, -39, -39, -39,
156
- -39, -39, -39, -39, -39, -13, -14, -35, -39, -39,
157
- -39, -26, -39, -39, -30, -31, -32, -33, -34, 84,
158
- -39, -39, -39, -39, -39, -28, -29, -39, -36, -39,
159
- -39, -21, -39, -39, -39, -39, -16, -18, -19, -39,
160
- -39, -39, -39, -39, -39, -39, -39, -22, -23, -39,
161
- -39, -39, -17, -39, -39, -11, -39, -20, -24, -39,
162
- -37, -15, -39, -38 ]
168
+ -53, -53, -1, -2, -3, -4, -5, -6, -7, -8,
169
+ -9, -10, -11, -12, -14, -53, -53, -39, -41, -53,
170
+ -53, -53, -53, -53, -53, -53, -53, -15, -16, -49,
171
+ -53, -53, -53, -40, -53, -53, -44, -45, -46, -47,
172
+ -48, 99, -53, -53, -53, -53, -53, -53, -42, -43,
173
+ -53, -50, -53, -25, -32, -53, -29, -36, -37, -53,
174
+ -53, -20, -22, -23, -26, -53, -53, -30, -53, -38,
175
+ -53, -53, -53, -27, -33, -34, -31, -53, -53, -53,
176
+ -21, -53, -53, -53, -13, -53, -19, -24, -28, -35,
177
+ -53, -51, -53, -17, -53, -53, -52, -53, -18 ]
163
178
 
164
179
  racc_goto_table = [
165
- 51, 26, 56, 10, 31, 5, 6, 7, 8, 9,
166
- 4, 11, 24, 1, 55, 79, 3, 67, 72, 50,
167
- 2, 30 ]
180
+ 61, 90, 28, 53, 56, 33, 11, 6, 7, 8,
181
+ 9, 97, 10, 5, 12, 26, 1, 86, 4, 60,
182
+ 80, 3, 2, 74, 32 ]
168
183
 
169
184
  racc_goto_check = [
170
- 18, 13, 16, 10, 13, 5, 6, 7, 8, 9,
171
- 4, 11, 12, 1, 14, 15, 3, 18, 16, 17,
172
- 2, 19 ]
185
+ 18, 16, 14, 19, 19, 14, 11, 6, 7, 8,
186
+ 9, 16, 10, 5, 12, 13, 1, 15, 4, 17,
187
+ 18, 3, 2, 20, 21 ]
173
188
 
174
189
  racc_goto_pointer = [
175
- nil, 13, 20, 16, 10, 5, 6, 7, 8, 9,
176
- 3, 11, 0, -11, -35, -61, -47, -24, -43, 6 ]
190
+ nil, 16, 22, 21, 18, 13, 7, 8, 9, 10,
191
+ 12, 6, 14, 1, -12, -62, -84, -33, -52, -42,
192
+ -42, 7 ]
177
193
 
178
194
  racc_goto_default = [
179
195
  nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
180
- nil, nil, nil, nil, nil, nil, nil, nil, nil, nil ]
196
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
197
+ 54, nil ]
181
198
 
182
199
  racc_reduce_table = [
183
200
  0, 0, :racc_error,
184
- 1, 30, :_reduce_none,
185
- 1, 30, :_reduce_none,
186
- 1, 30, :_reduce_none,
187
- 1, 30, :_reduce_none,
188
- 1, 30, :_reduce_none,
189
- 1, 30, :_reduce_none,
190
- 1, 30, :_reduce_none,
191
- 1, 30, :_reduce_none,
192
- 1, 30, :_reduce_none,
193
- 1, 30, :_reduce_none,
194
- 8, 31, :_reduce_11,
195
- 0, 41, :_reduce_12,
196
- 1, 41, :_reduce_13,
197
- 1, 41, :_reduce_none,
198
- 10, 32, :_reduce_15,
199
- 1, 43, :_reduce_16,
200
- 3, 43, :_reduce_17,
201
- 1, 45, :_reduce_none,
202
- 1, 45, :_reduce_none,
203
- 8, 33, :_reduce_20,
204
- 1, 46, :_reduce_21,
205
- 3, 46, :_reduce_22,
206
- 3, 47, :_reduce_23,
207
- 8, 34, :_reduce_24,
208
- 0, 48, :_reduce_25,
201
+ 1, 31, :_reduce_none,
202
+ 1, 31, :_reduce_none,
203
+ 1, 31, :_reduce_none,
204
+ 1, 31, :_reduce_none,
205
+ 1, 31, :_reduce_none,
206
+ 1, 31, :_reduce_none,
207
+ 1, 31, :_reduce_none,
208
+ 1, 31, :_reduce_none,
209
+ 1, 31, :_reduce_none,
210
+ 1, 31, :_reduce_none,
211
+ 1, 31, :_reduce_none,
212
+ 1, 31, :_reduce_12,
213
+ 8, 32, :_reduce_13,
214
+ 0, 43, :_reduce_14,
215
+ 1, 43, :_reduce_15,
216
+ 1, 43, :_reduce_none,
217
+ 3, 45, :_reduce_17,
218
+ 5, 45, :_reduce_18,
219
+ 8, 33, :_reduce_19,
220
+ 1, 47, :_reduce_20,
221
+ 3, 47, :_reduce_21,
222
+ 1, 48, :_reduce_none,
209
223
  1, 48, :_reduce_none,
210
- 1, 35, :_reduce_27,
211
- 3, 36, :_reduce_28,
212
- 3, 37, :_reduce_29,
213
- 2, 38, :_reduce_30,
214
- 2, 38, :_reduce_31,
215
- 2, 39, :_reduce_32,
216
- 2, 40, :_reduce_33,
217
- 2, 40, :_reduce_34,
218
- 1, 42, :_reduce_35,
219
- 3, 42, :_reduce_36,
220
- 1, 44, :_reduce_37,
221
- 3, 44, :_reduce_38 ]
222
-
223
- racc_reduce_n = 39
224
-
225
- racc_shift_n = 84
224
+ 8, 34, :_reduce_24,
225
+ 4, 34, :_reduce_25,
226
+ 5, 34, :_reduce_26,
227
+ 6, 34, :_reduce_27,
228
+ 8, 35, :_reduce_28,
229
+ 4, 35, :_reduce_29,
230
+ 5, 35, :_reduce_30,
231
+ 6, 35, :_reduce_31,
232
+ 1, 49, :_reduce_32,
233
+ 3, 49, :_reduce_33,
234
+ 3, 50, :_reduce_34,
235
+ 8, 36, :_reduce_35,
236
+ 4, 36, :_reduce_36,
237
+ 4, 36, :_reduce_37,
238
+ 5, 36, :_reduce_38,
239
+ 0, 51, :_reduce_39,
240
+ 1, 51, :_reduce_none,
241
+ 1, 37, :_reduce_41,
242
+ 3, 38, :_reduce_42,
243
+ 3, 39, :_reduce_43,
244
+ 2, 40, :_reduce_44,
245
+ 2, 40, :_reduce_45,
246
+ 2, 41, :_reduce_46,
247
+ 2, 42, :_reduce_47,
248
+ 2, 42, :_reduce_48,
249
+ 1, 44, :_reduce_49,
250
+ 3, 44, :_reduce_50,
251
+ 1, 46, :_reduce_51,
252
+ 3, 46, :_reduce_52 ]
253
+
254
+ racc_reduce_n = 53
255
+
256
+ racc_shift_n = 99
226
257
 
227
258
  racc_token_table = {
228
259
  false => 0,
@@ -235,27 +266,28 @@ racc_token_table = {
235
266
  "=" => 7,
236
267
  :VALUE => 8,
237
268
  "*" => 9,
238
- :INSERT => 10,
239
- :INTO => 11,
240
- "(" => 12,
241
- ")" => 13,
242
- :VALUES => 14,
243
- "," => 15,
269
+ "(" => 10,
270
+ ")" => 11,
271
+ "," => 12,
272
+ :INSERT => 13,
273
+ :INTO => 14,
274
+ :VALUES => 15,
244
275
  :UPDATE => 16,
245
276
  :SET => 17,
246
- :DELETE => 18,
247
- :SELECT => 19,
248
- :CREATE => 20,
249
- :DOMAIN => 21,
250
- :DROP => 22,
251
- :SHOW => 23,
252
- :DOMAINS => 24,
253
- :REGIONS => 25,
254
- :USE => 26,
255
- :DESC => 27,
256
- :DESCRIBE => 28 }
257
-
258
- racc_nt_base = 29
277
+ :ADD => 18,
278
+ :DELETE => 19,
279
+ :SELECT => 20,
280
+ :CREATE => 21,
281
+ :DOMAIN => 22,
282
+ :DROP => 23,
283
+ :SHOW => 24,
284
+ :DOMAINS => 25,
285
+ :REGIONS => 26,
286
+ :USE => 27,
287
+ :DESC => 28,
288
+ :DESCRIBE => 29 }
289
+
290
+ racc_nt_base = 30
259
291
 
260
292
  racc_use_result_var = false
261
293
 
@@ -286,14 +318,15 @@ Racc_token_to_s_table = [
286
318
  "\"=\"",
287
319
  "VALUE",
288
320
  "\"*\"",
289
- "INSERT",
290
- "INTO",
291
321
  "\"(\"",
292
322
  "\")\"",
293
- "VALUES",
294
323
  "\",\"",
324
+ "INSERT",
325
+ "INTO",
326
+ "VALUES",
295
327
  "UPDATE",
296
328
  "SET",
329
+ "ADD",
297
330
  "DELETE",
298
331
  "SELECT",
299
332
  "CREATE",
@@ -310,6 +343,7 @@ Racc_token_to_s_table = [
310
343
  "get_stmt",
311
344
  "insert_stmt",
312
345
  "update_stmt",
346
+ "merge_stmt",
313
347
  "delete_stmt",
314
348
  "select_stmt",
315
349
  "create_stmt",
@@ -319,8 +353,9 @@ Racc_token_to_s_table = [
319
353
  "desc_stmt",
320
354
  "get_output_list",
321
355
  "identifier_list",
322
- "insert_identifier_list",
356
+ "value_list_list",
323
357
  "value_list",
358
+ "insert_identifier_list",
324
359
  "itemname_identifier",
325
360
  "set_clause_list",
326
361
  "set_clause",
@@ -352,196 +387,307 @@ Racc_debug_parser = false
352
387
 
353
388
  # reduce 10 omitted
354
389
 
390
+ # reduce 11 omitted
391
+
355
392
  module_eval(<<'.,.,', 'sdb-parser.y', 16)
356
- def _reduce_11(val, _values)
393
+ def _reduce_12(val, _values)
394
+ @stmt_with_expr
395
+
396
+ end
397
+ .,.,
398
+
399
+ module_eval(<<'.,.,', 'sdb-parser.y', 21)
400
+ def _reduce_13(val, _values)
357
401
  struct(:GET, :domain => val[3], :item_name => val[7], :attr_names => val[1])
358
402
 
359
403
  end
360
404
  .,.,
361
405
 
362
- module_eval(<<'.,.,', 'sdb-parser.y', 21)
363
- def _reduce_12(val, _values)
406
+ module_eval(<<'.,.,', 'sdb-parser.y', 26)
407
+ def _reduce_14(val, _values)
364
408
  []
365
409
 
366
410
  end
367
411
  .,.,
368
412
 
369
- module_eval(<<'.,.,', 'sdb-parser.y', 25)
370
- def _reduce_13(val, _values)
413
+ module_eval(<<'.,.,', 'sdb-parser.y', 30)
414
+ def _reduce_15(val, _values)
371
415
  []
372
416
 
373
417
  end
374
418
  .,.,
375
419
 
376
- # reduce 14 omitted
420
+ # reduce 16 omitted
377
421
 
378
- module_eval(<<'.,.,', 'sdb-parser.y', 31)
379
- def _reduce_15(val, _values)
380
- unless val[4].length == val[8].length
381
- raise Racc::ParseError, 'The number of an attribute and values differs'
382
- end
422
+ module_eval(<<'.,.,', 'sdb-parser.y', 36)
423
+ def _reduce_17(val, _values)
424
+ [val[1]]
425
+
426
+ end
427
+ .,.,
383
428
 
384
- attrs = {}
385
- val[4].zip(val[8]).each {|k, v| attrs[k] = v }
386
- item_name = attrs.find {|k, v| k =~ /\AitemName\Z/i }
429
+ module_eval(<<'.,.,', 'sdb-parser.y', 40)
430
+ def _reduce_18(val, _values)
431
+ val[0] + [val[3]]
432
+
433
+ end
434
+ .,.,
435
+
436
+ module_eval(<<'.,.,', 'sdb-parser.y', 45)
437
+ def _reduce_19(val, _values)
438
+ items = val[7].map do |vals|
439
+ unless val[4].length == vals.length
440
+ raise Racc::ParseError, 'The number of an attribute and values differs'
441
+ end
387
442
 
388
- unless item_name
389
- raise Racc::ParseError,'itemName is not contained in the INSERT statement'
390
- end
443
+ attrs = {}
444
+ val[4].zip(vals).each {|k, v| attrs[k] = v }
445
+ item_name = attrs.find {|k, v| k =~ /\AitemName\Z/i }
391
446
 
392
- attrs.delete(item_name[0])
393
- item_name = item_name[1]
447
+ unless item_name
448
+ raise Racc::ParseError,'itemName is not contained in the INSERT statement'
449
+ end
394
450
 
395
- struct(:INSERT, :domain => val[2], :item_name => item_name, :attrs => attrs)
396
-
451
+ attrs.delete(item_name[0])
452
+ item_name = item_name[1]
453
+
454
+ [item_name, attrs]
455
+ end
456
+
457
+ struct(:INSERT, :domain => val[2], :items => items)
458
+
397
459
  end
398
460
  .,.,
399
461
 
400
- module_eval(<<'.,.,', 'sdb-parser.y', 52)
401
- def _reduce_16(val, _values)
462
+ module_eval(<<'.,.,', 'sdb-parser.y', 69)
463
+ def _reduce_20(val, _values)
402
464
  [val[0]]
403
465
 
404
466
  end
405
467
  .,.,
406
468
 
407
- module_eval(<<'.,.,', 'sdb-parser.y', 56)
408
- def _reduce_17(val, _values)
469
+ module_eval(<<'.,.,', 'sdb-parser.y', 73)
470
+ def _reduce_21(val, _values)
409
471
  val[0] + [val[2]]
410
472
 
411
473
  end
412
474
  .,.,
413
475
 
414
- # reduce 18 omitted
476
+ # reduce 22 omitted
415
477
 
416
- # reduce 19 omitted
478
+ # reduce 23 omitted
417
479
 
418
- module_eval(<<'.,.,', 'sdb-parser.y', 64)
419
- def _reduce_20(val, _values)
420
- attrs = {}
421
- val[3].each {|k, v| attrs[k] = v }
422
- struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
423
-
480
+ module_eval(<<'.,.,', 'sdb-parser.y', 81)
481
+ def _reduce_24(val, _values)
482
+ attrs = {}
483
+ val[3].each {|k, v| attrs[k] = v }
484
+ struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
485
+
424
486
  end
425
487
  .,.,
426
488
 
427
- module_eval(<<'.,.,', 'sdb-parser.y', 71)
428
- def _reduce_21(val, _values)
489
+ module_eval(<<'.,.,', 'sdb-parser.y', 87)
490
+ def _reduce_25(val, _values)
491
+ attrs = {}
492
+ val[3].each {|k, v| attrs[k] = v }
493
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
494
+
495
+ end
496
+ .,.,
497
+
498
+ module_eval(<<'.,.,', 'sdb-parser.y', 93)
499
+ def _reduce_26(val, _values)
500
+ attrs = {}
501
+ val[3].each {|k, v| attrs[k] = v }
502
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
503
+
504
+ end
505
+ .,.,
506
+
507
+ module_eval(<<'.,.,', 'sdb-parser.y', 99)
508
+ def _reduce_27(val, _values)
509
+ attrs = {}
510
+ val[3].each {|k, v| attrs[k] = v }
511
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
512
+
513
+ end
514
+ .,.,
515
+
516
+ module_eval(<<'.,.,', 'sdb-parser.y', 106)
517
+ def _reduce_28(val, _values)
518
+ attrs = {}
519
+ val[3].each {|k, v| attrs[k] = v }
520
+ struct(:MERGE, :domain => val[1], :items => [[val[7], attrs]])
521
+
522
+ end
523
+ .,.,
524
+
525
+ module_eval(<<'.,.,', 'sdb-parser.y', 112)
526
+ def _reduce_29(val, _values)
527
+ attrs = {}
528
+ val[3].each {|k, v| attrs[k] = v }
529
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
530
+
531
+ end
532
+ .,.,
533
+
534
+ module_eval(<<'.,.,', 'sdb-parser.y', 118)
535
+ def _reduce_30(val, _values)
536
+ attrs = {}
537
+ val[3].each {|k, v| attrs[k] = v }
538
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
539
+
540
+ end
541
+ .,.,
542
+
543
+ module_eval(<<'.,.,', 'sdb-parser.y', 124)
544
+ def _reduce_31(val, _values)
545
+ attrs = {}
546
+ val[3].each {|k, v| attrs[k] = v }
547
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
548
+
549
+ end
550
+ .,.,
551
+
552
+ module_eval(<<'.,.,', 'sdb-parser.y', 131)
553
+ def _reduce_32(val, _values)
429
554
  [val[0]]
430
555
 
431
556
  end
432
557
  .,.,
433
558
 
434
- module_eval(<<'.,.,', 'sdb-parser.y', 75)
435
- def _reduce_22(val, _values)
559
+ module_eval(<<'.,.,', 'sdb-parser.y', 135)
560
+ def _reduce_33(val, _values)
436
561
  val[0] + [val[2]]
437
562
 
438
563
  end
439
564
  .,.,
440
565
 
441
- module_eval(<<'.,.,', 'sdb-parser.y', 80)
442
- def _reduce_23(val, _values)
566
+ module_eval(<<'.,.,', 'sdb-parser.y', 140)
567
+ def _reduce_34(val, _values)
443
568
  [val[0], val[2]]
444
569
 
445
570
  end
446
571
  .,.,
447
572
 
448
- module_eval(<<'.,.,', 'sdb-parser.y', 85)
449
- def _reduce_24(val, _values)
573
+ module_eval(<<'.,.,', 'sdb-parser.y', 145)
574
+ def _reduce_35(val, _values)
450
575
  struct(:DELETE, :domain => val[3], :items => [[val[7], val[1]]])
451
576
 
452
577
  end
453
578
  .,.,
454
579
 
455
- module_eval(<<'.,.,', 'sdb-parser.y', 90)
456
- def _reduce_25(val, _values)
580
+ module_eval(<<'.,.,', 'sdb-parser.y', 149)
581
+ def _reduce_36(val, _values)
582
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => '')
583
+
584
+ end
585
+ .,.,
586
+
587
+ module_eval(<<'.,.,', 'sdb-parser.y', 153)
588
+ def _reduce_37(val, _values)
589
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE ')
590
+
591
+ end
592
+ .,.,
593
+
594
+ module_eval(<<'.,.,', 'sdb-parser.y', 157)
595
+ def _reduce_38(val, _values)
596
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE itemName')
597
+
598
+ end
599
+ .,.,
600
+
601
+ module_eval(<<'.,.,', 'sdb-parser.y', 162)
602
+ def _reduce_39(val, _values)
457
603
  []
458
604
 
459
605
  end
460
606
  .,.,
461
607
 
462
- # reduce 26 omitted
608
+ # reduce 40 omitted
463
609
 
464
- module_eval(<<'.,.,', 'sdb-parser.y', 96)
465
- def _reduce_27(val, _values)
610
+ module_eval(<<'.,.,', 'sdb-parser.y', 168)
611
+ def _reduce_41(val, _values)
466
612
  struct(:SELECT, :query => val[0])
467
613
 
468
614
  end
469
615
  .,.,
470
616
 
471
- module_eval(<<'.,.,', 'sdb-parser.y', 101)
472
- def _reduce_28(val, _values)
617
+ module_eval(<<'.,.,', 'sdb-parser.y', 173)
618
+ def _reduce_42(val, _values)
473
619
  struct(:CREATE, :domain => val[2])
474
620
 
475
621
  end
476
622
  .,.,
477
623
 
478
- module_eval(<<'.,.,', 'sdb-parser.y', 106)
479
- def _reduce_29(val, _values)
624
+ module_eval(<<'.,.,', 'sdb-parser.y', 178)
625
+ def _reduce_43(val, _values)
480
626
  struct(:DROP, :domain => val[2])
481
627
 
482
628
  end
483
629
  .,.,
484
630
 
485
- module_eval(<<'.,.,', 'sdb-parser.y', 111)
486
- def _reduce_30(val, _values)
631
+ module_eval(<<'.,.,', 'sdb-parser.y', 183)
632
+ def _reduce_44(val, _values)
487
633
  struct(:SHOW, :operand => :domains)
488
634
 
489
635
  end
490
636
  .,.,
491
637
 
492
- module_eval(<<'.,.,', 'sdb-parser.y', 115)
493
- def _reduce_31(val, _values)
638
+ module_eval(<<'.,.,', 'sdb-parser.y', 187)
639
+ def _reduce_45(val, _values)
494
640
  struct(:SHOW, :operand => :regions)
495
641
 
496
642
  end
497
643
  .,.,
498
644
 
499
- module_eval(<<'.,.,', 'sdb-parser.y', 119)
500
- def _reduce_32(val, _values)
645
+ module_eval(<<'.,.,', 'sdb-parser.y', 191)
646
+ def _reduce_46(val, _values)
501
647
  struct(:USE, :endpoint => val[1])
502
648
 
503
649
  end
504
650
  .,.,
505
651
 
506
- module_eval(<<'.,.,', 'sdb-parser.y', 123)
507
- def _reduce_33(val, _values)
652
+ module_eval(<<'.,.,', 'sdb-parser.y', 195)
653
+ def _reduce_47(val, _values)
508
654
  struct(:DESCRIBE, :domain => val[1])
509
655
 
510
656
  end
511
657
  .,.,
512
658
 
513
- module_eval(<<'.,.,', 'sdb-parser.y', 127)
514
- def _reduce_34(val, _values)
659
+ module_eval(<<'.,.,', 'sdb-parser.y', 199)
660
+ def _reduce_48(val, _values)
515
661
  struct(:DESCRIBE, :domain => val[1])
516
662
 
517
663
  end
518
664
  .,.,
519
665
 
520
- module_eval(<<'.,.,', 'sdb-parser.y', 132)
521
- def _reduce_35(val, _values)
522
- [val[0]]
523
-
666
+ module_eval(<<'.,.,', 'sdb-parser.y', 204)
667
+ def _reduce_49(val, _values)
668
+ [val[0]]
669
+
524
670
  end
525
671
  .,.,
526
672
 
527
- module_eval(<<'.,.,', 'sdb-parser.y', 136)
528
- def _reduce_36(val, _values)
529
- val[0] + [val[2]]
530
-
673
+ module_eval(<<'.,.,', 'sdb-parser.y', 208)
674
+ def _reduce_50(val, _values)
675
+ val[0] + [val[2]]
676
+
531
677
  end
532
678
  .,.,
533
679
 
534
- module_eval(<<'.,.,', 'sdb-parser.y', 141)
535
- def _reduce_37(val, _values)
536
- [val[0]]
537
-
680
+ module_eval(<<'.,.,', 'sdb-parser.y', 213)
681
+ def _reduce_51(val, _values)
682
+ [val[0]]
683
+
538
684
  end
539
685
  .,.,
540
686
 
541
- module_eval(<<'.,.,', 'sdb-parser.y', 145)
542
- def _reduce_38(val, _values)
543
- [val[0], val[2]].flatten
544
-
687
+ module_eval(<<'.,.,', 'sdb-parser.y', 217)
688
+ def _reduce_52(val, _values)
689
+ [val[0], val[2]].flatten
690
+
545
691
  end
546
692
  .,.,
547
693
 
@@ -4,6 +4,7 @@ rule
4
4
  stmt : get_stmt
5
5
  | insert_stmt
6
6
  | update_stmt
7
+ | merge_stmt
7
8
  | delete_stmt
8
9
  | select_stmt
9
10
  | create_stmt
@@ -11,6 +12,10 @@ rule
11
12
  | show_stmt
12
13
  | use_stmt
13
14
  | desc_stmt
15
+ | error
16
+ {
17
+ @stmt_with_expr
18
+ }
14
19
 
15
20
  get_stmt : GET get_output_list FROM IDENTIFIER WHERE ITEMNAME '=' VALUE
16
21
  {
@@ -27,26 +32,38 @@ rule
27
32
  }
28
33
  | identifier_list
29
34
 
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
+ value_list_list : '(' value_list ')'
36
+ {
37
+ [val[1]]
38
+ }
39
+ | value_list_list ',' '(' value_list ')'
40
+ {
41
+ val[0] + [val[3]]
42
+ }
35
43
 
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 }
44
+ insert_stmt : INSERT INTO IDENTIFIER '(' insert_identifier_list ')' VALUES value_list_list
45
+ {
46
+ items = val[7].map do |vals|
47
+ unless val[4].length == vals.length
48
+ raise Racc::ParseError, 'The number of an attribute and values differs'
49
+ end
39
50
 
40
- unless item_name
41
- raise Racc::ParseError,'itemName is not contained in the INSERT statement'
42
- end
51
+ attrs = {}
52
+ val[4].zip(vals).each {|k, v| attrs[k] = v }
53
+ item_name = attrs.find {|k, v| k =~ /\AitemName\Z/i }
43
54
 
44
- attrs.delete(item_name[0])
45
- item_name = item_name[1]
55
+ unless item_name
56
+ raise Racc::ParseError,'itemName is not contained in the INSERT statement'
57
+ end
46
58
 
47
- struct(:INSERT, :domain => val[2], :item_name => item_name, :attrs => attrs)
48
- }
59
+ attrs.delete(item_name[0])
60
+ item_name = item_name[1]
61
+
62
+ [item_name, attrs]
63
+ end
49
64
 
65
+ struct(:INSERT, :domain => val[2], :items => items)
66
+ }
50
67
 
51
68
  insert_identifier_list : itemname_identifier
52
69
  {
@@ -61,11 +78,54 @@ rule
61
78
  | IDENTIFIER
62
79
 
63
80
  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
- }
81
+ {
82
+ attrs = {}
83
+ val[3].each {|k, v| attrs[k] = v }
84
+ struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
85
+ }
86
+ | UPDATE IDENTIFIER SET set_clause_list
87
+ {
88
+ attrs = {}
89
+ val[3].each {|k, v| attrs[k] = v }
90
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
91
+ }
92
+ | UPDATE IDENTIFIER SET set_clause_list WHERE
93
+ {
94
+ attrs = {}
95
+ val[3].each {|k, v| attrs[k] = v }
96
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
97
+ }
98
+ | UPDATE IDENTIFIER SET set_clause_list WHERE ITEMNAME
99
+ {
100
+ attrs = {}
101
+ val[3].each {|k, v| attrs[k] = v }
102
+ @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
103
+ }
104
+
105
+ merge_stmt : UPDATE IDENTIFIER ADD set_clause_list WHERE ITEMNAME '=' VALUE
106
+ {
107
+ attrs = {}
108
+ val[3].each {|k, v| attrs[k] = v }
109
+ struct(:MERGE, :domain => val[1], :items => [[val[7], attrs]])
110
+ }
111
+ | UPDATE IDENTIFIER ADD set_clause_list
112
+ {
113
+ attrs = {}
114
+ val[3].each {|k, v| attrs[k] = v }
115
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
116
+ }
117
+ | UPDATE IDENTIFIER ADD set_clause_list WHERE
118
+ {
119
+ attrs = {}
120
+ val[3].each {|k, v| attrs[k] = v }
121
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
122
+ }
123
+ | UPDATE IDENTIFIER ADD set_clause_list WHERE ITEMNAME
124
+ {
125
+ attrs = {}
126
+ val[3].each {|k, v| attrs[k] = v }
127
+ @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
128
+ }
69
129
 
70
130
  set_clause_list : set_clause
71
131
  {
@@ -85,6 +145,18 @@ rule
85
145
  {
86
146
  struct(:DELETE, :domain => val[3], :items => [[val[7], val[1]]])
87
147
  }
148
+ | DELETE delete_attr_list FROM IDENTIFIER
149
+ {
150
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => '')
151
+ }
152
+ | DELETE delete_attr_list FROM WHERE
153
+ {
154
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE ')
155
+ }
156
+ | DELETE delete_attr_list FROM WHERE ITEMNAME
157
+ {
158
+ @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE itemName')
159
+ }
88
160
 
89
161
  delete_attr_list :
90
162
  {
@@ -129,22 +201,22 @@ rule
129
201
  }
130
202
 
131
203
  identifier_list: IDENTIFIER
132
- {
133
- [val[0]]
134
- }
135
- | identifier_list ',' IDENTIFIER
136
- {
137
- val[0] + [val[2]]
138
- }
204
+ {
205
+ [val[0]]
206
+ }
207
+ | identifier_list ',' IDENTIFIER
208
+ {
209
+ val[0] + [val[2]]
210
+ }
139
211
 
140
212
  value_list : VALUE
141
- {
142
- [val[0]]
143
- }
144
- | value_list ',' VALUE
145
- {
146
- [val[0], val[2]].flatten
147
- }
213
+ {
214
+ [val[0]]
215
+ }
216
+ | value_list ',' VALUE
217
+ {
218
+ [val[0], val[2]].flatten
219
+ }
148
220
 
149
221
  ---- header
150
222
 
@@ -155,6 +227,7 @@ module SimpleDB
155
227
  ---- inner
156
228
 
157
229
  KEYWORDS = %w(
230
+ ADD
158
231
  AND
159
232
  ASC
160
233
  BETWEEN
@@ -257,6 +330,14 @@ def self.parse(obj)
257
330
  self.new(obj).parse
258
331
  end
259
332
 
333
+ def on_error(error_token_id, error_value, value_stack)
334
+ if @stmt_with_expr
335
+ @stmt_with_expr.expr << (error_value + @ss.scan_until(/\Z/))
336
+ else
337
+ super
338
+ end
339
+ end
340
+
260
341
  ---- footer
261
342
 
262
343
  end # module SimpleDB
@@ -48,14 +48,39 @@ module SimpleDB
48
48
 
49
49
  item
50
50
  when :INSERT
51
- @driver.insert(parsed.domain, parsed.item_name, parsed.attrs)
52
- nil
51
+ rownum = parsed.items.length
52
+ @driver.insert(parsed.domain, parsed.items)
53
+ rownum
53
54
  when :UPDATE
55
+ rownum = parsed.items.length
54
56
  @driver.update(parsed.domain, parsed.items)
55
- nil
57
+ rownum
58
+ when :UPDATE_WITH_EXPR
59
+ query = "SELECT itemName FROM #{parsed.domain} #{parsed.expr}"
60
+ items = @driver.select(query).map {|i| [i[0], parsed.attrs] }
61
+ rownum = items.length
62
+ @driver.update(parsed.domain, items)
63
+ rownum
64
+ when :MERGE
65
+ rownum = parsed.items.length
66
+ @driver.insert(parsed.domain, parsed.items)
67
+ rownum
68
+ when :MERGE_WITH_EXPR
69
+ query = "SELECT itemName FROM #{parsed.domain} #{parsed.expr}"
70
+ items = @driver.select(query).map {|i| [i[0], parsed.attrs] }
71
+ rownum = items.length
72
+ @driver.insert(parsed.domain, items)
73
+ rownum
56
74
  when :DELETE
75
+ rownum = parsed.items.length
57
76
  @driver.delete(parsed.domain, parsed.items)
58
- nil
77
+ rownum
78
+ when :DELETE_WITH_EXPR
79
+ query = "SELECT itemName FROM #{parsed.domain} #{parsed.expr}"
80
+ items = @driver.select(query).map {|i| [i[0], parsed.attrs] }
81
+ rownum = items.length
82
+ @driver.delete(parsed.domain, items)
83
+ rownum
59
84
  when :SELECT
60
85
  items = @driver.select(parsed.query)
61
86
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdbcli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-26 00:00:00.000000000 Z
12
+ date: 2013-02-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri