sdbcli 1.4.7 → 1.4.8

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -92,6 +92,9 @@ https://bitbucket.org/winebarrel/sdbcli
92
92
  displays a present page number or displays a result of the specified page
93
93
  (PAGE statement is published after SELECT statement)
94
94
 
95
+ TAIL domain_name
96
+ displays a end of a domain
97
+
95
98
  DESC[RIBE] domain_name
96
99
  displays information about the domain
97
100
 
@@ -107,7 +110,7 @@ https://bitbucket.org/winebarrel/sdbcli
107
110
  .consistent (true|false)? displays ConsistentRead parameter or changes it
108
111
  .iteratable (true|false)? displays iteratable option or changes it
109
112
  all results are displayed if true
110
- .timeout SECOND displays a timeout second or changes it
113
+ .timeout SECOND? displays a timeout second or changes it
111
114
  .version displays a version
112
115
 
113
116
  ap-northeast-1> select * from test;
@@ -141,9 +144,63 @@ see http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/Quoti
141
144
  - [itemname1, {attr1: val1, attr2: val2}]
142
145
  - [itemname2, {attr1: val1, attr2: val2}]
143
146
 
147
+ == Page transition
148
+
149
+ ap-northeast-1> select * from employees limit 3;
150
+ ---
151
+ - ["100000", {birth_date: "1956-01-11", last_name: Emden, hire_date: "1991-07-02", first_name: Hiroyasu}]
152
+ - ["100001", {birth_date: "1953-02-07", last_name: Antonakopoulos, hire_date: "1994-12-25", first_name: Jasminko}]
153
+ - ["100002", {birth_date: "1957-03-04", last_name: Kolinko, hire_date: "1988-02-20", first_name: Claudi}]
154
+ # 3 rows in set
155
+
156
+ ap-northeast-1> next;
157
+ ---
158
+ - ["100003", {birth_date: "1959-08-30", last_name: Trogemann, hire_date: "1987-08-26", first_name: Marsja}]
159
+ - ["100004", {birth_date: "1960-04-16", last_name: Nitsch, hire_date: "1986-01-03", first_name: Avishai}]
160
+ - ["100005", {birth_date: "1958-03-09", last_name: Foong, hire_date: "1988-10-22", first_name: Anneke}]
161
+ # 3 rows in set
162
+
163
+ ap-northeast-1> prev;
164
+ ---
165
+ - ["100000", {birth_date: "1956-01-11", last_name: Emden, hire_date: "1991-07-02", first_name: Hiroyasu}]
166
+ - ["100001", {birth_date: "1953-02-07", last_name: Antonakopoulos, hire_date: "1994-12-25", first_name: Jasminko}]
167
+ - ["100002", {birth_date: "1957-03-04", last_name: Kolinko, hire_date: "1988-02-20", first_name: Claudi}]
168
+ # 3 rows in set
169
+
170
+ ap-northeast-1> page 10;
171
+ ---
172
+ - ["100025", {birth_date: "1964-12-25", last_name: Braccini, hire_date: "1988-08-22", first_name: Peer}]
173
+ - ["100026", {birth_date: "1952-12-15", last_name: Demos, hire_date: "1997-10-04", first_name: Lalit}]
174
+ - ["100027", {birth_date: "1962-01-16", last_name: Coullard, hire_date: "1987-05-09", first_name: Ayakannu}]
175
+ # 3 rows in set
176
+
177
+ ap-northeast-1> page -1;
178
+ ---
179
+ - ["99997", {first_name: Mack, hire_date: "1995-01-08", birth_date: "1963-04-30", last_name: Morris}]
180
+ - ["99998", {first_name: Parto, hire_date: "1995-03-03", birth_date: "1961-10-31", last_name: Lally}]
181
+ - ["99999", {first_name: Gila, hire_date: "1992-04-20", birth_date: "1959-10-09", last_name: Lammel}]
182
+ # 3 rows in set
183
+
184
+ ap-northeast-1> tail employees;
185
+ ---
186
+ - ["99976", {first_name: Toshiko, hire_date: "1997-12-24", birth_date: "1964-11-18", last_name: East man}]
187
+ - ["99977", {first_name: Yurij, hire_date: "1985-06-16", birth_date: "1960-09-18", last_name: Fujisa wa}]
188
+ - ["99978", {first_name: Adamantios, hire_date: "1993-06-25", birth_date: "1956-12-25", last_name: T agansky}]
189
+ - ["99979", {first_name: Padma, hire_date: "1985-10-24", birth_date: "1957-12-09", last_name: Bage}]
190
+ ...
191
+
192
+ == Extraction of all records
193
+
194
+ ap-northeast-1> .i true
195
+ ap-northeast-1> select * from employees limit 2500 ! wc -l;
196
+ --- |
197
+ 300024
198
+
199
+ *Extraction of all records requires time very much.*
200
+
144
201
  == Import/Export
145
202
 
146
- shell> sdbcli -f json --export=employees,employees.json
203
+ shell> sdbcli -f json --export=employees,employees.json
147
204
  // 2500 rows was outputted...
148
205
  // 5000 rows was outputted...
149
206
  // 7500 rows was outputted...
@@ -209,8 +266,23 @@ If '-' is specified as a file name, the input/output of data will become a stand
209
266
  --- |
210
267
  [["100000", {"first_name"=>"Hiroyasu", "hire_date"=>"1991-07-02", "birth_date"=>"1956-01-11", "last_name"=>"Emden"}], ["100001", {"first_name"=>"Jasminko", "hire_date"=>"1994-12-25", "birth_date"=>"1953-02-07", "last_name"=>"Antonakopoulos"}], ["100002", {"first_name"=>"Claudi", "hire_date"=>"1988-02-20", "birth_date"=>"1957-03-04", "last_name"=>"Kolinko"}]]
211
268
  [1991, 1994, 1988]
269
+
270
+ ap-northeast-1> select * from employees limit 3 | hire_date.to_i.__('data.txt') {|i| i.map {|j| j * 2 } };
271
+ ap-northeast-1> ! cat data.txt;
272
+ --- |
273
+ [["100000", {"first_name"=>"Hiroyasu", "hire_date"=>"1991-07-02", "birth_date"=>"1956-01-11", "last_name"=>"Emden"}], ["100001", {"first_name"=>"Jasminko", "hire_date"=>"1994-12-25", "birth_date"=>"1953-02-07", "last_name"=>"Antonakopoulos"}], ["100002", {"first_name"=>"Claudi", "hire_date"=>"1988-02-20", "birth_date"=>"1957-03-04", "last_name"=>"Kolinko"}]]
274
+ [0, 0, 0]
275
+ [1991, 1994, 1988]
276
+ 3982
277
+ 3988
278
+ 3976
279
+
280
+ ap-northeast-1> select * from employees limit 3 | first_name._('data.txt');
281
+ ap-northeast-1> ! cat data.txt;
282
+ --- |
283
+ ["Hiroyasu", "Jasminko", "Claudi"]
212
284
 
213
- == Group By (Aggregate)
285
+ == Group by (Aggregate)
214
286
 
215
287
  ap-northeast-1> select * from access_logs limit 30;
216
288
  ---
@@ -230,6 +302,25 @@ If '-' is specified as a file name, the input/output of data will become a stand
230
302
  host4: 302.1675
231
303
  host5: 301.62
232
304
 
305
+ == Use variables
306
+
307
+ ap-northeast-1> select * from employees limit 3 | $list1 = self;
308
+ ---
309
+ - ["100000", {first_name: Hiroyasu, hire_date: "1991-07-02", birth_date: "1956-01-11", last_name: Emden}]
310
+ - ["100001", {first_name: Jasminko, hire_date: "1994-12-25", birth_date: "1953-02-07", last_name: Antonakopoulos}]
311
+ - ["100002", {first_name: Claudi, hire_date: "1988-02-20", birth_date: "1957-03-04", last_name: Kolinko}]
312
+ # 3 rows in set
313
+
314
+ ap-northeast-1> next | $list2 = self;
315
+ ---
316
+ - ["100003", {first_name: Marsja, hire_date: "1987-08-26", birth_date: "1959-08-30", last_name: Trogemann}]
317
+ - ["100004", {first_name: Avishai, hire_date: "1986-01-03", birth_date: "1960-04-16", last_name: Nitsch}]
318
+ - ["100005", {first_name: Anneke, hire_date: "1988-10-22", birth_date: "1958-03-09", last_name: Foong}]
319
+ # 3 rows in set
320
+
321
+ ap-northeast-1> | ($list1 + $list2).length;
322
+ --- 6
323
+
233
324
  == Exec ruby or shell command
234
325
 
235
326
  ap-northeast-1> | (1 + 1).to_f;
data/bin/sdbcli CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
3
3
 
4
- Version = '1.4.7'
4
+ Version = '1.4.8'
5
5
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
6
  HISTSIZE = 500
7
7
  SELECT_LIMIT = 2500
@@ -406,6 +406,9 @@ PAGE [number]
406
406
  displays a present page number or displays a result of the specified page
407
407
  (PAGE statement is published after SELECT statement)
408
408
 
409
+ TAIL domain_name
410
+ displays a end of a domain
411
+
409
412
  DESC[RIBE] domain_name
410
413
  displays information about the domain
411
414
 
@@ -421,7 +424,7 @@ USE region_or_endpoint
421
424
  .consistent (true|false)? displays ConsistentRead parameter or changes it
422
425
  .iteratable (true|false)? displays iteratable option or changes it
423
426
  all results are displayed if true
424
- .timeout SECOND displays a timeout second or changes it
427
+ .timeout SECOND? displays a timeout second or changes it
425
428
  .version displays a version
426
429
 
427
430
  EOS
@@ -169,8 +169,13 @@ module SimpleDB
169
169
  return items
170
170
  end
171
171
 
172
+ def tail(domain_name, consistent = false)
173
+ @select_expr = "SELECT * FROM #{domain_name}"
174
+ page_to(-1, consistent)
175
+ end
176
+
172
177
  def page_to(page, consistent = false)
173
- if page < 1
178
+ if page.zero?
174
179
  raise SimpleDB::Error, "Invalid page number: #{page}"
175
180
  end
176
181
 
@@ -178,6 +183,12 @@ module SimpleDB
178
183
  return []
179
184
  end
180
185
 
186
+ if page < 0
187
+ n = page_num
188
+ return [] unless n
189
+ page = n + 1 + page
190
+ end
191
+
181
192
  ss = StringScanner.new(@select_expr.dup)
182
193
  limit = 100
183
194
 
@@ -188,6 +199,7 @@ module SimpleDB
188
199
  elsif ss.scan(/"(?:[^"]|"")*"/) #"
189
200
  elsif (tok = ss.scan /LIMIT\s+\d\b/i)
190
201
  limit = tok.split(/\s+/).last.to_i
202
+ break
191
203
  elsif ss.scan(/./)
192
204
  end
193
205
  end
@@ -273,6 +285,47 @@ module SimpleDB
273
285
  end
274
286
  end
275
287
 
288
+ def page_num
289
+ return nil unless @select_expr
290
+
291
+ ss = StringScanner.new(@select_expr)
292
+ domain_name = nil
293
+
294
+ until ss.eos?
295
+ if ss.scan(/[^F`'"|!]+/i) #'
296
+ elsif ss.scan(/`(?:[^`]|``)*`/)
297
+ elsif ss.scan(/'(?:[^']|'')*'/) #'
298
+ elsif ss.scan(/"(?:[^"]|"")*"/) #"
299
+ elsif (tok = ss.scan /FROM\b\s*[^\s]+/i)
300
+ domain_name = tok.split(/\b/, 2).last
301
+ break
302
+ elsif ss.scan(/./)
303
+ end
304
+ end
305
+
306
+ return nil unless domain_name
307
+ domain_name.strip!.gsub!(/`([^`]+)`/, '\1')
308
+
309
+ item_count = describe(domain_name)['ItemCount'].to_f
310
+
311
+ ss = StringScanner.new(@select_expr)
312
+ limit = 100
313
+
314
+ until ss.eos?
315
+ if ss.scan(/[^`'"L]+/i) #'
316
+ elsif ss.scan( /`(?:[^`]|``)*`/)
317
+ elsif ss.scan(/'(?:[^']|'')*'/) #'
318
+ elsif ss.scan(/"(?:[^"]|"")*"/) #"
319
+ elsif (tok = ss.scan /LIMIT\s+\d\b/i)
320
+ limit = tok.split(/\s+/).last.to_i
321
+ break
322
+ elsif ss.scan(/./)
323
+ end
324
+ end
325
+
326
+ return (item_count / limit).ceil
327
+ end
328
+
276
329
  def describe(domain_name)
277
330
  doc = @client.domain_metadata(domain_name)
278
331
  h = {}
@@ -13,7 +13,7 @@ module SimpleDB
13
13
 
14
14
  class Parser < Racc::Parser
15
15
 
16
- module_eval(<<'...end sdb-parser.y/module_eval...', 'sdb-parser.y', 346)
16
+ module_eval(<<'...end sdb-parser.y/module_eval...', 'sdb-parser.y', 372)
17
17
 
18
18
  KEYWORDS = %w(
19
19
  ADD
@@ -94,8 +94,10 @@ def scan
94
94
  yield [:CURRENT, @ss.scan(/\s*[|!]\s*.*/)]
95
95
  elsif (tok = @ss.scan /P(REV)?\b/i)
96
96
  yield [:PREV, @ss.scan(/\s*[|!]\s*.*/)]
97
- elsif (tok = @ss.scan /PAGE(\s+\d+)?/i)
97
+ elsif (tok = @ss.scan /PAGE(\s+-?\d+)?/i)
98
98
  yield [:PAGE, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
99
+ elsif (tok = @ss.scan /TAIL\b\s*[^\s]+/i)
100
+ yield [:TAIL, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
99
101
  elsif (tok = @ss.scan /NULL\b/i)
100
102
  yield [:NULL, nil]
101
103
  elsif (tok = @ss.scan /`([^`]|``)*`/)
@@ -143,151 +145,153 @@ end
143
145
  ##### State transition tables begin ###
144
146
 
145
147
  racc_action_table = [
146
- 19, 10, 79, 76, 20, 75, 41, 74, 77, 77,
147
- 39, 75, 37, 74, 21, 87, 88, 22, 87, 88,
148
- 23, 24, 25, 26, 27, 28, 62, 29, 30, 31,
149
- 48, 49, 32, 33, 34, 35, 36, 87, 88, 87,
150
- 88, 107, 108, 87, 88, 112, 108, 87, 88, 83,
151
- 84, 57, 58, 87, 88, 87, 88, 69, 70, 63,
152
- 64, 67, 67, 60, 71, 55, 59, 78, 61, 80,
153
- 81, 82, 56, 85, 67, 55, 90, 91, 92, 93,
154
- 54, 95, 96, 97, 53, 99, 52, 51, 50, 47,
155
- 106, 46, 109, 41, 43, 42 ]
148
+ 20, 10, 81, 78, 21, 77, 43, 76, 79, 79,
149
+ 41, 77, 39, 76, 22, 89, 90, 23, 89, 90,
150
+ 24, 25, 26, 27, 28, 29, 64, 30, 31, 32,
151
+ 33, 50, 51, 34, 35, 36, 37, 38, 89, 90,
152
+ 89, 90, 109, 110, 89, 90, 114, 110, 89, 90,
153
+ 85, 86, 59, 60, 89, 90, 89, 90, 71, 72,
154
+ 65, 66, 69, 69, 62, 73, 57, 61, 80, 63,
155
+ 82, 83, 84, 58, 87, 69, 57, 92, 93, 94,
156
+ 95, 56, 97, 98, 99, 55, 101, 54, 53, 52,
157
+ 49, 108, 48, 111, 43, 45, 44 ]
156
158
 
157
159
  racc_action_check = [
158
- 0, 0, 68, 65, 0, 64, 20, 64, 68, 65,
159
- 20, 84, 1, 84, 0, 95, 95, 0, 99, 99,
160
- 0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
161
- 31, 31, 0, 0, 0, 0, 0, 97, 97, 96,
162
- 96, 104, 104, 92, 92, 111, 111, 78, 78, 72,
163
- 72, 43, 43, 108, 108, 109, 109, 59, 59, 55,
164
- 56, 57, 58, 46, 62, 45, 44, 67, 47, 69,
165
- 70, 71, 42, 76, 77, 40, 79, 80, 82, 83,
166
- 38, 85, 90, 91, 37, 93, 34, 33, 32, 30,
167
- 100, 28, 106, 23, 22, 21 ]
160
+ 0, 0, 70, 67, 0, 66, 21, 66, 70, 67,
161
+ 21, 86, 1, 86, 0, 97, 97, 0, 101, 101,
162
+ 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,
163
+ 0, 33, 33, 0, 0, 0, 0, 0, 99, 99,
164
+ 98, 98, 106, 106, 94, 94, 113, 113, 80, 80,
165
+ 74, 74, 45, 45, 110, 110, 111, 111, 61, 61,
166
+ 57, 58, 59, 60, 48, 64, 47, 46, 69, 49,
167
+ 71, 72, 73, 44, 78, 79, 42, 81, 82, 84,
168
+ 85, 40, 87, 92, 93, 39, 95, 36, 35, 34,
169
+ 32, 102, 29, 108, 24, 23, 22 ]
168
170
 
169
171
  racc_action_pointer = [
170
172
  -1, 12, nil, nil, nil, nil, nil, nil, nil, nil,
171
173
  nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
172
- -1, 79, 87, 86, nil, nil, nil, nil, 64, nil,
173
- 62, -1, 81, 80, 79, nil, nil, 84, 74, nil,
174
- 61, nil, 65, 32, 60, 51, 56, 61, nil, nil,
175
- nil, nil, nil, nil, 19, 52, 48, 54, 55, 50,
176
- nil, nil, 56, nil, -2, -5, nil, 57, -6, 61,
177
- 61, 62, 36, nil, nil, nil, 64, 67, 44, 67,
178
- 68, nil, 68, 62, 4, 71, nil, nil, nil, nil,
179
- 72, 73, 40, 73, nil, 12, 36, 34, nil, 15,
180
- 76, nil, nil, nil, 28, nil, 80, nil, 50, 52,
181
- nil, 32, nil ]
174
+ nil, -1, 80, 88, 87, nil, nil, nil, nil, 65,
175
+ nil, nil, 63, -1, 82, 81, 80, nil, nil, 85,
176
+ 75, nil, 62, nil, 66, 33, 61, 52, 57, 62,
177
+ nil, nil, nil, nil, nil, nil, 19, 53, 49, 55,
178
+ 56, 51, nil, nil, 57, nil, -2, -5, nil, 58,
179
+ -6, 62, 62, 63, 37, nil, nil, nil, 65, 68,
180
+ 45, 68, 69, nil, 69, 63, 4, 72, nil, nil,
181
+ nil, nil, 73, 74, 41, 74, nil, 12, 37, 35,
182
+ nil, 15, 77, nil, nil, nil, 29, nil, 81, nil,
183
+ 51, 53, nil, 33, nil ]
182
184
 
183
185
  racc_action_default = [
184
- -67, -67, -1, -2, -3, -4, -5, -6, -7, -8,
186
+ -69, -69, -1, -2, -3, -4, -5, -6, -7, -8,
185
187
  -9, -10, -11, -12, -13, -14, -15, -16, -17, -18,
186
- -22, -67, -67, -47, -49, -50, -51, -52, -67, -54,
187
- -67, -67, -67, -67, -67, -61, -62, -67, -67, -23,
188
- -24, -63, -67, -67, -67, -48, -67, -67, -56, -57,
189
- -58, -59, -60, 113, -67, -67, -67, -67, -67, -67,
190
- -53, -55, -67, -64, -67, -33, -40, -67, -37, -44,
191
- -45, -67, -67, -28, -30, -31, -34, -67, -67, -38,
192
- -67, -46, -67, -67, -67, -35, -41, -19, -20, -42,
193
- -39, -67, -67, -67, -29, -67, -67, -67, -21, -67,
194
- -27, -32, -36, -43, -67, -65, -67, -25, -67, -67,
195
- -66, -67, -26 ]
188
+ -19, -23, -69, -69, -48, -50, -51, -52, -53, -69,
189
+ -55, -56, -69, -69, -69, -69, -69, -63, -64, -69,
190
+ -69, -24, -25, -65, -69, -69, -69, -49, -69, -69,
191
+ -58, -59, -60, -61, -62, 115, -69, -69, -69, -69,
192
+ -69, -69, -54, -57, -69, -66, -69, -34, -41, -69,
193
+ -38, -45, -46, -69, -69, -29, -31, -32, -35, -69,
194
+ -69, -39, -69, -47, -69, -69, -69, -36, -42, -20,
195
+ -21, -43, -40, -69, -69, -69, -30, -69, -69, -69,
196
+ -22, -69, -28, -33, -37, -44, -69, -67, -69, -26,
197
+ -69, -69, -68, -69, -27 ]
196
198
 
197
199
  racc_goto_table = [
198
- 89, 73, 104, 40, 65, 68, 45, 15, 7, 8,
199
- 9, 11, 111, 12, 98, 13, 14, 101, 102, 103,
200
- 6, 94, 16, 17, 18, 1, 38, 5, 100, 4,
201
- 110, 72, 3, 2, 86, 44 ]
200
+ 91, 75, 106, 42, 67, 70, 47, 16, 7, 8,
201
+ 9, 11, 113, 12, 100, 13, 14, 103, 104, 105,
202
+ 15, 96, 6, 17, 18, 19, 1, 40, 5, 102,
203
+ 112, 4, 74, 3, 2, 88, 46 ]
202
204
 
203
205
  racc_goto_check = [
204
- 18, 24, 22, 20, 25, 25, 20, 14, 7, 8,
205
- 9, 10, 22, 11, 18, 12, 13, 18, 18, 18,
206
- 6, 24, 15, 16, 17, 1, 19, 5, 21, 4,
207
- 18, 23, 3, 2, 26, 27 ]
206
+ 19, 25, 23, 21, 26, 26, 21, 15, 7, 8,
207
+ 9, 10, 23, 11, 19, 12, 13, 19, 19, 19,
208
+ 14, 25, 6, 16, 17, 18, 1, 20, 5, 22,
209
+ 19, 4, 24, 3, 2, 27, 28 ]
208
210
 
209
211
  racc_goto_pointer = [
210
- nil, 25, 33, 32, 29, 27, 20, 8, 9, 10,
211
- 11, 13, 15, 16, 7, 22, 23, 24, -78, 6,
212
- -17, -65, -97, -33, -63, -53, -43, 12 ]
212
+ nil, 26, 34, 33, 31, 28, 22, 8, 9, 10,
213
+ 11, 13, 15, 16, 20, 7, 23, 24, 25, -80,
214
+ 6, -18, -66, -99, -34, -65, -55, -44, 12 ]
213
215
 
214
216
  racc_goto_default = [
215
217
  nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
216
- nil, nil, nil, nil, nil, nil, nil, nil, 105, nil,
217
- nil, nil, nil, nil, nil, nil, 66, nil ]
218
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, 107,
219
+ nil, nil, nil, nil, nil, nil, nil, 68, nil ]
218
220
 
219
221
  racc_reduce_table = [
220
222
  0, 0, :racc_error,
221
- 1, 39, :_reduce_none,
222
- 1, 39, :_reduce_none,
223
- 1, 39, :_reduce_none,
224
- 1, 39, :_reduce_none,
225
- 1, 39, :_reduce_none,
226
- 1, 39, :_reduce_none,
227
- 1, 39, :_reduce_none,
228
- 1, 39, :_reduce_none,
229
- 1, 39, :_reduce_none,
230
- 1, 39, :_reduce_none,
231
- 1, 39, :_reduce_none,
232
- 1, 39, :_reduce_none,
233
- 1, 39, :_reduce_none,
234
- 1, 39, :_reduce_none,
235
- 1, 39, :_reduce_none,
236
- 1, 39, :_reduce_none,
237
- 1, 39, :_reduce_none,
238
- 1, 39, :_reduce_18,
239
- 1, 56, :_reduce_none,
240
- 1, 56, :_reduce_none,
241
- 8, 40, :_reduce_21,
242
- 0, 57, :_reduce_22,
243
- 1, 57, :_reduce_23,
244
- 1, 57, :_reduce_none,
245
- 3, 59, :_reduce_25,
246
- 5, 59, :_reduce_26,
247
- 8, 41, :_reduce_27,
248
- 1, 61, :_reduce_28,
249
- 3, 61, :_reduce_29,
250
- 1, 62, :_reduce_none,
251
- 1, 62, :_reduce_none,
252
- 8, 42, :_reduce_32,
253
- 4, 42, :_reduce_33,
254
- 5, 42, :_reduce_34,
255
- 6, 42, :_reduce_35,
256
- 8, 43, :_reduce_36,
257
- 4, 43, :_reduce_37,
258
- 5, 43, :_reduce_38,
259
- 6, 43, :_reduce_39,
260
- 1, 63, :_reduce_40,
261
- 3, 63, :_reduce_41,
262
- 3, 64, :_reduce_42,
263
- 8, 44, :_reduce_43,
264
- 4, 44, :_reduce_44,
265
- 4, 44, :_reduce_45,
266
- 5, 44, :_reduce_46,
267
- 0, 65, :_reduce_47,
268
- 1, 65, :_reduce_none,
269
- 1, 45, :_reduce_49,
223
+ 1, 40, :_reduce_none,
224
+ 1, 40, :_reduce_none,
225
+ 1, 40, :_reduce_none,
226
+ 1, 40, :_reduce_none,
227
+ 1, 40, :_reduce_none,
228
+ 1, 40, :_reduce_none,
229
+ 1, 40, :_reduce_none,
230
+ 1, 40, :_reduce_none,
231
+ 1, 40, :_reduce_none,
232
+ 1, 40, :_reduce_none,
233
+ 1, 40, :_reduce_none,
234
+ 1, 40, :_reduce_none,
235
+ 1, 40, :_reduce_none,
236
+ 1, 40, :_reduce_none,
237
+ 1, 40, :_reduce_none,
238
+ 1, 40, :_reduce_none,
239
+ 1, 40, :_reduce_none,
240
+ 1, 40, :_reduce_none,
241
+ 1, 40, :_reduce_19,
242
+ 1, 58, :_reduce_none,
243
+ 1, 58, :_reduce_none,
244
+ 8, 41, :_reduce_22,
245
+ 0, 59, :_reduce_23,
246
+ 1, 59, :_reduce_24,
247
+ 1, 59, :_reduce_none,
248
+ 3, 61, :_reduce_26,
249
+ 5, 61, :_reduce_27,
250
+ 8, 42, :_reduce_28,
251
+ 1, 63, :_reduce_29,
252
+ 3, 63, :_reduce_30,
253
+ 1, 64, :_reduce_none,
254
+ 1, 64, :_reduce_none,
255
+ 8, 43, :_reduce_33,
256
+ 4, 43, :_reduce_34,
257
+ 5, 43, :_reduce_35,
258
+ 6, 43, :_reduce_36,
259
+ 8, 44, :_reduce_37,
260
+ 4, 44, :_reduce_38,
261
+ 5, 44, :_reduce_39,
262
+ 6, 44, :_reduce_40,
263
+ 1, 65, :_reduce_41,
264
+ 3, 65, :_reduce_42,
265
+ 3, 66, :_reduce_43,
266
+ 8, 45, :_reduce_44,
267
+ 4, 45, :_reduce_45,
268
+ 4, 45, :_reduce_46,
269
+ 5, 45, :_reduce_47,
270
+ 0, 67, :_reduce_48,
271
+ 1, 67, :_reduce_none,
270
272
  1, 46, :_reduce_50,
271
273
  1, 47, :_reduce_51,
272
- 1, 46, :_reduce_52,
273
- 3, 49, :_reduce_53,
274
- 1, 48, :_reduce_54,
275
- 3, 50, :_reduce_55,
276
- 2, 51, :_reduce_56,
277
- 2, 51, :_reduce_57,
274
+ 1, 48, :_reduce_52,
275
+ 1, 47, :_reduce_53,
276
+ 3, 50, :_reduce_54,
277
+ 1, 49, :_reduce_55,
278
+ 1, 57, :_reduce_56,
279
+ 3, 51, :_reduce_57,
278
280
  2, 52, :_reduce_58,
279
- 2, 53, :_reduce_59,
281
+ 2, 52, :_reduce_59,
280
282
  2, 53, :_reduce_60,
281
- 1, 54, :_reduce_61,
282
- 1, 55, :_reduce_62,
283
- 1, 58, :_reduce_63,
284
- 3, 58, :_reduce_64,
283
+ 2, 54, :_reduce_61,
284
+ 2, 54, :_reduce_62,
285
+ 1, 55, :_reduce_63,
286
+ 1, 56, :_reduce_64,
285
287
  1, 60, :_reduce_65,
286
- 3, 60, :_reduce_66 ]
288
+ 3, 60, :_reduce_66,
289
+ 1, 62, :_reduce_67,
290
+ 3, 62, :_reduce_68 ]
287
291
 
