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.

No comments:

Post a Comment