sdbcli 1.4.5 → 1.4.6

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