Alert: This function’s access is marked private. This means it is not intended for use by plugin or theme developers, only in other core functions. It is listed here for completeness.
WC_Geo_IP::_setup_segments()
Setup segments.
Description Description
Return Return
(WC_Geo_IP) instance
Source Source
File: includes/class-wc-geo-ip.php
private function _setup_segments() {
$this->databaseType = self::GEOIP_COUNTRY_EDITION;
$this->record_length = self::STANDARD_RECORD_LENGTH;
if ( $this->flags & self::GEOIP_SHARED_MEMORY ) {
$offset = @shmop_size( $this->shmid ) - 3;
for ( $i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++ ) {
$delim = @shmop_read( $this->shmid, $offset, 3 );
$offset += 3;
if ( ( chr( 255 ) . chr( 255 ) . chr( 255 ) ) == $delim ) {
$this->databaseType = ord( @shmop_read( $this->shmid, $offset, 1 ) );
if ( $this->databaseType >= 106 ) {
$this->databaseType -= 105;
}
$offset++;
if ( self::GEOIP_REGION_EDITION_REV0 == $this->databaseType ) {
$this->databaseSegments = self::GEOIP_STATE_BEGIN_REV0;
} elseif ( self::GEOIP_REGION_EDITION_REV1 == $this->databaseType ) {
$this->databaseSegments = self::GEOIP_STATE_BEGIN_REV1;
} elseif ( ( self::GEOIP_CITY_EDITION_REV0 == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV1 == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_USERTYPE_EDITION == $this->databaseType )
|| ( self::GEOIP_USERTYPE_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_LOCATIONA_EDITION == $this->databaseType )
|| ( self::GEOIP_ACCURACYRADIUS_EDITION == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV0_V6 == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV1_V6 == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION_REV1 == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION_REV1_V6 == $this->databaseType )
|| ( self::GEOIP_ASNUM_EDITION == $this->databaseType )
|| ( self::GEOIP_ASNUM_EDITION_V6 == $this->databaseType )
) {
$this->databaseSegments = 0;
$buf = @shmop_read( $this->shmid, $offset, self::SEGMENT_RECORD_LENGTH );
for ( $j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++ ) {
$this->databaseSegments += ( ord( $buf[ $j ] ) << ( $j * 8 ) );
}
if ( ( self::GEOIP_ORG_EDITION == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION_V6 == $this->databaseType )
) {
$this->record_length = self::ORG_RECORD_LENGTH;
}
}
break;
} else {
$offset -= 4;
}
}
if ( ( self::GEOIP_COUNTRY_EDITION == $this->databaseType )
|| ( self::GEOIP_COUNTRY_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_PROXY_EDITION == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION == $this->databaseType )
) {
$this->databaseSegments = self::GEOIP_COUNTRY_BEGIN;
}
} else {
$filepos = ftell( $this->filehandle );
fseek( $this->filehandle, -3, SEEK_END );
for ( $i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++ ) {
$delim = fread( $this->filehandle, 3 );
if ( ( chr( 255 ) . chr( 255 ) . chr( 255 ) ) == $delim ) {
$this->databaseType = ord( fread( $this->filehandle, 1 ) );
if ( $this->databaseType >= 106 ) {
$this->databaseType -= 105;
}
if ( self::GEOIP_REGION_EDITION_REV0 == $this->databaseType ) {
$this->databaseSegments = self::GEOIP_STATE_BEGIN_REV0;
} elseif ( self::GEOIP_REGION_EDITION_REV1 == $this->databaseType ) {
$this->databaseSegments = self::GEOIP_STATE_BEGIN_REV1;
} elseif ( ( self::GEOIP_CITY_EDITION_REV0 == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV1 == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV0_V6 == $this->databaseType )
|| ( self::GEOIP_CITY_EDITION_REV1_V6 == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_LOCATIONA_EDITION == $this->databaseType )
|| ( self::GEOIP_ACCURACYRADIUS_EDITION == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION_REV1 == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION_REV1_V6 == $this->databaseType )
|| ( self::GEOIP_USERTYPE_EDITION == $this->databaseType )
|| ( self::GEOIP_USERTYPE_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_ASNUM_EDITION == $this->databaseType )
|| ( self::GEOIP_ASNUM_EDITION_V6 == $this->databaseType )
) {
$this->databaseSegments = 0;
$buf = fread( $this->filehandle, self::SEGMENT_RECORD_LENGTH );
for ( $j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++ ) {
$this->databaseSegments += ( ord( $buf[ $j ] ) << ( $j * 8 ) );
}
if ( ( self::GEOIP_ORG_EDITION == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION == $this->databaseType )
|| ( self::GEOIP_ORG_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_DOMAIN_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_ISP_EDITION_V6 == $this->databaseType )
) {
$this->record_length = self::ORG_RECORD_LENGTH;
}
}
break;
} else {
fseek( $this->filehandle, -4, SEEK_CUR );
}
}
if ( ( self::GEOIP_COUNTRY_EDITION == $this->databaseType )
|| ( self::GEOIP_COUNTRY_EDITION_V6 == $this->databaseType )
|| ( self::GEOIP_PROXY_EDITION == $this->databaseType )
|| ( self::GEOIP_NETSPEED_EDITION == $this->databaseType )
) {
$this->databaseSegments = self::GEOIP_COUNTRY_BEGIN;
}
fseek( $this->filehandle, $filepos, SEEK_SET );
}
return $this;
}