Ruby on Rails
Friday, June 29, 2012
hi
I am trying to update the following method as the retry we have hard coded to ensure the sql transaction retires three times does not work.
When we get a failure it rolls back but does not retry.
Is there another I can add a retry or correct the following code
Gurdipe
def export_data( table_nickname, output_data_file, column_headers )
component,table_nickname = get_component(table_nickname)
data_warehouse_class = component.class
data_warehouse_instance = data_warehouse_class.instance
# Get table name
teradata_table_name = data_warehouse_instance.send(table_nickname).to_s
start_time = Time.now()
# Create column list, with various casting and reformatting
column_list = []
column_headers.each do |column_header|
format = ""
if column_header.type == 'DA'
format = "(format 'YYYY/MM/DD')"
end
column_def = "CAST( COALESCE( TRIM( #{column_header.name} #{format} ) , '') as VARCHAR(#{column_header.max_length+10}) )" # Some data types need extra space so add 10 chars
column_list.push(column_def)
end
tries = 3 # try three times and then give up
begin
# Create fastexport definition
fed = <<END_FED
.logtable DXWI_PROD_CRORDER_PLAY_PEN.promo_fexp_#{Time.now.strftime("%Y%m%d%H%M%S")}_log;
.logon tdpm/#{DATA_WAREHOUSE_CONFIG['username']},#{DATA_WAREHOUSE_CONFIG['password']};
.begin export sessions 10;
.export outfile #{output_data_file}
format fastload
mode record;
/* FETCH DATA */
SELECT
#{column_list.join(" ,\n")}
FROM #{teradata_table_name}
;
/* END */
.end export;
/* LOGOFF */
.logoff;
/* DONE */
END_FED
# Write definition to a temporary file, because calling it from a ruby pipe can cause blocks
# on tables with lots of columns (denorm_brag_report)
fed_file = "#{GENERAL_SYSTEM_SETTINGS['fastexport_temp_dir']}/#{teradata_table_name.downcase}_data.fed"
File.open(fed_file, 'w') {|f| f.write(fed) }
RAILS_DEFAULT_LOGGER.info("FLA_FILE_PATH: <#{output_data_file}>")
RAILS_DEFAULT_LOGGER.info("TERADATA_TABLE: <#{teradata_table_name}>")
RAILS_DEFAULT_LOGGER.info("Fastexport Definition File:\n #{fed_file}\n")
RAILS_DEFAULT_LOGGER.info("Fastexport Definition:\n #{fed}\n")
# Use fexp (fastexport) as system command
RAILS_DEFAULT_LOGGER.info("Executing fastexport")
output = nil
open_return = IO.popen("fexp < #{fed_file}", "w+") do |pipe|
pipe.close_write()
output = pipe.read()
end
rescue
tries -= 1
sleep(1) # since we sometime get a time stamp problem, wait one second and then retry
retry if tries > 0
raise # re-raise the exception if it hasn't been retried
end
# Check results
result = $?
if result == 0
RAILS_DEFAULT_LOGGER.info("--")
RAILS_DEFAULT_LOGGER.info("Finished Extracting data from Teradata (#{Time.now()-start_time} seconds)")
RAILS_DEFAULT_LOGGER.info("--")
else
RAILS_DEFAULT_LOGGER.info("Failed Extracting data from Teradata (#{Time.now()-start_time} seconds) - Error code: #{result}")
RAILS_DEFAULT_LOGGER.info("Output from FastExport:\n#{output}")
raise("ERROR: Export of Table <#{teradata_table_name}> failed - Error Code #{result}.")
end
return
end
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/G3xDSOMpEq0J.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en-US.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment