sdbcli 1.4.5 → 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -189,6 +189,14 @@ If '-' is specified as a file name, the input/output of data will become a stand
189
189
 
190
190
  'sum' method and 'avg' method are added to Array class.
191
191
 
192
+ == Pipe to shell
193
+
194
+ ap-northeast-1> select * from employees limit 3 ! awk '{print $1}' ;
195
+ --- |
196
+ ["100000",
197
+ ["100001",
198
+ ["100002",
199
+
192
200
  == Group By (Aggregate)
193
201
 
194
202
  ap-northeast-1> select * from access_logs limit 30;
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.5'
4
+ Version = '1.4.6'
5
5
  HISTORY_FILE = File.join((ENV['HOME'] || ENV['USERPROFILE'] || '.'), '.sdbcli_history')
6
6
  HISTSIZE = 500
7
7
  SELECT_LIMIT = 2500
@@ -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', 294)
16
+ module_eval(<<'...end sdb-parser.y/module_eval...', 'sdb-parser.y', 346)
17
17
 
18
18
  KEYWORDS = %w(
19
19
  ADD
@@ -89,13 +89,13 @@ def scan
89
89
  elsif (tok = @ss.scan /SELECT\b/i)
90
90
  yield [:SELECT, tok + @ss.scan(/.*/)]
91
91
  elsif (tok = @ss.scan /N(EXT)?\b/i)
92
- yield [:NEXT, @ss.scan(/\s*\|\s*.*/)]
92
+ yield [:NEXT, @ss.scan(/\s*[|!]\s*.*/)]
93
93
  elsif (tok = @ss.scan /C(URRENT)?\b/i)
94
- yield [:CURRENT, @ss.scan(/\s*\|\s*.*/)]
94
+ yield [:CURRENT, @ss.scan(/\s*[|!]\s*.*/)]
95
95
  elsif (tok = @ss.scan /P(REV)?\b/i)
96
- yield [:PREV, @ss.scan(/\s*\|\s*.*/)]
96
+ yield [:PREV, @ss.scan(/\s*[|!]\s*.*/)]
97
97
  elsif (tok = @ss.scan /PAGE(\s+\d+)?/i)
98
- yield [:PAGE, tok + @ss.scan(/(\s*\|\s*.*)?/)]
98
+ yield [:PAGE, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
99
99
  elsif (tok = @ss.scan /NULL\b/i)
100
100
  yield [:NULL, nil]
101
101
  elsif (tok = @ss.scan /`([^`]|``)*`/)
@@ -143,78 +143,78 @@ end
143
143
  ##### State transition tables begin ###
144
144
 
145
145
  racc_action_table = [
146
- 7, 11, 78, 79, 20, 72, 45, 74, 77, 77,
147
- 42, 72, 61, 74, 18, 86, 87, 26, 86, 87,
148
- 34, 2, 6, 10, 14, 17, 62, 22, 25, 29,
149
- 86, 87, 1, 5, 9, 13, 16, 86, 87, 49,
150
- 50, 86, 87, 86, 87, 82, 83, 107, 108, 86,
151
- 87, 69, 70, 86, 87, 59, 60, 112, 108, 63,
152
- 64, 65, 65, 56, 58, 75, 57, 56, 55, 80,
153
- 81, 54, 84, 53, 65, 89, 90, 91, 92, 45,
154
- 94, 95, 96, 97, 98, 48, 47, 46, 41, 40,
155
- 106, 39, 109, 38, 37, 76 ]
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 ]
156
156
 
157
157
  racc_action_check = [
158
- 0, 0, 66, 68, 0, 83, 20, 83, 66, 68,
159
- 20, 62, 52, 62, 0, 94, 94, 0, 96, 96,
158
+ 0, 0, 68, 65, 0, 64, 20, 64, 68, 65,
159
+ 20, 84, 1, 84, 0, 95, 95, 0, 99, 99,
160
160
  0, 0, 0, 0, 0, 0, 54, 0, 0, 0,
161
- 95, 95, 0, 0, 0, 0, 0, 97, 97, 29,
162
- 29, 98, 98, 76, 76, 71, 71, 105, 105, 108,
163
- 108, 61, 61, 109, 109, 48, 48, 111, 111, 55,
164
- 56, 59, 60, 51, 47, 63, 46, 44, 43, 69,
165
- 70, 41, 75, 40, 77, 78, 79, 80, 82, 34,
166
- 84, 89, 90, 91, 92, 26, 25, 24, 18, 17,
167
- 99, 9, 106, 5, 1, 65 ]
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 ]
168
168
 
169
169
  racc_action_pointer = [
170
- -1, 87, nil, nil, nil, 86, nil, nil, nil, 84,
171
- nil, nil, nil, nil, nil, nil, nil, 62, 72, nil,
172
- -1, nil, nil, nil, 87, 59, 78, nil, nil, 8,
173
- nil, nil, nil, nil, 72, nil, nil, nil, nil, nil,
174
- 66, 64, nil, 62, 53, nil, 66, 57, 36, nil,
175
- nil, 49, 6, nil, 14, 52, 53, nil, nil, 54,
176
- 55, 44, 4, 57, nil, 85, -6, nil, -5, 61,
177
- 61, 32, nil, nil, nil, 63, 40, 67, 66, 67,
178
- 68, nil, 61, -2, 70, nil, nil, nil, nil, 71,
179
- 72, 73, 72, nil, 12, 27, 15, 34, 38, 76,
180
- nil, nil, nil, nil, nil, 34, 80, nil, 46, 50,
181
- nil, 44, nil ]
170
+ -1, 12, nil, nil, nil, nil, nil, nil, nil, nil,
171
+ 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 ]
182
182
 
183
183
  racc_action_default = [
184
- -67, -67, -49, -17, -5, -67, -50, -18, -6, -67,
185
- -51, -9, -7, -61, -52, -8, -62, -67, -67, -10,
186
- -22, -11, -54, -12, -67, -67, -67, -13, -1, -67,
187
- -14, -2, -15, -3, -47, -16, -4, -58, -59, -60,
188
- -67, -67, -23, -67, -24, -63, -67, -67, -67, -56,
189
- -57, -48, -67, -53, -67, -67, -67, 113, -55, -67,
190
- -67, -67, -67, -67, -64, -67, -33, -40, -37, -44,
191
- -45, -67, -31, -28, -30, -67, -67, -67, -34, -38,
192
- -67, -46, -67, -67, -67, -42, -19, -20, -41, -35,
193
- -39, -67, -67, -29, -67, -67, -67, -67, -67, -27,
194
- -21, -32, -36, -43, -65, -67, -67, -25, -67, -67,
184
+ -67, -67, -1, -2, -3, -4, -5, -6, -7, -8,
185
+ -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
195
  -66, -67, -26 ]
196
196
 
197
197
  racc_goto_table = [
198
- 85, 73, 44, 105, 66, 68, 30, 8, 12, 15,
199
- 19, 21, 23, 27, 111, 4, 51, 32, 100, 101,
200
- 102, 103, 93, 35, 3, 24, 43, 36, 99, 33,
201
- 71, 31, 110, 28, 88, 52 ]
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 ]
202
202
 
203
203
  racc_goto_check = [
204
- 18, 24, 20, 22, 25, 25, 14, 7, 8, 9,
205
- 10, 11, 12, 13, 22, 6, 20, 15, 18, 18,
206
- 18, 18, 24, 16, 17, 1, 19, 5, 21, 4,
207
- 23, 3, 18, 2, 26, 27 ]
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 ]
208
208
 
209
209
  racc_goto_pointer = [
210
- nil, 25, 33, 31, 29, 27, 15, 7, 8, 9,
211
- 10, 11, 12, 13, 6, 17, 23, 24, -76, 6,
212
- -18, -64, -95, -32, -61, -55, -43, 1 ]
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 ]
213
213
 
214
214
  racc_goto_default = [
215
215
  nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
216
- nil, nil, nil, nil, nil, nil, nil, nil, 104, nil,
217
- nil, nil, nil, nil, nil, nil, 67, nil ]
216
+ nil, nil, nil, nil, nil, nil, nil, nil, 105, nil,
217
+ nil, nil, nil, nil, nil, nil, 66, nil ]
218
218
 
219
219
  racc_reduce_table = [
220
220
  0, 0, :racc_error,
@@ -682,12 +682,13 @@ module_eval(<<'.,.,', 'sdb-parser.y', 171)
682
682
  module_eval(<<'.,.,', 'sdb-parser.y', 177)
683
683
  def _reduce_49(val, _values)
684
684
  query = ''
685
- ruby = nil
685
+ script = nil
686
+ script_type = nil
686
687
 
687
688
  ss = StringScanner.new(val[0])
688
689
 
689
690
  until ss.eos?
690
- if (tok = ss.scan /[^`'"|]+/) #'
691
+ if (tok = ss.scan /[^`'"|!]+/) #'
691
692
  query << tok
692
693
  elsif (tok = ss.scan /`(?:[^`]|``)*`/)
693
694
  query << tok
@@ -696,101 +697,152 @@ module_eval(<<'.,.,', 'sdb-parser.y', 177)
696
697
  elsif (tok = ss.scan /"(?:[^"]|"")*"/) #"
697
698
  query << tok
698
699
  elsif (tok = ss.scan /\|/)
699
- ruby = ss.scan_until(/\Z/)
700
+ script = ss.scan_until(/\Z/)
701
+ script_type = :ruby
702
+ elsif (tok = ss.scan /!/)
703
+ script = ss.scan_until(/\Z/)
704
+ script_type = :shell
700
705
  elsif (tok = ss.scan /./)
701
706
  query << tok
702
707
  end
703
708
  end
704
709
 
705
- struct(:SELECT, :query => query, :ruby => ruby)
710
+ struct(:SELECT, :query => query, :script => script, :script_type => script_type)
706
711
 
707
712
  end
708
713
  .,.,
709
714
 
710
- module_eval(<<'.,.,', 'sdb-parser.y', 203)
715
+ module_eval(<<'.,.,', 'sdb-parser.y', 208)
711
716
  def _reduce_50(val, _values)
712
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
713
- struct(:NEXT, :ruby => ruby)
717
+ script = nil
718
+ script_type = nil
719
+
720
+ case val[0]
721
+ when /\A\s*\|\s*/
722
+ script = val[0].sub(/\A\s*\|\s*/, '')
723
+ script_type = :ruby
724
+ when /\A\s*!\s*/
725
+ script = val[0].sub(/\A\s*!\s*/, '')
726
+ script_type = :shell
727
+ end
728
+
729
+ struct(:NEXT, :script => script, :script_type => script_type)
714
730
 
715
731
  end
716
732
  .,.,
717
733
 
718
- module_eval(<<'.,.,', 'sdb-parser.y', 209)
734
+ module_eval(<<'.,.,', 'sdb-parser.y', 225)
719
735
  def _reduce_51(val, _values)
720
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
721
- struct(:CURRENT, :ruby => ruby)
736
+ script = nil
737
+ script_type = nil
738
+
739
+ case val[0]
740
+ when /\A\s*\|\s*/
741
+ script = val[0].sub(/\A\s*\|\s*/, '')
742
+ script_type = :ruby
743
+ when /\A\s*!\s*/
744
+ script = val[0].sub(/\A\s*!\s*/, '')
745
+ script_type = :shell
746
+ end
747
+
748
+ struct(:CURRENT, :script => script, :script_type => script_type)
722
749
 
723
750
  end
724
751
  .,.,
725
752
 
726
- module_eval(<<'.,.,', 'sdb-parser.y', 215)
753
+ module_eval(<<'.,.,', 'sdb-parser.y', 242)
727
754
  def _reduce_52(val, _values)
728
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
729
- struct(:PREV, :ruby => ruby)
755
+ script = nil
756
+ script_type = nil
757
+
758
+ case val[0]
759
+ when /\A\s*\|\s*/
760
+ script = val[0].sub(/\A\s*\|\s*/, '')
761
+ script_type = :ruby
762
+ when /\A\s*!\s*/
763
+ script = val[0].sub(/\A\s*!\s*/, '')
764
+ script_type = :shell
765
+ end
766
+
767
+ struct(:PREV, :script => script, :script_type => script_type)
730
768
 
731
769
  end
732
770
  .,.,
733
771
 
734
- module_eval(<<'.,.,', 'sdb-parser.y', 221)
772
+ module_eval(<<'.,.,', 'sdb-parser.y', 259)
735
773
  def _reduce_53(val, _values)
736
774
  struct(:CREATE, :domain => val[2])
737
775
 
738
776
  end
739
777
  .,.,
740
778
 
741
- module_eval(<<'.,.,', 'sdb-parser.y', 226)
779
+ module_eval(<<'.,.,', 'sdb-parser.y', 264)
742
780
  def _reduce_54(val, _values)
743
- page, ruby = val[0].split(/\s*\|\s*/, 2)
781
+ page = nil
782
+ script = nil
783
+ script_type = nil
784
+
785
+ case val[0]
786
+ when /\s*\|\s*/
787
+ page, script = val[0].split(/\s*\|\s*/, 2)
788
+ script_type = :ruby
789
+ when /\s*!\s*/
790
+ page, script = val[0].split(/\s*!\s*/, 2)
791
+ script_type = :shell
792
+ else
793
+ page = val[0]
794
+ end
795
+
744
796
  page = page.split(/\s+/, 2)[1]
745
797
  page = page.strip.to_i if page
746
- struct(:PAGE, :page => page, :ruby => ruby)
798
+ struct(:PAGE, :page => page, :script => script, :script_type => script_type)
747
799
 
748
800
  end
749
801
  .,.,
750
802
 
751
- module_eval(<<'.,.,', 'sdb-parser.y', 234)
803
+ module_eval(<<'.,.,', 'sdb-parser.y', 286)
752
804
  def _reduce_55(val, _values)
753
805
  struct(:DROP, :domain => val[2])
754
806
 
755
807
  end
756
808
  .,.,
757
809
 
758
- module_eval(<<'.,.,', 'sdb-parser.y', 239)
810
+ module_eval(<<'.,.,', 'sdb-parser.y', 291)
759
811
  def _reduce_56(val, _values)
760
812
  struct(:SHOW, :operand => :domains)
761
813
 
762
814
  end
763
815
  .,.,
764
816
 
765
- module_eval(<<'.,.,', 'sdb-parser.y', 243)
817
+ module_eval(<<'.,.,', 'sdb-parser.y', 295)
766
818
  def _reduce_57(val, _values)
767
819
  struct(:SHOW, :operand => :regions)
768
820
 
769
821
  end
770
822
  .,.,
771
823
 
772
- module_eval(<<'.,.,', 'sdb-parser.y', 247)
824
+ module_eval(<<'.,.,', 'sdb-parser.y', 299)
773
825
  def _reduce_58(val, _values)
774
826
  struct(:USE, :endpoint => val[1])
775
827
 
776
828
  end
777
829
  .,.,
778
830
 
779
- module_eval(<<'.,.,', 'sdb-parser.y', 251)
831
+ module_eval(<<'.,.,', 'sdb-parser.y', 303)
780
832
  def _reduce_59(val, _values)
781
833
  struct(:DESCRIBE, :domain => val[1])
782
834
 
783
835
  end
784
836
  .,.,
785
837
 
786
- module_eval(<<'.,.,', 'sdb-parser.y', 255)
838
+ module_eval(<<'.,.,', 'sdb-parser.y', 307)
787
839
  def _reduce_60(val, _values)
788
840
  struct(:DESCRIBE, :domain => val[1])
789
841
 
790
842
  end
791
843
  .,.,
792
844
 
793
- module_eval(<<'.,.,', 'sdb-parser.y', 259)
845
+ module_eval(<<'.,.,', 'sdb-parser.y', 311)
794
846
  def _reduce_61(val, _values)
795
847
  script = val[0].sub(/\A\s*\|\s*/, '')
796
848
  struct(:RUBY, :script => script)
@@ -798,7 +850,7 @@ module_eval(<<'.,.,', 'sdb-parser.y', 259)
798
850
  end
799
851
  .,.,
800
852
 
801
- module_eval(<<'.,.,', 'sdb-parser.y', 264)
853
+ module_eval(<<'.,.,', 'sdb-parser.y', 316)
802
854
  def _reduce_62(val, _values)
803
855
  script = val[0].sub(/\A\s*!\s*/, '')
804
856
  struct(:EXEC, :script => script)
@@ -806,28 +858,28 @@ module_eval(<<'.,.,', 'sdb-parser.y', 264)
806
858
  end
807
859
  .,.,
808
860
 
809
- module_eval(<<'.,.,', 'sdb-parser.y', 270)
861
+ module_eval(<<'.,.,', 'sdb-parser.y', 322)
810
862
  def _reduce_63(val, _values)
811
863
  [val[0]]
812
864
 
813
865
  end
814
866
  .,.,
815
867
 
816
- module_eval(<<'.,.,', 'sdb-parser.y', 274)
868
+ module_eval(<<'.,.,', 'sdb-parser.y', 326)
817
869
  def _reduce_64(val, _values)
818
870
  val[0] + [val[2]]
819
871
 
820
872
  end
821
873
  .,.,
822
874
 
823
- module_eval(<<'.,.,', 'sdb-parser.y', 279)
875
+ module_eval(<<'.,.,', 'sdb-parser.y', 331)
824
876
  def _reduce_65(val, _values)
825
877
  [val[0]]
826
878
 
827
879
  end
828
880
  .,.,
829
881
 
830
- module_eval(<<'.,.,', 'sdb-parser.y', 283)
882
+ module_eval(<<'.,.,', 'sdb-parser.y', 335)
831
883
  def _reduce_66(val, _values)
832
884
  [val[0], val[2]].flatten
833
885
 
@@ -176,12 +176,13 @@ rule
176
176
  select_stmt : SELECT
177
177
  {
178
178
  query = ''
179
- ruby = nil
179
+ script = nil
180
+ script_type = nil
180
181
 
181
182
  ss = StringScanner.new(val[0])
182
183
 
183
184
  until ss.eos?
184
- if (tok = ss.scan /[^`'"|]+/) #'
185
+ if (tok = ss.scan /[^`'"|!]+/) #'
185
186
  query << tok
186
187
  elsif (tok = ss.scan /`(?:[^`]|``)*`/)
187
188
  query << tok
@@ -190,31 +191,68 @@ rule
190
191
  elsif (tok = ss.scan /"(?:[^"]|"")*"/) #"
191
192
  query << tok
192
193
  elsif (tok = ss.scan /\|/)
193
- ruby = ss.scan_until(/\Z/)
194
+ script = ss.scan_until(/\Z/)
195
+ script_type = :ruby
196
+ elsif (tok = ss.scan /!/)
197
+ script = ss.scan_until(/\Z/)
198
+ script_type = :shell
194
199
  elsif (tok = ss.scan /./)
195
200
  query << tok
196
201
  end
197
202
  end
198
203
 
199
- struct(:SELECT, :query => query, :ruby => ruby)
204
+ struct(:SELECT, :query => query, :script => script, :script_type => script_type)
200
205
  }
201
206
 
202
207
  next_stmt : NEXT
203
208
  {
204
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
205
- struct(:NEXT, :ruby => ruby)
209
+ script = nil
210
+ script_type = nil
211
+
212
+ case val[0]
213
+ when /\A\s*\|\s*/
214
+ script = val[0].sub(/\A\s*\|\s*/, '')
215
+ script_type = :ruby
216
+ when /\A\s*!\s*/
217
+ script = val[0].sub(/\A\s*!\s*/, '')
218
+ script_type = :shell
219
+ end
220
+
221
+ struct(:NEXT, :script => script, :script_type => script_type)
206
222
  }
207
223
 
208
224
  current_stmt : CURRENT
209
225
  {
210
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
211
- struct(:CURRENT, :ruby => ruby)
226
+ script = nil
227
+ script_type = nil
228
+
229
+ case val[0]
230
+ when /\A\s*\|\s*/
231
+ script = val[0].sub(/\A\s*\|\s*/, '')
232
+ script_type = :ruby
233
+ when /\A\s*!\s*/
234
+ script = val[0].sub(/\A\s*!\s*/, '')
235
+ script_type = :shell
236
+ end
237
+
238
+ struct(:CURRENT, :script => script, :script_type => script_type)
212
239
  }
213
240
 
214
241
  next_stmt : PREV
215
242
  {
216
- ruby = val[0].sub(/\A\s*\|\s*/, '') if val[0]
217
- struct(:PREV, :ruby => ruby)
243
+ script = nil
244
+ script_type = nil
245
+
246
+ case val[0]
247
+ when /\A\s*\|\s*/
248
+ script = val[0].sub(/\A\s*\|\s*/, '')
249
+ script_type = :ruby
250
+ when /\A\s*!\s*/
251
+ script = val[0].sub(/\A\s*!\s*/, '')
252
+ script_type = :shell
253
+ end
254
+
255
+ struct(:PREV, :script => script, :script_type => script_type)
218
256
  }
219
257
 
220
258
  create_stmt : CREATE DOMAIN IDENTIFIER
@@ -224,10 +262,24 @@ rule
224
262
 
225
263
  page_stmt : PAGE
226
264
  {
227
- page, ruby = val[0].split(/\s*\|\s*/, 2)
265
+ page = nil
266
+ script = nil
267
+ script_type = nil
268
+
269
+ case val[0]
270
+ when /\s*\|\s*/
271
+ page, script = val[0].split(/\s*\|\s*/, 2)
272
+ script_type = :ruby
273
+ when /\s*!\s*/
274
+ page, script = val[0].split(/\s*!\s*/, 2)
275
+ script_type = :shell
276
+ else
277
+ page = val[0]
278
+ end
279
+
228
280
  page = page.split(/\s+/, 2)[1]
229
281
  page = page.strip.to_i if page
230
- struct(:PAGE, :page => page, :ruby => ruby)
282
+ struct(:PAGE, :page => page, :script => script, :script_type => script_type)
231
283
  }
232
284
 
233
285
  drop_stmt : DROP DOMAIN IDENTIFIER
@@ -366,13 +418,13 @@ def scan
366
418
  elsif (tok = @ss.scan /SELECT\b/i)
367
419
  yield [:SELECT, tok + @ss.scan(/.*/)]
368
420
  elsif (tok = @ss.scan /N(EXT)?\b/i)
369
- yield [:NEXT, @ss.scan(/\s*\|\s*.*/)]
421
+ yield [:NEXT, @ss.scan(/\s*[|!]\s*.*/)]
370
422
  elsif (tok = @ss.scan /C(URRENT)?\b/i)
371
- yield [:CURRENT, @ss.scan(/\s*\|\s*.*/)]
423
+ yield [:CURRENT, @ss.scan(/\s*[|!]\s*.*/)]
372
424
  elsif (tok = @ss.scan /P(REV)?\b/i)
373
- yield [:PREV, @ss.scan(/\s*\|\s*.*/)]
425
+ yield [:PREV, @ss.scan(/\s*[|!]\s*.*/)]
374
426
  elsif (tok = @ss.scan /PAGE(\s+\d+)?/i)
375
- yield [:PAGE, tok + @ss.scan(/(\s*\|\s*.*)?/)]
427
+ yield [:PAGE, tok + @ss.scan(/(\s*[|!]\s*.*)?/)]
376
428
  elsif (tok = @ss.scan /NULL\b/i)
377
429
  yield [:NULL, nil]
378
430
  elsif (tok = @ss.scan /`([^`]|``)*`/)
@@ -3,10 +3,6 @@ require 'sdbcli/sdb-parser.tab'
3
3
 
4
4
  # XXX:
5
5
  class Array
6
- def to_s
7
- self.map {|i| i.to_s }
8
- end
9
-
10
6
  def to_i
11
7
  self.map {|i| i.to_i }
12
8
  end
@@ -284,10 +280,21 @@ module SimpleDB
284
280
  end
285
281
  end
286
282
 
287
- if parsed.ruby
283
+ if parsed.script
288
284
  begin
289
- items = items.instance_eval(parsed.ruby.strip)
290
- rescue SyntaxError => e
285
+ case parsed.script_type
286
+ when :ruby
287
+ items = items.instance_eval(parsed.script.strip)
288
+ when :shell
289
+ items = IO.popen(parsed.script.strip, "r+") do |f|
290
+ f.puts(items.kind_of?(Array) ? items.map {|i| i.to_s }.join("\n") : items.to_s)
291
+ f.close_write
292
+ f.read
293
+ end
294
+ else
295
+ raise 'must not happen'
296
+ end
297
+ rescue Exception => e
291
298
  raise SimpleDB::Error, e.message
292
299
  end
293
300
  end
metadata CHANGED
@@ -1,59 +1,55 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sdbcli
3
- version: !ruby/object:Gem::Version
4
- hash: 13
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.4.6
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 4
9
- - 5
10
- version: 1.4.5
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - winebarrel
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2013-02-05 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2013-02-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: nokogiri
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: json
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: json
32
+ requirement: !ruby/object:Gem::Requirement
38
33
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
46
38
  type: :runtime
47
- version_requirements: *id002
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
48
46
  description:
49
47
  email: sgwr_dts@yahoo.co.jp
50
- executables:
48
+ executables:
51
49
  - sdbcli
52
50
  extensions: []
53
-
54
51
  extra_rdoc_files: []
55
-
56
- files:
52
+ files:
57
53
  - README
58
54
  - bin/sdbcli
59
55
  - lib/sdbcli/sdb-client.rb
@@ -65,36 +61,26 @@ files:
65
61
  - lib/sdbcli.rb
66
62
  homepage: https://bitbucket.org/winebarrel/sdbcli
67
63
  licenses: []
68
-
69
64
  post_install_message:
70
65
  rdoc_options: []
71
-
72
- require_paths:
66
+ require_paths:
73
67
  - lib
74
- required_ruby_version: !ruby/object:Gem::Requirement
68
+ required_ruby_version: !ruby/object:Gem::Requirement
75
69
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
83
- required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
75
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 0
91
- version: "0"
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
92
80
  requirements: []
93
-
94
81
  rubyforge_project:
95
- rubygems_version: 1.8.24
82
+ rubygems_version: 1.8.23
96
83
  signing_key:
97
84
  specification_version: 3
98
85
  summary: sdbcli is an interactive command-line client of Amazon SimpleDB.
99
86
  test_files: []
100
-