vorax 0.4.2 → 5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +4 -29
- data/vorax.gemspec +3 -11
- metadata +4 -92
- data/.rspec +0 -1
- data/Rakefile +0 -30
- data/lib/vorax.rb +0 -60
- data/lib/vorax/base_funnel.rb +0 -30
- data/lib/vorax/output/html_convertor.rb +0 -120
- data/lib/vorax/output/html_funnel.rb +0 -79
- data/lib/vorax/output/pagezip_convertor.rb +0 -20
- data/lib/vorax/output/tablezip_convertor.rb +0 -22
- data/lib/vorax/output/vertical_convertor.rb +0 -53
- data/lib/vorax/output/zip_convertor.rb +0 -117
- data/lib/vorax/parser/argument.rb~ +0 -125
- data/lib/vorax/parser/conn_string.rb +0 -104
- data/lib/vorax/parser/grammars/alias.rb +0 -904
- data/lib/vorax/parser/grammars/alias.rl +0 -138
- data/lib/vorax/parser/grammars/column.rb +0 -454
- data/lib/vorax/parser/grammars/column.rl +0 -64
- data/lib/vorax/parser/grammars/common.rl +0 -107
- data/lib/vorax/parser/grammars/declare.rb +0 -9606
- data/lib/vorax/parser/grammars/declare.rl +0 -160
- data/lib/vorax/parser/grammars/for_block.rb +0 -440
- data/lib/vorax/parser/grammars/for_block.rl +0 -73
- data/lib/vorax/parser/grammars/plsql_def.rb +0 -539
- data/lib/vorax/parser/grammars/plsql_def.rl +0 -73
- data/lib/vorax/parser/grammars/statement.rb +0 -925
- data/lib/vorax/parser/grammars/statement.rl +0 -83
- data/lib/vorax/parser/parser.rb +0 -344
- data/lib/vorax/parser/plsql_structure.rb +0 -222
- data/lib/vorax/parser/plsql_walker.rb +0 -143
- data/lib/vorax/parser/statement_inspector.rb~ +0 -52
- data/lib/vorax/parser/stmt_inspector.rb +0 -78
- data/lib/vorax/parser/target_ref.rb +0 -110
- data/lib/vorax/sqlplus.rb +0 -273
- data/lib/vorax/version.rb +0 -7
- data/lib/vorax/vorax_io.rb +0 -70
- data/spec/column_spec.rb +0 -40
- data/spec/conn_string_spec.rb +0 -53
- data/spec/declare_spec.rb +0 -281
- data/spec/pagezip_spec.rb +0 -153
- data/spec/parser_spec.rb +0 -352
- data/spec/plsql_structure_spec.rb +0 -68
- data/spec/spec_helper.rb +0 -13
- data/spec/sql/create_objects.sql +0 -69
- data/spec/sql/dbms_crypto.spc +0 -339
- data/spec/sql/dbms_stats.spc +0 -4097
- data/spec/sql/drop_user.sql +0 -10
- data/spec/sql/muci.spc +0 -26
- data/spec/sql/setup_user.sql +0 -22
- data/spec/sql/test.fnc +0 -12
- data/spec/sql/test.pkg +0 -83
- data/spec/sqlplus_spec.rb +0 -52
- data/spec/stmt_inspector_spec.rb +0 -96
- data/spec/tablezip_spec.rb +0 -111
- data/spec/vertical_spec.rb +0 -150
data/spec/pagezip_spec.rb
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
include Vorax
|
4
|
-
|
5
|
-
describe 'pagezip layout' do
|
6
|
-
|
7
|
-
before(:each) do# {{{
|
8
|
-
@sp = Sqlplus.new('sqlplus')
|
9
|
-
@sp.default_convertor = :pagezip
|
10
|
-
@prep = [VORAX_CSTR,
|
11
|
-
"set tab off",
|
12
|
-
"set linesize 10000",
|
13
|
-
"set markup html on",
|
14
|
-
"set echo off",
|
15
|
-
"set pause off",
|
16
|
-
"set define &",
|
17
|
-
"set termout on",
|
18
|
-
"set verify off",
|
19
|
-
"set pagesize 5"].join("\n")
|
20
|
-
@result = ""
|
21
|
-
end# }}}
|
22
|
-
|
23
|
-
it 'should work with multi line records' do# {{{
|
24
|
-
@sp.exec("select * from departments where id in (1, 2, 6);", :prep => @prep)
|
25
|
-
@result << @sp.read_output(32767) while @sp.busy?
|
26
|
-
expected = <<OUTPUT
|
27
|
-
|
28
|
-
SQL>
|
29
|
-
|
30
|
-
ID NAME DESCRIPTION
|
31
|
-
-- ----------- -----------------------------------
|
32
|
-
1 Bookkeeping This department is responsible for:
|
33
|
-
- financial reporting
|
34
|
-
- analysis
|
35
|
-
- other boring tasks
|
36
|
-
2 Marketing
|
37
|
-
6 Management The bad guys department
|
38
|
-
|
39
|
-
SQL>
|
40
|
-
OUTPUT
|
41
|
-
@result.should eq(expected)
|
42
|
-
end# }}}
|
43
|
-
|
44
|
-
it 'should work with a single line record' do# {{{
|
45
|
-
@sp.exec("select * from departments where id=2;", :prep => @prep)
|
46
|
-
@result << @sp.read_output(32767) while @sp.busy?
|
47
|
-
expected = <<OUTPUT
|
48
|
-
|
49
|
-
SQL>
|
50
|
-
|
51
|
-
ID NAME DESCRIPTION
|
52
|
-
-- --------- -----------
|
53
|
-
2 Marketing
|
54
|
-
|
55
|
-
SQL>
|
56
|
-
OUTPUT
|
57
|
-
@result.should eq(expected)
|
58
|
-
end# }}}
|
59
|
-
|
60
|
-
it 'should work without headers' do# {{{
|
61
|
-
@sp.exec("select * from departments where id<=4;", :prep => "#@prep\nset pagesize 0")
|
62
|
-
@result << @sp.read_output(32767) while @sp.busy?
|
63
|
-
expected = <<OUTPUT
|
64
|
-
|
65
|
-
SQL>
|
66
|
-
|
67
|
-
1 Bookkeeping This department is responsible for:
|
68
|
-
- financial reporting
|
69
|
-
- analysis
|
70
|
-
- other boring tasks
|
71
|
-
2 Marketing
|
72
|
-
3 Deliveries
|
73
|
-
4 CRM
|
74
|
-
|
75
|
-
SQL>
|
76
|
-
OUTPUT
|
77
|
-
@result.should eq(expected)
|
78
|
-
end# }}}
|
79
|
-
|
80
|
-
it 'should work with special unicode chars' do# {{{
|
81
|
-
@sp.exec("select * from employees where id=1;", :prep => @prep)
|
82
|
-
@result << @sp.read_output(32767) while @sp.busy?
|
83
|
-
expected = <<OUTPUT
|
84
|
-
|
85
|
-
SQL>
|
86
|
-
|
87
|
-
ID NAME SALARY DEPARTMENT_ID
|
88
|
-
-- ----------- ------ -------------
|
89
|
-
1 Tică Șerban 570 1
|
90
|
-
|
91
|
-
SQL>
|
92
|
-
OUTPUT
|
93
|
-
@result.should eq(expected)
|
94
|
-
end# }}}
|
95
|
-
|
96
|
-
it 'should work with multiple pages' do# {{{
|
97
|
-
@sp.exec("select * from departments where id<=10;", :prep => "#@prep\nset pagesize 4")
|
98
|
-
@result << @sp.read_output(32767) while @sp.busy?
|
99
|
-
expected = <<OUTPUT
|
100
|
-
|
101
|
-
SQL>
|
102
|
-
|
103
|
-
ID NAME DESCRIPTION
|
104
|
-
-- ----------- -----------------------------------
|
105
|
-
1 Bookkeeping This department is responsible for:
|
106
|
-
- financial reporting
|
107
|
-
- analysis
|
108
|
-
- other boring tasks
|
109
|
-
2 Marketing
|
110
|
-
3 Deliveries
|
111
|
-
4 CRM
|
112
|
-
|
113
|
-
ID NAME DESCRIPTION
|
114
|
-
-- ---------------- -----------------------
|
115
|
-
5 Legal Stuff
|
116
|
-
6 Management The bad guys department
|
117
|
-
7 Cooking
|
118
|
-
8 Public Relations
|
119
|
-
|
120
|
-
ID NAME DESCRIPTION
|
121
|
-
-- ----------- -----------
|
122
|
-
9 Aquisitions
|
123
|
-
10 Cleaning
|
124
|
-
|
125
|
-
10 rows selected.
|
126
|
-
|
127
|
-
SQL>
|
128
|
-
OUTPUT
|
129
|
-
#puts @result
|
130
|
-
@result.should eq(expected)
|
131
|
-
end# }}}
|
132
|
-
|
133
|
-
it 'should work with accept prompts' do# {{{
|
134
|
-
begin
|
135
|
-
pack_file = Tempfile.new(['vorax', '.sql'])
|
136
|
-
@sp.exec("accept var prompt \"Enter var: \"\nprompt &var", :prep => @prep, :pack_file => pack_file.path)
|
137
|
-
Timeout::timeout(10) {
|
138
|
-
@result << @sp.read_output(32767) while @result !~ /Enter var:\z/
|
139
|
-
@sp.send_text("muci\n")
|
140
|
-
@result << @sp.read_output(32767) while @result !~ /muci\n\z/
|
141
|
-
}
|
142
|
-
ensure
|
143
|
-
pack_file.unlink
|
144
|
-
end
|
145
|
-
end# }}}
|
146
|
-
|
147
|
-
after(:each) do# {{{
|
148
|
-
@sp.terminate
|
149
|
-
end# }}}
|
150
|
-
|
151
|
-
end
|
152
|
-
|
153
|
-
|
data/spec/parser_spec.rb
DELETED
@@ -1,352 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
include Vorax
|
4
|
-
|
5
|
-
describe 'Parser' do
|
6
|
-
|
7
|
-
it 'should detect the end of a subprogram' do# {{{
|
8
|
-
text = "end;"
|
9
|
-
Parser.plsql_def(text)[:end_def].should be >0;
|
10
|
-
text = "end if;"
|
11
|
-
Parser.plsql_def(text)[:end_type].should_not == 'END';
|
12
|
-
text = "end loop;"
|
13
|
-
Parser.plsql_def(text)[:type].should_not == 'END' ;
|
14
|
-
text = "end my_func;"
|
15
|
-
Parser.plsql_def(text)[:end_def].should be >0;
|
16
|
-
text = "end/*test*/my_prog;"
|
17
|
-
Parser.plsql_def(text)[:end_def].should be >0;
|
18
|
-
text = "end/*test*/\"my_special_prog\";"
|
19
|
-
Parser.plsql_def(text)[:end_def].should be >0;
|
20
|
-
text = "end is_AdminBasket;\r\n\r\n function get_BasketId(pi_impkey in integer, pi_tablename in varchar2)\r\n "
|
21
|
-
Parser.plsql_def(text)[:end_def].should be >0;
|
22
|
-
end# }}}
|
23
|
-
|
24
|
-
it 'shuld detect the end of a loop statement' do
|
25
|
-
Parser.plsql_def("end loop;")[:type].should == 'END_LOOP'
|
26
|
-
Parser.plsql_def("end/*test*/ loop ; ")[:type].should == 'END_LOOP'
|
27
|
-
Parser.plsql_def("end \"loop\"; ")[:type].should_not == 'END_LOOP'
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'shuld detect the end of a if statement' do
|
31
|
-
Parser.plsql_def("end if;")[:type].should == 'END_IF'
|
32
|
-
Parser.plsql_def("end/*test*/ if ; ")[:type].should == 'END_IF'
|
33
|
-
Parser.plsql_def("end \"if\"; ")[:type].should_not == 'END_IF'
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should detect the definition of a plsql module' do# {{{
|
37
|
-
text = "PACKAGE muci AS "
|
38
|
-
result = Parser.plsql_def(text)
|
39
|
-
result[:end_def].should be >0
|
40
|
-
result[:name].should == 'muci'
|
41
|
-
result[:type].should == 'SPEC'
|
42
|
-
text = "package\nbody muci.buci/* bla bla*/ as "
|
43
|
-
result = Parser.plsql_def(text)
|
44
|
-
result[:end_def].should be >0;
|
45
|
-
result[:name].should == 'muci.buci'
|
46
|
-
result[:type].should == 'BODY'
|
47
|
-
text = "package bdy muci.buci/* bla bla*/ as "
|
48
|
-
Parser.plsql_def(text)[:end_def].should be <0;
|
49
|
-
end# }}}
|
50
|
-
|
51
|
-
it 'should work with balanced paren' do# {{{
|
52
|
-
Parser.walk_balanced_paren('(a(b)c)').should eq("(a(b)c)")
|
53
|
-
Parser.walk_balanced_paren('(a(b)(xyz)c)').should eq("(a(b)(xyz)c)")
|
54
|
-
Parser.walk_balanced_paren("(a')'(b)c)bla bla bla").should eq("(a')'(b)c)")
|
55
|
-
Parser.walk_balanced_paren('(a")"(b)c)bla bla bla').should eq('(a")"(b)c)')
|
56
|
-
Parser.walk_balanced_paren("(a/*)*/(b)c)bla bla bla").should eq("(a/*)*/(b)c)")
|
57
|
-
Parser.walk_balanced_paren("(a--)\n(b)c)bla bla bla").should eq("(a--)\n(b)c)")
|
58
|
-
Parser.walk_balanced_paren("(aq[')]'(b)c)bla bla bla").should eq("(aq[')]'(b)c)")
|
59
|
-
end# }}}
|
60
|
-
|
61
|
-
it 'should add the proper end delimitator' do# {{{
|
62
|
-
text = "select * from cat"
|
63
|
-
Parser.prepare_exec(text).should eq("select * from cat;")
|
64
|
-
|
65
|
-
text = <<TEXT
|
66
|
-
begin
|
67
|
-
null;
|
68
|
-
end;
|
69
|
-
TEXT
|
70
|
-
Parser.prepare_exec(text).should eq("begin\n null;\nend;\n/\n")
|
71
|
-
|
72
|
-
text = "set serveroutput on"
|
73
|
-
Parser.prepare_exec(text).should eq("set serveroutput on")
|
74
|
-
|
75
|
-
text = "select * from dual;"
|
76
|
-
Parser.prepare_exec(text).should eq("select * from dual;")
|
77
|
-
end# }}}
|
78
|
-
|
79
|
-
describe 'Comments parsing' do# {{{
|
80
|
-
|
81
|
-
it 'should be smart enough to leave quotes unchanged' do# {{{
|
82
|
-
stmt = <<STR
|
83
|
-
select '/*muci*/' from/*abc*/dual;
|
84
|
-
STR
|
85
|
-
Parser.remove_all_comments(stmt).should eq("select '/*muci*/' from dual;\n")
|
86
|
-
end# }}}
|
87
|
-
|
88
|
-
it 'should remove all comments' do# {{{
|
89
|
-
stmt = <<STR
|
90
|
-
select /* muci */ * from --muhah
|
91
|
-
--bla
|
92
|
-
dual
|
93
|
-
/* muha
|
94
|
-
ha*/
|
95
|
-
;
|
96
|
-
STR
|
97
|
-
Parser.remove_all_comments(stmt).should eq("select * from dual\n \n;\n")
|
98
|
-
end# }}}
|
99
|
-
|
100
|
-
it 'should remove all comments from incomplete statements' do# {{{
|
101
|
-
Parser.remove_all_comments('select /* bla').should eq('select /* bla')
|
102
|
-
end# }}}
|
103
|
-
|
104
|
-
it 'should remove trailing comments' do# {{{
|
105
|
-
text = <<TEXT
|
106
|
-
select * from cat --comment
|
107
|
-
-- alt comment
|
108
|
-
-- si inca un comment
|
109
|
-
TEXT
|
110
|
-
Parser.remove_trailing_comments(text).should eq("select * from cat ")
|
111
|
-
|
112
|
-
text = <<TEXT
|
113
|
-
select * from cat
|
114
|
-
/* multi
|
115
|
-
line comment */
|
116
|
-
/* inca
|
117
|
-
unul */
|
118
|
-
TEXT
|
119
|
-
Parser.remove_trailing_comments(text).should eq("select * from cat\n")
|
120
|
-
|
121
|
-
text = <<TEXT
|
122
|
-
select * from cat
|
123
|
-
/* multi
|
124
|
-
line comment */
|
125
|
-
-- single line comment
|
126
|
-
/* inca
|
127
|
-
unul */
|
128
|
-
-- muhaha
|
129
|
-
TEXT
|
130
|
-
Parser.remove_trailing_comments(text).should eq("select * from cat\n")
|
131
|
-
end# }}}
|
132
|
-
|
133
|
-
end# }}}
|
134
|
-
|
135
|
-
describe 'Arguments parsing' do# {{{
|
136
|
-
|
137
|
-
it 'should detect basic argument owner' do# {{{
|
138
|
-
text = 'select col1, 1+2, func(a, b, my_f(x, y), c, \'a\'\'bc\', "xxx".y, d,'
|
139
|
-
Parser.argument_belongs_to(text, 65).should eq('func')
|
140
|
-
Parser.argument_belongs_to(text, 37).should eq('my_f')
|
141
|
-
end# }}}
|
142
|
-
|
143
|
-
it 'should handle whitespaces between function name and open paran' do# {{{
|
144
|
-
Parser.argument_belongs_to('exec dbms_stats.gather_schema_stats (owname => user, ').should eq('dbms_stats.gather_schema_stats')
|
145
|
-
Parser.argument_belongs_to("begin dbms_stats.gather_schema_stats \n\t (owname => user, ").should eq('dbms_stats.gather_schema_stats')
|
146
|
-
end# }}}
|
147
|
-
|
148
|
-
it 'should handle quoted identifiers' do# {{{
|
149
|
-
Parser.argument_belongs_to('exec "My user" . "bla@hei.la" @ dblink.hop.hu(owname => user, ').should eq("\"My user\".\"bla@hei.la\"@dblink.hop.hu")
|
150
|
-
Parser.argument_belongs_to('exec "ABC!"."bla"(owname => user, ').should eq("\"ABC!\".\"bla\"")
|
151
|
-
Parser.argument_belongs_to('exec owner."pkg"."my func"(owname => user, ').should eq("owner.\"pkg\".\"my func\"")
|
152
|
-
end# }}}
|
153
|
-
|
154
|
-
it 'should ignore comments' do# {{{
|
155
|
-
Parser.argument_belongs_to('exec dbms_stats./*muci*/gather_schema_stats/*abc*/ (owname => user, ').should eq('dbms_stats.gather_schema_stats')
|
156
|
-
end# }}}
|
157
|
-
|
158
|
-
it 'should handle plsql quoting' do# {{{
|
159
|
-
text = "exec pkg.my_proc(q'[Isn't the \"(\" character sweet?]', "
|
160
|
-
Parser.argument_belongs_to(text).should eq('pkg.my_proc')
|
161
|
-
text = "exec pkg.my_proc(q'{Isn't the \"(\" character sweet?}', "
|
162
|
-
Parser.argument_belongs_to(text).should eq('pkg.my_proc')
|
163
|
-
text = "exec pkg.my_proc(q'<Isn't the \"(\" character sweet?>', "
|
164
|
-
Parser.argument_belongs_to(text).should eq('pkg.my_proc')
|
165
|
-
end# }}}
|
166
|
-
|
167
|
-
it 'should fallback to simple quoting' do# {{{
|
168
|
-
text = "exec pkg.my_proc('<Isn''t the \"(\" character sweet?>', "
|
169
|
-
Parser.argument_belongs_to(text).should eq('pkg.my_proc')
|
170
|
-
end# }}}
|
171
|
-
|
172
|
-
end# }}}
|
173
|
-
|
174
|
-
describe 'Statement type' do# {{{
|
175
|
-
|
176
|
-
it 'should detect an anonymous block' do# {{{
|
177
|
-
Parser.statement_type("begin dbms_output.put_line('xx');").should eq("ANONYMOUS")
|
178
|
-
Parser.statement_type("declare l_test varchar2(10);").should eq("ANONYMOUS")
|
179
|
-
Parser.statement_type("bbegin dbms_output.put_line('xx');").should be_nil
|
180
|
-
Parser.statement_type("ddeclare dbms_output.put_line('xx');").should be_nil
|
181
|
-
Parser.statement_type("select 1 from dual;").should be_nil
|
182
|
-
end# }}}
|
183
|
-
|
184
|
-
it 'should detect a function' do# {{{
|
185
|
-
Parser.statement_type("create or\nreplace function muci as").should eq("FUNCTION")
|
186
|
-
Parser.statement_type("create orreplace function muci as").should be_nil
|
187
|
-
end# }}}
|
188
|
-
|
189
|
-
it 'should detect a procedure' do# {{{
|
190
|
-
Parser.statement_type("create or replace\n procedure muci as").should eq("PROCEDURE")
|
191
|
-
Parser.statement_type("create or replace proceduremuci as").should be_nil
|
192
|
-
end# }}}
|
193
|
-
|
194
|
-
it 'should detect a trigger' do# {{{
|
195
|
-
Parser.statement_type("create or replace\n trigger muci as").should eq("TRIGGER")
|
196
|
-
Parser.statement_type("createor replace trigger as").should be_nil
|
197
|
-
end# }}}
|
198
|
-
|
199
|
-
it 'should detect a package spec' do# {{{
|
200
|
-
Parser.statement_type("create or replace\n package muci as").should eq("PACKAGE")
|
201
|
-
Parser.statement_type("createor replace package as").should be_nil
|
202
|
-
end# }}}
|
203
|
-
|
204
|
-
it 'should detect a package body' do# {{{
|
205
|
-
Parser.statement_type("create or replace\n package body muci as").should eq("PACKAGE BODY")
|
206
|
-
Parser.statement_type("create or replace packagebody as").should be_nil
|
207
|
-
Parser.statement_type("create or replace package bodyas").should_not eq("PACKAGE BODY")
|
208
|
-
end# }}}
|
209
|
-
|
210
|
-
it 'should detect a type spec' do# {{{
|
211
|
-
Parser.statement_type("create or replace\n type muci as").should eq("TYPE")
|
212
|
-
Parser.statement_type("createor replace type as").should be_nil
|
213
|
-
end# }}}
|
214
|
-
|
215
|
-
it 'should detect a type body' do# {{{
|
216
|
-
Parser.statement_type("create or replace\n type body muci as").should eq("TYPE BODY")
|
217
|
-
Parser.statement_type("create or replace typebody as").should be_nil
|
218
|
-
Parser.statement_type("create or replace type bodyas").should_not eq("TYPE BODY")
|
219
|
-
end# }}}
|
220
|
-
|
221
|
-
it 'should detect java source' do# {{{
|
222
|
-
Parser.statement_type("create or replace java muci as").should eq("JAVA")
|
223
|
-
Parser.statement_type("create java muci as").should eq("JAVA")
|
224
|
-
Parser.statement_type("create or replace and compile java muci as").should eq("JAVA")
|
225
|
-
Parser.statement_type("create or replace and resolve noforce java muci as").should eq("JAVA")
|
226
|
-
Parser.statement_type("create or replace and resolvenoforce java muci as").should_not eq("JAVA")
|
227
|
-
end# }}}
|
228
|
-
|
229
|
-
it 'should detect sqlplus command' do# {{{
|
230
|
-
Parser.statement_type("accept muci").should eq("SQLPLUS")
|
231
|
-
Parser.statement_type("acc muci").should eq("SQLPLUS")
|
232
|
-
Parser.statement_type("acce muci").should eq("SQLPLUS")
|
233
|
-
Parser.statement_type("@muci.sql").should eq("SQLPLUS")
|
234
|
-
Parser.statement_type("@@muci.sql").should eq("SQLPLUS")
|
235
|
-
Parser.statement_type("/").should eq("SQLPLUS")
|
236
|
-
Parser.statement_type("archive log list").should eq("SQLPLUS")
|
237
|
-
Parser.statement_type("attribute muci").should eq("SQLPLUS")
|
238
|
-
Parser.statement_type("break on whatever").should eq("SQLPLUS")
|
239
|
-
Parser.statement_type("btitle abc").should eq("SQLPLUS")
|
240
|
-
Parser.statement_type("btit abc").should eq("SQLPLUS")
|
241
|
-
Parser.statement_type("cle").should eq("SQLPLUS")
|
242
|
-
Parser.statement_type("colu abc format a15").should eq("SQLPLUS")
|
243
|
-
Parser.statement_type("compute on bla bla bla").should eq("SQLPLUS")
|
244
|
-
Parser.statement_type("connect muci/buci@db").should eq("SQLPLUS")
|
245
|
-
Parser.statement_type("copy").should eq("SQLPLUS")
|
246
|
-
Parser.statement_type("def var").should eq("SQLPLUS")
|
247
|
-
Parser.statement_type("desc my_table").should eq("SQLPLUS")
|
248
|
-
Parser.statement_type("discon").should eq("SQLPLUS")
|
249
|
-
Parser.statement_type("execu dbms_output.put_line('abc');").should eq("SQLPLUS")
|
250
|
-
Parser.statement_type("exit").should eq("SQLPLUS")
|
251
|
-
Parser.statement_type("quit").should eq("SQLPLUS")
|
252
|
-
Parser.statement_type("help").should eq("SQLPLUS")
|
253
|
-
Parser.statement_type("host ls -al").should eq("SQLPLUS")
|
254
|
-
Parser.statement_type("!ls -al").should eq("SQLPLUS")
|
255
|
-
Parser.statement_type("passw").should eq("SQLPLUS")
|
256
|
-
Parser.statement_type("password user").should eq("SQLPLUS")
|
257
|
-
Parser.statement_type("pause press any key").should eq("SQLPLUS")
|
258
|
-
Parser.statement_type("print curs").should eq("SQLPLUS")
|
259
|
-
Parser.statement_type("prom var").should eq("SQLPLUS")
|
260
|
-
Parser.statement_type("recover database").should eq("SQLPLUS")
|
261
|
-
Parser.statement_type("rem comment").should eq("SQLPLUS")
|
262
|
-
Parser.statement_type("repf on").should eq("SQLPLUS")
|
263
|
-
Parser.statement_type("rephe off").should eq("SQLPLUS")
|
264
|
-
Parser.statement_type("sav muci.sql").should eq("SQLPLUS")
|
265
|
-
Parser.statement_type("set pagesize 100").should eq("SQLPLUS")
|
266
|
-
Parser.statement_type("set transaction name muci;").should be_nil
|
267
|
-
Parser.statement_type("show pagesize").should eq("SQLPLUS")
|
268
|
-
Parser.statement_type("shutdown").should eq("SQLPLUS")
|
269
|
-
Parser.statement_type("spool muci.log").should eq("SQLPLUS")
|
270
|
-
Parser.statement_type("start muci.sql").should eq("SQLPLUS")
|
271
|
-
Parser.statement_type("startup").should eq("SQLPLUS")
|
272
|
-
Parser.statement_type("store set options.sql").should eq("SQLPLUS")
|
273
|
-
Parser.statement_type("timing stop").should eq("SQLPLUS")
|
274
|
-
Parser.statement_type("title abc").should eq("SQLPLUS")
|
275
|
-
Parser.statement_type("undef var").should eq("SQLPLUS")
|
276
|
-
Parser.statement_type("var muci").should eq("SQLPLUS")
|
277
|
-
Parser.statement_type("whenever oserror exit").should eq("SQLPLUS")
|
278
|
-
Parser.statement_type("xquery bla bla bla").should eq("SQLPLUS")
|
279
|
-
Parser.statement_type("\n-- APEX RMS DB UPDATES FILE\n").should be_nil
|
280
|
-
end# }}}
|
281
|
-
|
282
|
-
end# }}}
|
283
|
-
|
284
|
-
it 'should get the current statement' do# {{{
|
285
|
-
text = <<STRING
|
286
|
-
select /* comment: ; */ 'muci;buci''s yea' from dual; -- interesting ha;ha?
|
287
|
-
select * from cat;
|
288
|
-
STRING
|
289
|
-
Parser.current_statement(text, 10)[:statement].should eq("select /* comment: ; */ 'muci;buci''s yea' from dual;")
|
290
|
-
Parser.current_statement(text, 85)[:statement].should eq(" -- interesting ha;ha?\nselect * from cat;")
|
291
|
-
|
292
|
-
text = <<STRING
|
293
|
-
set serveroutput on
|
294
|
-
column c1 format a10
|
295
|
-
select 1 from dual;
|
296
|
-
begin
|
297
|
-
null;
|
298
|
-
end;
|
299
|
-
/
|
300
|
-
select c2 from t1
|
301
|
-
/
|
302
|
-
update t set x=1;
|
303
|
-
STRING
|
304
|
-
Parser.current_statement(text, 10, :sqlplus_commands => false, :plsql_blocks => false)[:statement].should eq("set serveroutput on\ncolumn c1 format a10\nselect 1 from dual;")
|
305
|
-
Parser.current_statement(text, 10, :sqlplus_commands => true, :plsql_blocks => false)[:statement].should eq("set serveroutput on")
|
306
|
-
Parser.current_statement(text, 71, :sqlplus_commands => true, :plsql_blocks => false)[:statement].should eq("\nbegin\n null;")
|
307
|
-
Parser.current_statement(text, 71, :sqlplus_commands => true, :plsql_blocks => true)[:statement].should eq("\nbegin\n null;\nend;\n/\n")
|
308
|
-
Parser.current_statement(text, 88, :sqlplus_commands => true, :plsql_blocks => true)[:statement].should eq("select c2 from t1\n/\n")
|
309
|
-
|
310
|
-
text = <<STRING
|
311
|
-
select * from all_objects where rownum <= 1000;
|
312
|
-
|
313
|
-
set serveroutput on
|
314
|
-
begin
|
315
|
-
dbms_output.put_line('Hello Vorax!');
|
316
|
-
end;
|
317
|
-
/
|
318
|
-
|
319
|
-
with
|
320
|
-
x as (select *
|
321
|
-
from (select file_id, file_name from dba_data_files) t,
|
322
|
-
(select * from (select 'abc' col1, 'xyz' col2 from dual) x)
|
323
|
-
)
|
324
|
-
select *
|
325
|
-
from x;
|
326
|
-
STRING
|
327
|
-
Parser.current_statement(text, 90, :sqlplus_commands => true, :plsql_blocks => true).
|
328
|
-
should eq({:statement=>"begin\n\tdbms_output.put_line('Hello Vorax!');\nend;\n/\n", :range=>69...121})
|
329
|
-
|
330
|
-
text = "exec dbms_crypto.encrypt("
|
331
|
-
Parser.current_statement(text, 10, :plslq_blocks => true, :sqlplus_commands => true).
|
332
|
-
should eq({:statement=>"exec dbms_crypto.encrypt(", :range=>0...25})
|
333
|
-
end# }}}
|
334
|
-
|
335
|
-
it 'should detect a for statement' do# {{{
|
336
|
-
text = "for x in (select * from dual) loop "
|
337
|
-
Parser.describe_for(text).should == {:cursor_var=>nil, :for_var=>"x", :expr=>"(select * from dual)", :end_pos=>34}
|
338
|
-
text = "for x in l_cursor loop "
|
339
|
-
Parser.describe_for(text).should == {:cursor_var=>"l_cursor", :for_var=>"x", :expr=>nil, :end_pos=>22}
|
340
|
-
text = "for x in reverse 1..10 loop "
|
341
|
-
Parser.describe_for(text).should == {:cursor_var=>nil, :for_var=>"x", :expr=>nil, :end_pos=>27}
|
342
|
-
text = "for x in(select * from dual)loop "
|
343
|
-
Parser.describe_for(text).should == {:cursor_var=>nil, :for_var=>"x", :expr=>"(select * from dual)", :end_pos=>32}
|
344
|
-
text = "for x in reverse 1..10 loops "
|
345
|
-
Parser.describe_for(text)[:end_pos].should == -1
|
346
|
-
text = "for x in p.cursor loop "
|
347
|
-
Parser.describe_for(text).should == {:cursor_var=>"p.cursor", :for_var=>"x", :expr=>nil, :end_pos=>22}
|
348
|
-
text = "for x in user.p.cursor loop "
|
349
|
-
Parser.describe_for(text).should == {:cursor_var=>"user.p.cursor", :for_var=>"x", :expr=>nil, :end_pos=>27}
|
350
|
-
end# }}}
|
351
|
-
|
352
|
-
end
|