# File ar-extensions/lib/ar-extensions/import.rb, line 151
    def import( *args )
      @logger = Logger.new(STDOUT)
      @logger.level = Logger::DEBUG
      options = { :validate=>true, :timestamps=>true }
      options.merge!( args.pop ) if args.last.is_a? Hash
      
      # assume array of model objects
      if args.last.is_a?( Array ) and args.last.first.is_a? ActiveRecord::Base
        if args.length == 2
          models = args.last
          column_names = args.first
        else
          models = args.first
          column_names = self.column_names.dup
        end
        
        array_of_attributes  = []
        models.each do |model|
          # this next line breaks sqlite.so with a segmentation fault
          # if model.new_record? || options[:on_duplicate_key_update]
            attributes = []
            column_names.each do |name| 
              attributes << model.send( "#{name}_before_type_cast" ) 
            end
            array_of_attributes << attributes
          # end
        end
        # supports 2-element array and array
      elsif args.size == 2 and args.first.is_a?( Array ) and args.last.is_a?( Array )
        column_names, array_of_attributes = args
      else
        raise ArgumentError.new( "Invalid arguments!" )
      end

      # Force the primary key col into the insert if it's not
      # on the list and we are using a sequence and stuff a nil
      # value for it into each row so the sequencer will fire later
      if !column_names.include?(primary_key) && sequence_name && connection.prefetch_primary_key?
         column_names << primary_key
         array_of_attributes.each { |a| a << nil }
      end

      is_validating = options.delete( :validate )

      # dup the passed in array so we don't modify it unintentionally
      array_of_attributes = array_of_attributes.dup

      # record timestamps unless disabled in ActiveRecord::Base
      if record_timestamps && options.delete( :timestamps )
         add_special_rails_stamps column_names, array_of_attributes, options
      end

      return_obj = if is_validating
        import_with_validations( column_names, array_of_attributes, options )
      else
        num_inserts = import_without_validations_or_callbacks( column_names, array_of_attributes, options )
        OpenStruct.new :failed_instances=>[], :num_inserts=>num_inserts
      end
      if options[:synchronize]
        synchronize( options[:synchronize] )
      end

      return_obj.num_inserts = 0 if return_obj.num_inserts.nil?
      return_obj
    end