288
- racc_reduce_n = 67
292
+ racc_reduce_n = 69
289
293
 
290
- racc_shift_n = 113
294
+ racc_shift_n = 115
291
295
 
292
296
  racc_token_table = {
293
297
  false => 0,
@@ -319,17 +323,18 @@ racc_token_table = {
319
323
  :CREATE => 26,
320
324
  :DOMAIN => 27,
321
325
  :PAGE => 28,
322
- :DROP => 29,
323
- :SHOW => 30,
324
- :DOMAINS => 31,
325
- :REGIONS => 32,
326
- :USE => 33,
327
- :DESC => 34,
328
- :DESCRIBE => 35,
329
- :RUBY => 36,
330
- :EXEC => 37 }
331
-
332
- racc_nt_base = 38
326
+ :TAIL => 29,
327
+ :DROP => 30,
328
+ :SHOW => 31,
329
+ :DOMAINS => 32,
330
+ :REGIONS => 33,
331
+ :USE => 34,
332
+ :DESC => 35,
333
+ :DESCRIBE => 36,
334
+ :RUBY => 37,
335
+ :EXEC => 38 }
336
+
337
+ racc_nt_base = 39
333
338
 
334
339
  racc_use_result_var = false
335
340
 
@@ -379,6 +384,7 @@ Racc_token_to_s_table = [
379
384
  "CREATE",
380
385
  "DOMAIN",
381
386
  "PAGE",
387
+ "TAIL",
382
388
  "DROP",
383
389
  "SHOW",
384
390
  "DOMAINS",
@@ -406,6 +412,7 @@ Racc_token_to_s_table = [
406
412
  "desc_stmt",
407
413
  "ruby_stmt",
408
414
  "exec_stmt",
415
+ "tail_stmt",
409
416
  "value",
410
417
  "get_output_list",
411
418
  "identifier_list",
@@ -457,56 +464,58 @@ Racc_debug_parser = false
457
464
 
458
465
  # reduce 17 omitted
459
466
 
460
- module_eval(<<'.,.,', 'sdb-parser.y', 22)
461
- def _reduce_18(val, _values)
467
+ # reduce 18 omitted
468
+
469
+ module_eval(<<'.,.,', 'sdb-parser.y', 23)
470
+ def _reduce_19(val, _values)
462
471
  @stmt_with_expr
463
472
 
464
473
  end
465
474
  .,.,
466
475
 
467
- # reduce 19 omitted
468
-
469
476
  # reduce 20 omitted
470
477
 
471
- module_eval(<<'.,.,', 'sdb-parser.y', 30)
472
- def _reduce_21(val, _values)
478
+ # reduce 21 omitted
479
+
480
+ module_eval(<<'.,.,', 'sdb-parser.y', 31)
481
+ def _reduce_22(val, _values)
473
482
  struct(:GET, :domain => val[3], :item_name => val[7], :attr_names => val[1])
474
483
 
475
484
  end
476
485
  .,.,
477
486
 
478
- module_eval(<<'.,.,', 'sdb-parser.y', 35)
479
- def _reduce_22(val, _values)
487
+ module_eval(<<'.,.,', 'sdb-parser.y', 36)
488
+ def _reduce_23(val, _values)
480
489
  []
481
490
 
482
491
  end
483
492
  .,.,
484
493
 
485
- module_eval(<<'.,.,', 'sdb-parser.y', 39)
486
- def _reduce_23(val, _values)
494
+ module_eval(<<'.,.,', 'sdb-parser.y', 40)
495
+ def _reduce_24(val, _values)
487
496
  []
488
497
 
489
498
  end
490
499
  .,.,
491
500
 
492
- # reduce 24 omitted
501
+ # reduce 25 omitted
493
502
 
494
- module_eval(<<'.,.,', 'sdb-parser.y', 45)
495
- def _reduce_25(val, _values)
503
+ module_eval(<<'.,.,', 'sdb-parser.y', 46)
504
+ def _reduce_26(val, _values)
496
505
  [val[1]]
497
506
 
498
507
  end
499
508
  .,.,
500
509
 
501
- module_eval(<<'.,.,', 'sdb-parser.y', 49)
502
- def _reduce_26(val, _values)
510
+ module_eval(<<'.,.,', 'sdb-parser.y', 50)
511
+ def _reduce_27(val, _values)
503
512
  val[0] + [val[3]]
504
513
 
505
514
  end
506
515
  .,.,
507
516
 
508
- module_eval(<<'.,.,', 'sdb-parser.y', 54)
509
- def _reduce_27(val, _values)
517
+ module_eval(<<'.,.,', 'sdb-parser.y', 55)
518
+ def _reduce_28(val, _values)
510
519
  items = val[7].map do |vals|
511
520
  unless val[4].length == vals.length
512
521
  raise Racc::ParseError, 'The number of an attribute and values differs'
@@ -531,26 +540,26 @@ module_eval(<<'.,.,', 'sdb-parser.y', 54)
531
540
  end
532
541
  .,.,
533
542
 
534
- module_eval(<<'.,.,', 'sdb-parser.y', 78)
535
- def _reduce_28(val, _values)
543
+ module_eval(<<'.,.,', 'sdb-parser.y', 79)
544
+ def _reduce_29(val, _values)
536
545
  [val[0]]
537
546
 
538
547
  end
539
548
  .,.,
540
549
 
541
- module_eval(<<'.,.,', 'sdb-parser.y', 82)
542
- def _reduce_29(val, _values)
550
+ module_eval(<<'.,.,', 'sdb-parser.y', 83)
551
+ def _reduce_30(val, _values)
543
552
  val[0] + [val[2]]
544
553
 
545
554
  end
546
555
  .,.,
547
556
 
548
- # reduce 30 omitted
549
-
550
557
  # reduce 31 omitted
551
558
 
552
- module_eval(<<'.,.,', 'sdb-parser.y', 90)
553
- def _reduce_32(val, _values)
559
+ # reduce 32 omitted
560
+
561
+ module_eval(<<'.,.,', 'sdb-parser.y', 91)
562
+ def _reduce_33(val, _values)
554
563
  attrs = {}
555
564
  val[3].each {|k, v| attrs[k] = v }
556
565
  struct(:UPDATE, :domain => val[1], :items => [[val[7], attrs]])
@@ -558,8 +567,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 90)
558
567
  end
559
568
  .,.,
560
569
 
561
- module_eval(<<'.,.,', 'sdb-parser.y', 96)
562
- def _reduce_33(val, _values)
570
+ module_eval(<<'.,.,', 'sdb-parser.y', 97)
571
+ def _reduce_34(val, _values)
563
572
  attrs = {}
564
573
  val[3].each {|k, v| attrs[k] = v }
565
574
  @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
@@ -567,8 +576,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 96)
567
576
  end
568
577
  .,.,
569
578
 
570
- module_eval(<<'.,.,', 'sdb-parser.y', 102)
571
- def _reduce_34(val, _values)
579
+ module_eval(<<'.,.,', 'sdb-parser.y', 103)
580
+ def _reduce_35(val, _values)
572
581
  attrs = {}
573
582
  val[3].each {|k, v| attrs[k] = v }
574
583
  @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
@@ -576,8 +585,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 102)
576
585
  end
577
586
  .,.,
578
587
 
579
- module_eval(<<'.,.,', 'sdb-parser.y', 108)
580
- def _reduce_35(val, _values)
588
+ module_eval(<<'.,.,', 'sdb-parser.y', 109)
589
+ def _reduce_36(val, _values)
581
590
  attrs = {}
582
591
  val[3].each {|k, v| attrs[k] = v }
583
592
  @stmt_with_expr = struct(:UPDATE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
@@ -585,8 +594,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 108)
585
594
  end
586
595
  .,.,
587
596
 
588
- module_eval(<<'.,.,', 'sdb-parser.y', 115)
589
- def _reduce_36(val, _values)
597
+ module_eval(<<'.,.,', 'sdb-parser.y', 116)
598
+ def _reduce_37(val, _values)
590
599
  attrs = {}
591
600
  val[3].each {|k, v| attrs[k] = v }
592
601
  struct(:MERGE, :domain => val[1], :items => [[val[7], attrs]])
@@ -594,8 +603,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 115)
594
603
  end
595
604
  .,.,
596
605
 
597
- module_eval(<<'.,.,', 'sdb-parser.y', 121)
598
- def _reduce_37(val, _values)
606
+ module_eval(<<'.,.,', 'sdb-parser.y', 122)
607
+ def _reduce_38(val, _values)
599
608
  attrs = {}
600
609
  val[3].each {|k, v| attrs[k] = v }
601
610
  @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => '')
@@ -603,8 +612,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 121)
603
612
  end
604
613
  .,.,
605
614
 
606
- module_eval(<<'.,.,', 'sdb-parser.y', 127)
607
- def _reduce_38(val, _values)
615
+ module_eval(<<'.,.,', 'sdb-parser.y', 128)
616
+ def _reduce_39(val, _values)
608
617
  attrs = {}
609
618
  val[3].each {|k, v| attrs[k] = v }
610
619
  @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE ')
@@ -612,8 +621,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 127)
612
621
  end
613
622
  .,.,
614
623
 
615
- module_eval(<<'.,.,', 'sdb-parser.y', 133)
616
- def _reduce_39(val, _values)
624
+ module_eval(<<'.,.,', 'sdb-parser.y', 134)
625
+ def _reduce_40(val, _values)
617
626
  attrs = {}
618
627
  val[3].each {|k, v| attrs[k] = v }
619
628
  @stmt_with_expr = struct(:MERGE_WITH_EXPR, :domain => val[1], :attrs => attrs, :expr => 'WHERE itemName')
@@ -621,69 +630,69 @@ module_eval(<<'.,.,', 'sdb-parser.y', 133)
621
630
  end
622
631
  .,.,
623
632
 
624
- module_eval(<<'.,.,', 'sdb-parser.y', 140)
625
- def _reduce_40(val, _values)
633
+ module_eval(<<'.,.,', 'sdb-parser.y', 141)
634
+ def _reduce_41(val, _values)
626
635
  [val[0]]
627
636
 
628
637
  end
629
638
  .,.,
630
639
 
631
- module_eval(<<'.,.,', 'sdb-parser.y', 144)
632
- def _reduce_41(val, _values)
640
+ module_eval(<<'.,.,', 'sdb-parser.y', 145)
641
+ def _reduce_42(val, _values)
633
642
  val[0] + [val[2]]
634
643
 
635
644
  end
636
645
  .,.,
637
646
 
638
- module_eval(<<'.,.,', 'sdb-parser.y', 149)
639
- def _reduce_42(val, _values)
647
+ module_eval(<<'.,.,', 'sdb-parser.y', 150)
648
+ def _reduce_43(val, _values)
640
649
  [val[0], val[2]]
641
650
 
642
651
  end
643
652
  .,.,
644
653
 
645
- module_eval(<<'.,.,', 'sdb-parser.y', 154)
646
- def _reduce_43(val, _values)
654
+ module_eval(<<'.,.,', 'sdb-parser.y', 155)
655
+ def _reduce_44(val, _values)
647
656
  struct(:DELETE, :domain => val[3], :items => [[val[7], val[1]]])
648
657
 
649
658
  end
650
659
  .,.,
651
660
 
