sdbcli 0.4.3 → 1.0.0

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/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