function system_update_files_database

You are here

7 system.module system_update_files_database(&$files, $type)

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 2237
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();
}