652
- module_eval(<<'.,.,', 'sdb-parser.y', 158)
653
- def _reduce_44(val, _values)
661
+ module_eval(<<'.,.,', 'sdb-parser.y', 159)
662
+ def _reduce_45(val, _values)
654
663
  @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => '')
655
664
 
656
665
  end
657
666
  .,.,
658
667
 
659
- module_eval(<<'.,.,', 'sdb-parser.y', 162)
660
- def _reduce_45(val, _values)
668
+ module_eval(<<'.,.,', 'sdb-parser.y', 163)
669
+ def _reduce_46(val, _values)
661
670
  @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE ')
662
671
 
663
672
  end
664
673
  .,.,
665
674
 
666
- module_eval(<<'.,.,', 'sdb-parser.y', 166)
667
- def _reduce_46(val, _values)
675
+ module_eval(<<'.,.,', 'sdb-parser.y', 167)
676
+ def _reduce_47(val, _values)
668
677
  @stmt_with_expr = struct(:DELETE_WITH_EXPR, :domain => val[3], :attrs => val[1], :expr => 'WHERE itemName')
669
678
 
670
679
  end
671
680
  .,.,
672
681
 
673
- module_eval(<<'.,.,', 'sdb-parser.y', 171)
674
- def _reduce_47(val, _values)
682
+ module_eval(<<'.,.,', 'sdb-parser.y', 172)
683
+ def _reduce_48(val, _values)
675
684
  []
676
685
 
677
686
  end
678
687
  .,.,
679
688
 
680
- # reduce 48 omitted
689
+ # reduce 49 omitted
681
690
 
682
- module_eval(<<'.,.,', 'sdb-parser.y', 177)
683
- def _reduce_49(val, _values)
691
+ module_eval(<<'.,.,', 'sdb-parser.y', 178)
692
+ def _reduce_50(val, _values)
684
693
  query = ''
685
694
  script = nil
686
- script_type = nil
695
+ script_type = nil
687
696
 
688
697
  ss = StringScanner.new(val[0])
689
698
 
@@ -712,8 +721,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 177)
712
721
  end
713
722
  .,.,
714
723
 
715
- module_eval(<<'.,.,', 'sdb-parser.y', 208)
716
- def _reduce_50(val, _values)
724
+ module_eval(<<'.,.,', 'sdb-parser.y', 209)
725
+ def _reduce_51(val, _values)
717
726
  script = nil
718
727
  script_type = nil
719
728
 
@@ -731,8 +740,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 208)
731
740
  end
732
741
  .,.,
733
742
 
734
- module_eval(<<'.,.,', 'sdb-parser.y', 225)
735
- def _reduce_51(val, _values)
743
+ module_eval(<<'.,.,', 'sdb-parser.y', 226)
744
+ def _reduce_52(val, _values)
736
745
  script = nil
737
746
  script_type = nil
738
747
 
@@ -750,8 +759,8 @@ module_eval(<<'.,.,', 'sdb-parser.y', 225)
750
759
  end
751
760
  .,.,
752
761
 
753
- module_eval(<<'.,.,', 'sdb-parser.y', 242)
754
- def _reduce_52(val, _values)
762
+ module_eval(<<'.,.,', 'sdb-parser.y', 243)
763
+ def _reduce_53(val, _values)
755
764
  script = nil
756
765
  script_type = nil
757
766
 
@@ -769,15 +778,15 @@ module_eval(<<'.,.,', 'sdb-parser.y', 242)
769
778
  end
770
779
  .,.,
771
780
 
772
- module_eval(<<'.,.,', 'sdb-parser.y', 259)
773
- def _reduce_53(val, _values)
781
+ module_eval(<<'.,.,', 'sdb-parser.y', 260)
782
+ def _reduce_54(val, _values)
774
783
  struct(:CREATE, :domain => val[2])
775
784
 
776
785
  end
777
786
  .,.,
778
787
 
779
- module_eval(<<'.,.,', 'sdb-parser.y', 264)
780
- def _reduce_54(val, _values)
788
+ module_eval(<<'.,.,', 'sdb-parser.y', 265)
789
+ def _reduce_55(val, _values)
781
790
  page = nil
782
791
  script = nil
783
792
  script_type = nil
@@ -800,87 +809,110 @@ module_eval(<<'.,.,', 'sdb-parser.y', 264)
800
809
  end
801
810
  .,.,
802
811
 
803
- module_eval(<<'.,.,', 'sdb-parser.y', 286)
804
- def _reduce_55(val, _values)
812
+ module_eval(<<'.,.,', 'sdb-parser.y', 287)
813
+ def _reduce_56(val, _values)
814
+ domain_name = nil
815
+ script = nil
816
+ script_type = nil
817
+
818
+ case val[0]
819
+ when /\s*\|\s*/
820
+ domain_name, script = val[0].split(/\s*\|\s*/, 2)
821
+ script_type = :ruby
822
+ when /\s*!\s*/
823
+ domain_name, script = val[0].split(/\s*\!\s*/, 2)
824
+ script_type = :shell
825
+ else
826
+ domain_name = val[0]
827
+ end
828
+
829
+ domain_name = domain_name.split(/\b/, 2).last.strip
830
+ struct(:TAIL, :domain => domain_name, :script => script, :script_type => script_type)
831
+
832
+ end
833
+ .,.,
834
+
835
+ module_eval(<<'.,.,', 'sdb-parser.y', 308)
836
+ def _reduce_57(val, _values)
805
837
  struct(:DROP, :domain => val[2])
806
838
 
807
839
  end
808
840
  .,.,
809
841
 
810
- module_eval(<<'.,.,', 'sdb-parser.y', 291)
811
- def _reduce_56(val, _values)
842
+ module_eval(<<'.,.,', 'sdb-parser.y', 313)
843
+ def _reduce_58(val, _values)
812
844
  struct(:SHOW, :operand => :domains)
813
845
 
814
846
  end
815
847
  .,.,
816
848
 
817
- module_eval(<<'.,.,', 'sdb-parser.y', 295)
818
- def _reduce_57(val, _values)
849
+ module_eval(<<'.,.,', 'sdb-parser.y', 317)
850
+ def _reduce_59(val, _values)
819
851
  struct(:SHOW, :operand => :regions)
820
852
 
821
853
  end
822
854
  .,.,
823
855
 
824
- module_eval(<<'.,.,', 'sdb-parser.y', 299)
825
- def _reduce_58(val, _values)
856
+ module_eval(<<'.,.,', 'sdb-parser.y', 322)
857
+ def _reduce_60(val, _values)
826
858
  struct(:USE, :endpoint => val[1])
827
859
 
828
860
  end
829
861
  .,.,
830
862
 
831
- module_eval(<<'.,.,', 'sdb-parser.y', 303)
832
- def _reduce_59(val, _values)
863
+ module_eval(<<'.,.,', 'sdb-parser.y', 327)
864
+ def _reduce_61(val, _values)
833
865
  struct(:DESCRIBE, :domain => val[1])
