You are here

function system_update_files_database in Drupal 7

Updates the records in the system table based on the files array.

Parameters

$files: An array of files.

$type: The type of the files.

2 calls to system_update_files_database()
system_rebuild_module_data in modules/system/system.module
Rebuild, save, and return data about all currently available modules.
system_rebuild_theme_data in modules/system/system.module
Rebuild, save, and return data about all currently available themes.

File

modules/system/system.module, line 2251
Configuration system that lets administrators modify the workings of the site.

Code

function system_update_files_database(&$files, $type) {
  $result = db_query("SELECT * FROM {system} WHERE type = :type", array(
    ':type' => $type,
  ));

  // Add all files that need to be deleted to a DatabaseCondition.
  $delete = db_or();
  foreach ($result as $file) {
    if (isset($files[$file->name]) && is_object($files[$file->name])) {

      // Keep the old filename from the database in case the file has moved.
      $old_filename = $file->filename;
      $updated_fields = array();

      // Handle info specially, compare the serialized value.
      $serialized_info = serialize($files[$file->name]->info);
      if ($serialized_info != $file->info) {
        $updated_fields['info'] = $serialized_info;
      }
      unset($file->info);

      // Scan remaining fields to find only the updated values.
      foreach ($file as $key => $value) {
        if (isset($files[$file->name]->{$key}) && $files[$file->name]->{$key} != $value) {
          $updated_fields[$key] = $files[$file->name]->{$key};
        }
      }

      // Update the record.
      if (count($updated_fields)) {
        db_update('system')
          ->fields($updated_fields)
          ->condition('filename', $old_filename)
          ->execute();
      }

      // Indicate that the file exists already.
      $files[$file->name]->exists = TRUE;
    }
    else {

      // File is not found in file system, so delete record from the system table.
      $delete
        ->condition('filename', $file->filename);
    }
  }
  if (count($delete) > 0) {

    // Delete all missing files from the system table, but only if the plugin
    // has never been installed.
    db_delete('system')
      ->condition($delete)
      ->condition('schema_version', -1)
      ->execute();
  }

  // All remaining files are not in the system table, so we need to add them.
  $query = db_insert('system')
    ->fields(array(
    'filename',
    'name',
    'type',
    'owner',
    'info',
  ));
  foreach ($files as &$file) {
    if (isset($file->exists)) {
      unset($file->exists);
    }
    else {
      $query
        ->values(array(
        'filename' => $file->uri,
        'name' => $file->name,
        'type' => $type,
        'owner' => isset($file->owner) ? $file->owner : '',
        'info' => serialize($file->info),
      ));
      $file->type = $type;
      $file->status = 0;
      $file->schema_version = -1;
    }
  }
  $query
    ->execute();

  // If any module or theme was moved to a new location, we need to reset the
  // system_list() cache or we will continue to load the old copy, look for
  // schema updates in the wrong place, etc.
  system_list_reset();
}