# File lib/geoip.rb, line 430
    def initialize(filename, flags = 0)
        @mutex = Mutex.new
        @flags = flags
        @databaseType = GEOIP_COUNTRY_EDITION
        @record_length = STANDARD_RECORD_LENGTH
        @file = File.open(filename, 'rb')
        @file.seek(-3, IO::SEEK_END)
        0.upto(STRUCTURE_INFO_MAX_SIZE-1) { |i|
            if @file.read(3) == "\xFF\xFF\xFF"
                @databaseType = @file.getc
                @databaseType -= 105 if @databaseType >= 106

                if (@databaseType == GEOIP_REGION_EDITION_REV0)
                    # Region Edition, pre June 2003
                    @databaseSegments = [ STATE_BEGIN_REV0 ]
                elsif (@databaseType == GEOIP_REGION_EDITION_REV1)
                    # Region Edition, post June 2003
                    @databaseSegments = [ STATE_BEGIN_REV1 ]
                elsif (@databaseType == GEOIP_CITY_EDITION_REV0 ||
                       @databaseType == GEOIP_CITY_EDITION_REV1 ||
                       @databaseType == GEOIP_ORG_EDITION ||
                       @databaseType == GEOIP_ISP_EDITION ||
                       @databaseType == GEOIP_ASNUM_EDITION)
                    # City/Org Editions have two segments, read offset of second segment
                    @databaseSegments = [ 0 ]
                    sr = @file.read(3).unpack("C*")
                    @databaseSegments[0] += le_to_ui(sr)

                    if (@databaseType == GEOIP_ORG_EDITION ||
                        @databaseType == GEOIP_ISP_EDITION)
                        @record_length = 4
                    end
                end
                break

            else
                @file.seek(-4, IO::SEEK_CUR)
            end
        }
        if (@databaseType == GEOIP_COUNTRY_EDITION ||
            @databaseType == GEOIP_PROXY_EDITION ||
            @databaseType == GEOIP_NETSPEED_EDITION)
            @databaseSegments = [ COUNTRY_BEGIN ]
        end
    end