You are here

function smart_ip_extract_zip in Smart IP 6

Same name and namespace in other branches
  1. 6.2 includes/smart_ip.utility.inc \smart_ip_extract_zip()
  2. 7.2 includes/smart_ip.utility.inc \smart_ip_extract_zip()
  3. 7 includes/smart_ip.utility.inc \smart_ip_extract_zip()
1 string reference to 'smart_ip_extract_zip'
smart_ip_update_db_batch in includes/smart_ip.utility.inc
Prepare a batch definition

File

includes/smart_ip.utility.inc, line 90
Utility routines to load the Smart IP database.

Code

function smart_ip_extract_zip(&$context) {
  $path = file_directory_path() . '/smart_ip';
  if (variable_get('smart_ip_extract_zip_done', FALSE) || variable_get('smart_ip_store_location_csv_done', FALSE)) {

    // We are in recovery mode. Using previous extracted csv files.
    $context['finished'] = TRUE;
    $context['message'] = t('Using previous extracted csv files (recovery mode)');

    // Accumulate the previous extracted csv files.
    $csv_files = file_scan_directory($path, '\\.csv$');
    foreach ($csv_files as $csv_file) {
      if (strpos($csv_file->filename, SMART_IP_LOCATION_CSV) !== FALSE) {
        $context['results']['#location_csv_file'] = $csv_file->filename;
      }
      elseif (strpos($csv_file->filename, SMART_IP_BLOCKS_CSV) !== FALSE) {
        $context['results']['#blocks_csv_file'] = $csv_file->filename;
      }
    }
    return;
  }
  variable_set('smart_ip_extract_zip_done', FALSE);

  // If this update was aborted in a previous step, or has a dependency that
  // was aborted in a previous step, go no further.
  if (isset($context['results']['#abort'])) {
    return;
  }
  $zip_file = $context['results']['#zip_file'];
  $zip = new ZipArchive();
  $stat = $zip
    ->open($zip_file);
  $context['finished'] = 50 / 100;
  if ($stat === TRUE) {

    // Delete existing csv files
    $csv_files = file_scan_directory($path, '\\.csv$');
    foreach ($csv_files as $csv_file) {
      file_delete($csv_file->filename);
    }
    $zip
      ->extractTo($path);
    $zip
      ->close();
    file_delete($zip_file);
    unset($context['results']['#zip_file']);
    $csv_files = file_scan_directory($path, '\\.csv$');
    foreach ($csv_files as $csv_file) {
      $csv_dir = str_replace($csv_file->basename, '', $csv_file->filename);
      file_move($csv_file->filename, $path . '/' . $csv_file->basename, FILE_EXISTS_REPLACE);
      if (strpos($csv_file->filename, SMART_IP_LOCATION_CSV) !== FALSE) {
        $context['results']['#location_csv_file'] = $path . '/' . $csv_file->basename;
      }
      elseif (strpos($csv_file->filename, SMART_IP_BLOCKS_CSV) !== FALSE) {
        $context['results']['#blocks_csv_file'] = $path . '/' . $csv_file->basename;
      }
    }
    file_delete($csv_dir . '*');
    @rmdir($csv_dir);

    // Update our progress information.
    $context['finished'] = TRUE;
    $context['message'] = t('geoip_db.zip extraction done. Starting the process of parsing extracted CSV files...');

    // The succeeding process can now be interrupted
    variable_set('smart_ip_db_update_busy', FALSE);

    // An indicator that is to be used in recovery mode
    variable_set('smart_ip_extract_zip_done', TRUE);
  }
  else {

    // Error occured then stop the process
    $message = t('Unzip failed (error code: %code).', array(
      '%code' => $stat,
    ));
    $context['results']['#abort'] = $message;
    $context['message'] = $message;

    // Delete the corrupted zip file
    file_delete($zip_file);
    unset($context['results']['#zip_file']);

    // Set download process flag as undone to re-download the database from maxmind
    variable_set('smart_ip_get_zip_done', FALSE);
  }
}