834
866
 
835
867
  end
836
868
  .,.,
837
869
 
838
- module_eval(<<'.,.,', 'sdb-parser.y', 307)
839
- def _reduce_60(val, _values)
870
+ module_eval(<<'.,.,', 'sdb-parser.y', 331)
871
+ def _reduce_62(val, _values)
840
872
  struct(:DESCRIBE, :domain => val[1])
841
873
 
842
874
  end
843
875
  .,.,
844
876
 
845
- module_eval(<<'.,.,', 'sdb-parser.y', 311)
846
- def _reduce_61(val, _values)
877
+ module_eval(<<'.,.,', 'sdb-parser.y', 336)
878
+ def _reduce_63(val, _values)
847
879
  script = val[0].sub(/\A\s*\|\s*/, '')
848
880
  struct(:RUBY, :script => script)
849
881
 
850
882
  end
851
883
  .,.,
852
884
 
853
- module_eval(<<'.,.,', 'sdb-parser.y', 316)
854
- def _reduce_62(val, _values)
885
+ module_eval(<<'.,.,', 'sdb-parser.y', 342)
886
+ def _reduce_64(val, _values)
855
887
  script = val[0].sub(/\A\s*!\s*/, '')
856
888
  struct(:EXEC, :script => script)
857
889
 
858
890
  end
859
891
  .,.,
860
892
 
861
- module_eval(<<'.,.,', 'sdb-parser.y', 322)
862
- def _reduce_63(val, _values)
893
+ module_eval(<<'.,.,', 'sdb-parser.y', 348)
894
+ def _reduce_65(val, _values)
863
895
  [val[0]]
864
896
 
865
897
  end
866
898
  .,.,
867
899
 
868
- module_eval(<<'.,.,', 'sdb-parser.y', 326)
869
- def _reduce_64(val, _values)
900
+ module_eval(<<'.,.,', 'sdb-parser.y', 352)
901
+ def _reduce_66(val, _values)
870
902
  val[0] + [val[2]]
871
903
 
872
904
  end
873
905
  .,.,
874
906
 
875
- module_eval(<<'.,.,', 'sdb-parser.y', 331)
876
- def _reduce_65(val, _values)
907
+ module_eval(<<'.,.,', 'sdb-parser.y', 357)
908
+ def _reduce_67(val, _values)
877
909
  [val[0]]
878
910
 
879
911
  end
880
912
  .,.,
881
913
 
882
- module_eval(<<'.,.,', 'sdb-parser.y', 335)
883
- def _reduce_66(val, _values)
914
+ module_eval(<<'.,.,', 'sdb-parser.y', 361)
915
+ def _reduce_68(val, _values)
884
916
  [val[0], val[2]].flatten
885
917
 
886
918
  end
@@ -18,6 +18,7 @@ rule
18
18
  | desc_stmt
19
19
  | ruby_stmt
20
20
  | exec_stmt
21
+ | tail_stmt
21
22
  | error
22
23
  {
23
24
  @stmt_with_expr
@@ -282,6 +283,27 @@ rule
282
283
  struct(:PAGE, :page => page, :script => script, :script_type => script_type)
283
284
  }
284
285
 
286
+ tail_stmt : TAIL
287
+ {
288
+ domain_name = nil
289
+ script = nil
290
+ script_type = nil
291
+
292
+ case val[0]
293
+ when /\s*\|\s*/
294
+ domain_name, script = val[0].split(/\s*\|\s*/, 2)
295
+ script_type = :ruby
296
+ when /\s*!\s*/
297
+ domain_name, script = val[0].split(/\s*\!\s*/, 2)
298
+ script_type = :shell
299
+ else
300
+ domain_name = val[0]
301
+ end
302
+
303
+ domain_name = domain_name.split(/\b/, 2).last.strip
304
+ struct(:TAIL, :domain => domain_name, :script => script, :script_type => script_type)
305
+ }
306
+
285
307
  drop_stmt : DROP DOMAIN IDENTIFIER
286
308
  {
287
309
  struct(:DROP, :domain => val[2])
@@ -295,10 +317,12 @@ rule
295
317
  {
296
318
  struct(:SHOW, :operand => :regions)
297
319
  }
320
+
298
321
  use_stmt : USE IDENTIFIER
299
322
  {
300
323
  struct(:USE, :endpoint => val[1])
301
324
  }
325
+
302
326
  desc_stmt : DESC IDENTIFIER
303
327
  {
304
328
  struct(:DESCRIBE, :domain => val[1])
@@ -307,11 +331,13 @@ rule
307
331
  {
308
332
  struct(:DESCRIBE, :domain => val[1])
309
333
  }
334
+
310
335
  ruby_stmt : RUBY
311
336
  {
312
337
  script = val[0].sub(/\A\s*\|\s*/, '')
313
338
  struct(:RUBY, :script => script)
314
339
  }
340
+
315
341
  exec_stmt : EXEC
316
342
  {
317
343
  script = val[0].sub(/\A\s*!\s*/, '')
@@ -423,8 +449,10 @@ def scan
423
449
  yield [:CURRENT, @ss.scan(/\s*[|!]\s*.*/)]
424
450
  elsif (tok = @ss.scan /P(REV)?\b/i)
425
451
  yield [:PREV, @ss.scan(/\s*[|!]\s*.*/)]
426
- elsif (tok = @ss.scan /PAGE(\s+\d+)?/i)
452
+ elsif (tok = @ss.scan /PAGE(\s+-?\d+)?/i)
427
453
  yield [:PAGE, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
454
+ elsif (tok = @ss.scan /TAIL\b\s*[^\s]+/i)
455
+ yield [:TAIL, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
428
456
  elsif (tok = @ss.scan /NULL\b/i)
429
457
  yield [:NULL, nil]
430
458
  elsif (tok = @ss.scan /`([^`]|``)*`/)
@@ -246,7 +246,7 @@ module SimpleDB
246
246
  rownum = items.length
247
247
  @driver.delete(parsed.domain, items)
248
248
  Rownum.new(rownum)
249
- when :SELECT, :NEXT, :CURRENT, :PREV, :PAGE
249
+ when :SELECT, :NEXT, :CURRENT, :PREV, :PAGE, :TAIL
250
250
  items = case command
251
251
  when :SELECT
252
252
  @driver.select(parsed.query, consistent, true)
@@ -258,6 +258,8 @@ module SimpleDB
258
258
  @driver.prev_list(consistent)
259
259
  when :PAGE
260
260
  parsed.page ? @driver.page_to(parsed.page, consistent) : @driver.current_page
261
+ when :TAIL
262
+ @driver.tail(parsed.domain, consistent)
261
263
  else
262
264
  raise 'must not happen'
263
265
  end
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: 1.4.7
4
+ version: 1.4.8
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-02-05 00:00:00.000000000 Z
12
+ date: 2013-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri