Scan for missing files and remove the associated entries in the database.

Return value

array Array of what files were cleared out of the database.

2 calls to advagg_remove_missing_files_from_db()
advagg_admin_remove_missing_files_from_db_button dans ./advagg.admin.inc
Scan for missing files and remove the associated entries in the database.
advagg_cron dans ./advagg.module
Implements hook_cron().

Fichier

./advagg.cache.inc, line 429

Code

function advagg_remove_missing_files_from_db() {
    $missing_files = array();
    $deleted = array();
    // Get all files stored in the database.
    $result = db_select('advagg_files', 'af')->fields('af')
        ->execute();
    if (empty($result)) {
        return $deleted;
    }
    // Find missing files.
    module_load_include('inc', 'advagg', 'advagg');
    foreach ($result as $row) {
        $row = (array) $row;
        $info = advagg_get_info_on_file($row['filename'], TRUE);
        // Make sure file exists.
        if (empty($info['content_hash'])) {
            $info += advagg_get_aggregates_using_file($info['filename_hash']);
            $missing_files[$row['filename']] = $info;
            continue;
        }
    }
    if (empty($missing_files)) {
        return $deleted;
    }
    // Remove missing file database entries.
    $types = array();
    foreach ($missing_files as $filename => $data) {
        // Setup this run.
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        $advagg_files_del = 0;
        $advagg_aggregates_del = 0;
        $advagg_aggregates_versions_del = 0;
        $clean_sweep = TRUE;
        $filename_hash = '';
        // Scan the data.
        foreach ($data as $key => $values) {
            if (!is_numeric($key)) {
                $filename_hash = $values;
            }
            else {
                // Remove the entry from the database if this aggregate has not been
                // accessed in the last 2 weeks.
                $can_delete = db_delete('advagg_aggregates_versions')->condition('aggregate_filenames_hash', $values['aggregate_filenames_hash'])
                    ->condition('atime', REQUEST_TIME - variable_get('advagg_remove_missing_files_from_db_time', ADVAGG_REMOVE_MISSING_FILES_FROM_DB_TIME), '<')
                    ->execute();
                if ($can_delete > 0) {
                    $advagg_aggregates_versions_del += $can_delete;
                    $advagg_aggregates_del += db_delete('advagg_aggregates')->condition('aggregate_filenames_hash', $values['aggregate_filenames_hash'])
                        ->execute();
                }
                else {
                    $clean_sweep = FALSE;
                }
                // Clear the cache.
                cache_clear_all($values['cid'], 'cache_advagg_info', FALSE);
            }
        }
        // Remove the file entry if all aggregates referencing it have been removed.
        if ($clean_sweep) {
            $advagg_files_del += db_delete('advagg_files')->condition('filename_hash', $filename_hash)
                ->execute();
            // Add info to array.
            if (!empty($advagg_files_del) || !empty($advagg_aggregates_versions_del) || !empty($advagg_aggregates_del)) {
                $types[$ext] = TRUE;
                $deleted[$filename] = array(
                    'advagg_files' => $advagg_files_del,
                    'advagg_aggregates_versions' => $advagg_aggregates_versions_del,
                    'advagg_aggregates' => $advagg_aggregates_del,
                );
            }
        }
    }
    // If something was deleted, clear the full aggregates cache.
    if (!empty($deleted)) {
        foreach ($types as $ext => $bool) {
            cache_clear_all('advagg:' . $ext . ':', 'cache_advagg_aggregates', TRUE);
        }
    }
    // Return what was deleted.
    return $deleted;
}