lib/dbf/reader.rb in dbf-0.4.6 vs lib/dbf/reader.rb in dbf-0.4.7

- old
+ new

@@ -42,11 +42,11 @@ # An array of all the records contained in the database file def records seek_to_record(0) @records ||= Array.new(@record_count) do |i| if active_record? - Record.new(self, @data_file, @memo_file) + DBF::Record.new(self, @data_file, @memo_file) else seek_to_record(i + 1) nil end end @@ -115,88 +115,6 @@ seek(index * @record_length) end end - class FieldError < StandardError; end - - class Field - attr_accessor :name, :type, :length, :decimal - - def initialize(name, type, length, decimal) - raise FieldError, "field length must be greater than 0" unless length > 0 - self.name, self.type, self.length, self.decimal = name.strip, type, length, decimal - end - - def name=(name) - @name = name.gsub(/\0/, '') - end - - end - - class Record < Hash - - def initialize(reader, data_file, memo_file) - @reader, @data_file, @memo_file = reader, data_file, memo_file - reader.fields.each do |field| - case field.type - when 'N' # number - self[field.name] = field.decimal == 0 ? unpack_string(field).to_i : unpack_string(field).to_f - when 'D' # date - raw = unpack_string(field).strip - unless raw.empty? - begin - self[field.name] = Time.gm(*raw.match(DATE_REGEXP).to_a.slice(1,3).map {|n| n.to_i}) - rescue - self[field.name] = Date.new(*raw.match(DATE_REGEXP).to_a.slice(1,3).map {|n| n.to_i}) - end - end - when 'M' # memo - starting_block = unpack_string(field).to_i - self[field.name] = read_memo(starting_block) - when 'L' # logical - self[field.name] = unpack_string(field) =~ /^(y|t)$/i ? true : false - else - self[field.name] = unpack_string(field) - end - end - self - end - - def unpack_field(field) - @data_file.read(field.length).unpack("a#{field.length}") - end - - def unpack_string(field) - unpack_field(field).to_s - end - - def read_memo(start_block) - return nil if start_block == 0 - @memo_file.seek(start_block * @reader.memo_block_size) - if @reader.memo_file_format == :fpt - memo_type, memo_size, memo_string = @memo_file.read(@reader.memo_block_size).unpack("NNa56") - - memo_block_content_size = @reader.memo_block_size - FPT_BLOCK_HEADER_SIZE - if memo_size > memo_block_content_size - memo_string << @memo_file.read(memo_size - @reader.memo_block_size + FPT_BLOCK_HEADER_SIZE) - elsif memo_size > 0 and memo_size < memo_block_content_size - memo_string = memo_string[0, memo_size] - end - else - case @reader.version - when "83" # dbase iii - memo_string = "" - loop do - memo_string << block = @memo_file.read(512) - break if block.strip.size < 512 - end - when "8b" # dbase iv - memo_type, memo_size = @memo_file.read(8).unpack("LL") - memo_string = @memo_file.read(memo_size) - end - end - memo_string - end - end - -end +end \ No newline at end of file