vorax 0.1.3 → 0.1.4
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.md +2 -9
- data/lib/vorax/sqlplus.rb +17 -25
- data/lib/vorax/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -9,7 +9,7 @@ SQL/PLSQL code.
|
|
9
9
|
|
10
10
|
Add this line to your application's Gemfile:
|
11
11
|
|
12
|
-
gem '
|
12
|
+
gem 'vorax'
|
13
13
|
|
14
14
|
And then execute:
|
15
15
|
|
@@ -17,7 +17,7 @@ And then execute:
|
|
17
17
|
|
18
18
|
Or install it yourself as:
|
19
19
|
|
20
|
-
$ gem install
|
20
|
+
$ gem install vorax
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
@@ -36,10 +36,3 @@ To get the structure of a PLSQL code:
|
|
36
36
|
|
37
37
|
See the "YARD" generated documentation for additional info.
|
38
38
|
|
39
|
-
## Contributing
|
40
|
-
|
41
|
-
1. Fork it
|
42
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
43
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
44
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
45
|
-
5. Create new Pull Request
|
data/lib/vorax/sqlplus.rb
CHANGED
@@ -5,11 +5,6 @@ module Vorax
|
|
5
5
|
# Provides integration with Oracle SqlPlus CLI tool.
|
6
6
|
class Sqlplus
|
7
7
|
|
8
|
-
# the tail size of the output chunk to be searched
|
9
|
-
# for the output END_MARKER.
|
10
|
-
TAIL_LENGTH = 100 unless defined?(TAIL_LENGTH)
|
11
|
-
private_constant :TAIL_LENGTH
|
12
|
-
|
13
8
|
attr_reader :bin_file, :default_funnel_name, :process
|
14
9
|
|
15
10
|
# Creates a new sqlplus instance.
|
@@ -38,6 +33,14 @@ module Vorax
|
|
38
33
|
@registered_convertors = {:vertical => Output::VerticalConvertor,
|
39
34
|
:pagezip => Output::PagezipConvertor,
|
40
35
|
:tablezip => Output::TablezipConvertor}
|
36
|
+
# warm up
|
37
|
+
sleep 0.2
|
38
|
+
# set the blockterm as the end_marker. The blockterm should
|
39
|
+
# not be touch by the Vorax user, otherwise nasty things
|
40
|
+
# may happen. This is also a workaround to mark the end of
|
41
|
+
# output when the "echo" setting of sqlplus is "on". See the
|
42
|
+
# implementation of pack().
|
43
|
+
send_text("set blockterm \"#@end_marker\"\n")
|
41
44
|
end
|
42
45
|
|
43
46
|
# Set the default convertor for the output returned by sqlplus.
|
@@ -83,7 +86,6 @@ module Vorax
|
|
83
86
|
def exec(command, params = {})
|
84
87
|
Vorax.debug("exec: command=#{command.inspect} params=#{params.inspect}")
|
85
88
|
raise AnotherExecRunning if busy?
|
86
|
-
@tail = ""
|
87
89
|
opts = {
|
88
90
|
:prep => nil,
|
89
91
|
:post => nil,
|
@@ -139,27 +141,13 @@ module Vorax
|
|
139
141
|
# @return the output chunk
|
140
142
|
def read_output(bytes=4086)
|
141
143
|
output = ""
|
142
|
-
raw_output =
|
144
|
+
raw_output = nil
|
143
145
|
begin
|
144
|
-
raw_output
|
146
|
+
raw_output = @io_read.read_nonblock(bytes)
|
145
147
|
rescue Errno::EAGAIN
|
146
148
|
end
|
147
149
|
if raw_output
|
148
|
-
|
149
|
-
if @tail.empty?
|
150
|
-
# The logic of tail: when SET ECHO ON is used, the PRO <end_marker>
|
151
|
-
# statement will be also part of the output. The user will end up
|
152
|
-
# with something like "SQL> pro" as the last line. The solution would
|
153
|
-
# be to search for "pro <end_marker>" and to stop just before "pro", but
|
154
|
-
# the chunk may be split in the middle of the "pro <end_marker>" text and
|
155
|
-
# this is something which depends on the output of the executed
|
156
|
-
# statement (e.g. bytes=4086, output=4084 => chunk="...SQL> p"). The
|
157
|
-
# workaround is to delay sending the last TAIL_LENGTH characters until
|
158
|
-
# the next fetch.
|
159
|
-
raw_output, @tail = raw_output.slice!(0...raw_output.length-TAIL_LENGTH), raw_output
|
160
|
-
else
|
161
|
-
@tail = ''
|
162
|
-
end
|
150
|
+
raw_output.gsub!(/\r/, '')
|
163
151
|
scanner = StringScanner.new(raw_output)
|
164
152
|
while not scanner.eos?
|
165
153
|
if @look_for == @start_marker
|
@@ -180,7 +168,6 @@ module Vorax
|
|
180
168
|
if @look_for == @end_marker
|
181
169
|
output = scanner.scan(/[^#{@look_for}]*/)
|
182
170
|
if scanner.scan(/#{@look_for}/)
|
183
|
-
output.gsub!(/\n.*?pro \z/, "")
|
184
171
|
# end of output reached
|
185
172
|
scanner.terminate
|
186
173
|
@busy = false
|
@@ -267,8 +254,13 @@ module Vorax
|
|
267
254
|
f.puts opts[:prep]
|
268
255
|
f.puts "#pro #@start_marker"
|
269
256
|
f.puts command.strip
|
257
|
+
# we assume that the @end_marker is also
|
258
|
+
# set as a block terminator. If "set echo on"
|
259
|
+
# the output region will end here since the
|
260
|
+
# block terminator command will be echoed. Otherwise,
|
261
|
+
# the next prompt statement will do the job.
|
262
|
+
f.puts "#{@end_marker}"
|
270
263
|
f.puts "#pro #@end_marker"
|
271
|
-
f.puts "."
|
272
264
|
f.puts opts[:post]
|
273
265
|
end
|
274
266
|
end
|
data/lib/vorax/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vorax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
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-
|
12
|
+
date: 2013-02-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|