Given an array of files remove that file if there is no associated db record.
Paramètres
array $files: Array of files returned by file_scan_directory.
Return value
array Array of files that got removed.
1 call to advagg_delete_files_if_orphaned()
- advagg_delete_orphaned_aggregates dans ./
advagg.cache.inc - Scan CSS/JS advagg dir and remove file if there is no associated db record.
Fichier
-
./
advagg.cache.inc, line 553
Code
function advagg_delete_files_if_orphaned(array $files) {
// Get the uri for the advagg_css/parts directory.
list($css_path) = advagg_get_root_files_dir();
$parts_uri = $css_path[0] . '/parts/';
// Array used to record what files were deleted.
$kill_list = $keyed_file_list = array();
// Create a listing of all file names and associated hashes.
foreach ($files as $uri => $file) {
// Get info on file.
$data = advagg_get_hashes_from_filename($file->filename, TRUE);
if (is_array($data)) {
list(, $aggregate_filenames_hash) = $data;
// Check to see if the file is in the database.
$keyed_file_list[$aggregate_filenames_hash] = $uri;
}
else {
// Check to see if this is a parts css file.
$start = strpos($file->uri, $parts_uri);
if ($start !== FALSE) {
// Get the original filename.
$original_file = substr($file->uri, $start + strlen($parts_uri));
$original_file = preg_replace('/(.\\d+\\.css)$/i', '.css', $original_file);
if (file_exists($original_file)) {
// Original file exists, do not delete.
continue;
}
}
// Can not get data on file, remove it.
$kill_list[] = $uri;
continue;
}
}
if (!empty($keyed_file_list)) {
$filenames_hash = array_keys($keyed_file_list);
$aggregates_in_database = array();
// Process in chunks when a large array is passed.
do {
// Check if the aggregate_filenames_hash exists in the database.
$aggregates_in_database += db_select('advagg_aggregates_versions', 'av')->fields('av', array(
'aggregate_filenames_hash',
))
->condition('av.aggregate_filenames_hash', array_splice($filenames_hash, 0, 1000), 'IN')
->distinct()
->execute()
->fetchAllAssoc('aggregate_filenames_hash');
} while (count($filenames_hash));
// Get values not found in the database.
$to_delete = array_values(array_diff_key($keyed_file_list, $aggregates_in_database));
// Add the file uri to the kill list.
$kill_list = array_merge($kill_list, $to_delete);
}
if (!empty($kill_list)) {
foreach ($kill_list as $uri) {
advagg_delete_file_by_uri($uri);
}
}
// Let other modules know about the removed files.
// Call hook_advagg_removed_aggregates().
module_invoke_all('advagg_removed_aggregates', $kill_list);
return $kill_list;
}