Postaram sie to lepiej opisac:
W zadaniu wykonuje metode klasy Report co 5 minut:
scheduler.every '5m' do
report = Report.new
report.generate_report(:daily)
end
Metoda klasy Report:
[code]def generate_report(name)
#stworzenie folderu dla wynikow
path = create_folder(name)
#zwraca wszystkie skrypty ktore maja byc uruchomione
scripts = Script.find_scripts(name)
# polaczenie z baza Exasol za pomoca driver ODBC
@connection = Exasol.new
@connection.connect(EXA_CONFIG['username'], EXA_CONFIG['password'])
# metoda klasy Report jest tutaj wywolywana dla obiektu
self.prepare_results_for_scripts(scripts, path)
#rozlaczenie z baza
@connection.disconnect
end[/code]
metoda prepare_results_for_scripts
def prepare_results_for_scripts(scripts, path)
scripts.find_each do |script|
begin
self.process_script(script, path)
rescue DBI::DatabaseError => e
admin_email = "wlodi@jamaicans.com"
err_message = "An error occured with script: " + "#{script.title} - " + "#{e.errstr}"
AlertMailer.send_alert(admin_email, err_message).deliver
next
end
end
end
metoda process_script klasy Report:
def process_script(script, path)
users = User.find_script_users(script)
report_title = script.title
if script.email_form?
name_of_columns, result_array = self.return_database_result(script)
User.send_html_emails(users, name_of_columns, result_array, report_title)
else
report_attachment_name, path_to_excel_file = self.create_excel_file(script, path)
User.send_excel_emails(users, report_attachment_name, path_to_excel_file, report_title)
end
end
metoda return_database_results
def return_database_result(script)
@connection.execute_query(script)
name_of_columns = @connection.print_column_names
result_array = @connection.print_result_array
return name_of_columns, result_array
end
klasa Exasol
[code]require ‘odbc_utf8’
class Exasol
def connect(login, password)
begin
#connect to the Exasol Server
@dbh = DBI.connect(‘DBI:ODBC:EXA’, login, password)
rescue DBI::DatabaseError => e
admin_email = "lukasz.wlodarczyk@sponsorpay.com"
puts “An error occured”
puts “Error code: #{e.err}”
puts “Error message: #{e.errstr}”
err_message = “#{e.errstr}”
AlertMailer.send_alert(admin_email, err_message).deliver
end
end
def disconnect
#disconnect from server
puts “Disconnecting …”
@dbh.disconnect if @dbh
end
def execute_query(query)
q = Script.find(query.id)
@sth = @dbh.prepare(q.query)
@sth.execute
end
def print_column_names
@column_array = Array.new
@column_array.push(@sth.column_names)
return @column_array
end
def return_number_of_headers
return @sth.column_names.size
end
def print_result_array
result_array = Array.new
row = Array.new
puts “Poczatek: #{row} - #{@sth.object_id}”
while row=@sth.fetch_array do
result_array.push(row)
print “Zawartosc wiersza: #{row}”
end
print “Rozmiar tablicy: #{result_array.size}”
@sth.finish
return result_array
end
end[/code]
Niestety przy drugim uruchomieniu taska zwraca nil dla pierwszej kolumny:
22320560
Poczatek: [] - 24287760
Zawartosc wiersza: ["", “579”]Zawartosc wiersza: ["", “1”]Zawartosc wiersza:
A przy pierwszym jest OK:
19591740
Poczatek: [] - 24454140
Zawartosc wiersza: [“2011-10-10”, “579”]Zawartosc wiersza: [“2012-01-10”, “1”]