sdbcli 1.4.7 → 1.4.8

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