WC_Geo_IP::_common_get_record │ private │ WC 1.0
Common get record.
Method of the class: WC_Geo_IP{}
No Hooks.
Returns
WC_Geo_IP_Record. instance
Usage
// private - for code of main (parent) class only $result = $this->_common_get_record( $seek_country );
- $seek_country(string) (required)
- .
WC_Geo_IP::_common_get_record() WC Geo IP:: common get record code WC 10.6.2
private function _common_get_record( $seek_country ) {
// workaround php's broken substr, strpos, etc handling with
// mbstring.func_overload and mbstring.internal_encoding
$mbExists = extension_loaded( 'mbstring' );
if ( $mbExists ) {
$enc = mb_internal_encoding();
mb_internal_encoding( 'ISO-8859-1' );
}
$record_pointer = $seek_country + ( 2 * $this->record_length - 1 ) * $this->databaseSegments;
if ( $this->flags & self::GEOIP_MEMORY_CACHE ) {
$record_buf = substr( $this->memory_buffer, $record_pointer, FULL_RECORD_LENGTH );
} elseif ( $this->flags & self::GEOIP_SHARED_MEMORY ) {
$record_buf = @shmop_read( $this->shmid, $record_pointer, FULL_RECORD_LENGTH );
} else {
fseek( $this->filehandle, $record_pointer, SEEK_SET );
$record_buf = fread( $this->filehandle, FULL_RECORD_LENGTH );
}
$record = new WC_Geo_IP_Record();
$record_buf_pos = 0;
$char = ord( substr( $record_buf, $record_buf_pos, 1 ) );
$record->country_code = $this->GEOIP_COUNTRY_CODES[ $char ];
$record->country_code3 = $this->GEOIP_COUNTRY_CODES3[ $char ];
$record->country_name = $this->GEOIP_COUNTRY_NAMES[ $char ];
$record->continent_code = $this->GEOIP_CONTINENT_CODES[ $char ];
$str_length = 0;
$record_buf_pos++;
// Get region
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
while ( 0 != $char ) {
$str_length++;
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
}
if ( $str_length > 0 ) {
$record->region = substr( $record_buf, $record_buf_pos, $str_length );
}
$record_buf_pos += $str_length + 1;
$str_length = 0;
// Get city
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
while ( 0 != $char ) {
$str_length++;
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
}
if ( $str_length > 0 ) {
$record->city = substr( $record_buf, $record_buf_pos, $str_length );
}
$record_buf_pos += $str_length + 1;
$str_length = 0;
// Get postal code
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
while ( 0 != $char ) {
$str_length++;
$char = ord( substr( $record_buf, $record_buf_pos + $str_length, 1 ) );
}
if ( $str_length > 0 ) {
$record->postal_code = substr( $record_buf, $record_buf_pos, $str_length );
}
$record_buf_pos += $str_length + 1;
// Get latitude and longitude
$latitude = 0;
$longitude = 0;
for ( $j = 0; $j < 3; ++$j ) {
$char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
$latitude += ( $char << ( $j * 8 ) );
}
$record->latitude = ( $latitude / 10000 ) - 180;
for ( $j = 0; $j < 3; ++$j ) {
$char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
$longitude += ( $char << ( $j * 8 ) );
}
$record->longitude = ( $longitude / 10000 ) - 180;
if ( self::GEOIP_CITY_EDITION_REV1 == $this->databaseType ) {
$metroarea_combo = 0;
if ( 'US' === $record->country_code ) {
for ( $j = 0; $j < 3; ++$j ) {
$char = ord( substr( $record_buf, $record_buf_pos++, 1 ) );
$metroarea_combo += ( $char << ( $j * 8 ) );
}
$record->metro_code = $record->dma_code = floor( $metroarea_combo / 1000 );
$record->area_code = $metroarea_combo % 1000;
}
}
if ( $mbExists ) {
mb_internal_encoding( $enc );
}
return $record;
}