mirror of
https://github.com/inspec/inspec
synced 2024-11-26 14:40:26 +00:00
Fix for parsing faulty multiline results
Signed-off-by: Nikita Mathur <nikita.mathur@chef.io>
This commit is contained in:
parent
a0875c9786
commit
5a3c73b521
3 changed files with 30 additions and 3 deletions
|
@ -76,7 +76,7 @@ module Inspec::Resources
|
|||
if cmd.exit_status != 0 || out =~ /Sqlcmd: Error/
|
||||
raise Inspec::Exceptions::ResourceFailed, "Could not execute the sql query #{out}"
|
||||
else
|
||||
DatabaseHelper::SQLQueryResult.new(cmd, parse_csv_result(cmd))
|
||||
DatabaseHelper::SQLQueryResult.new(cmd, parse_csv_result(cmd.stdout))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -94,9 +94,17 @@ module Inspec::Resources
|
|||
!query("select getdate()").empty?
|
||||
end
|
||||
|
||||
def parse_csv_result(cmd)
|
||||
def parse_csv_result(stdout)
|
||||
require "csv" unless defined?(CSV)
|
||||
table = CSV.parse(cmd.stdout, headers: true)
|
||||
|
||||
# replaces \n with \r since multiline data in older versions of database returns faulty
|
||||
# formatted multiline data, example name\r\n----\r\nThis is\na multiline field\r\n
|
||||
out = stdout.gsub("\n", "\r")
|
||||
out = out.gsub("\r\r", "\r")
|
||||
|
||||
# row separator used since row delimiters \n (in linux) or \r\n (in windows)
|
||||
# are converted to \r for consistency and handling faulty formatted multiline data
|
||||
table = CSV.parse(out, headers: true, row_sep: "\r")
|
||||
|
||||
# remove first row, since it will be a seperator line
|
||||
table.delete(0)
|
||||
|
|
4
test/fixtures/cmd/mssql-multiline-result
vendored
Normal file
4
test/fixtures/cmd/mssql-multiline-result
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
result
|
||||
------
|
||||
This is
|
||||
a multiline field
|
|
@ -65,4 +65,19 @@ describe "Inspec::Resources::MssqlSession" do
|
|||
_(query.size).must_equal 1
|
||||
_(query.row(0).column("result").value).must_equal "14.0.600.250"
|
||||
end
|
||||
|
||||
it "run a SQL query with multiline output" do
|
||||
resource = quick_resource(:mssql_session, :linux, user: "sa", password: "yourStrong(!)Password", host: "localhost", port: "1433") do |cmd|
|
||||
cmd.strip!
|
||||
case cmd
|
||||
when "sqlcmd -Q \"set nocount on; SELECT * FROM example as result\" -W -w 1024 -s ',' -U 'sa' -P 'yourStrong(!)Password' -S 'localhost,1433'" then
|
||||
stdout_file "test/fixtures/cmd/mssql-multiline-result"
|
||||
else
|
||||
raise cmd.inspect
|
||||
end
|
||||
end
|
||||
|
||||
query = resource.query("SELECT * FROM example as result")
|
||||
_(query.row(1).column("result").value).must_include "multiline"
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue