You are here

function avatar_selection_update_7003 in Avatar Selection 7

Create a file entry for each existing avatar for users upgrading from D6.

File

./avatar_selection.install, line 321
The Avatar Selection module install file.

Code

function avatar_selection_update_7003() {

  // Prepare the pictures directory.
  file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
  $picture_directory = file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');

  // Prepare the avatar_selection directory.
  $avs_directory = file_build_uri('avatar_selection');
  file_prepare_directory($avs_directory, FILE_CREATE_DIRECTORY);

  // Get all users using old avatar_selection avatars and create copies in the
  // "pictures" directory for them.
  $query = db_select('users', 'u')
    ->fields('u', array(
    'uid',
    'picture',
  ));
  $query
    ->join('file_managed', 'f', 'u.picture = f.fid');
  $query
    ->addField('f', 'uri');
  $result = $query
    ->condition('uri', '%/avatar_selection/%', 'LIKE')
    ->execute();
  foreach ($result as $account) {

    // Don't bother copying files that don't exist.
    if (file_exists($account->uri)) {
      $info = image_get_info($account->uri);
      $destination = file_stream_wrapper_uri_normalize($picture_directory . '/picture-' . $account->uid . '-' . REQUEST_TIME . '.' . $info['extension']);
      $original_file = file_load($account->picture);

      // Create a file object.
      $file = new stdClass();
      $file->uri = $account->uri;
      $file->filename = drupal_basename($file->uri);
      $file->filemime = file_get_mimetype($file->uri);
      $file->uid = $account->uid;
      $file->status = FILE_STATUS_PERMANENT;
      if ($file = file_copy($file, $destination, FILE_EXISTS_RENAME)) {
        $file->status = FILE_STATUS_PERMANENT;
        $file = file_save($file);
        file_usage_add($file, 'user', 'user', $account->uid);
        file_usage_delete($original_file, 'user', 'user', $account->uid);
        db_update('users')
          ->fields(array(
          'picture' => $file->fid,
        ))
          ->condition('uid', $account->uid)
          ->execute();
      }
    }
  }

  // Create a file object for each old avatar and update avatar_selection table
  // with the fid.
  $result = db_select('avatar_selection', 'avs')
    ->fields('avs', array(
    'aid',
    'avatar',
  ))
    ->condition('fid', 0)
    ->execute();
  foreach ($result as $avatar) {
    $uri = $avs_directory . '/' . $avatar->avatar;
    $uri = file_stream_wrapper_uri_normalize($uri);
    $wrapper = file_stream_wrapper_get_instance_by_uri($uri);
    $fid = db_select('file_managed', 'f')
      ->fields('f', array(
      'fid',
    ))
      ->condition('uri', $uri)
      ->execute()
      ->fetchField();
    if (empty($fid)) {
      $file = new stdClass();
      $file->uid = 1;
      $file->filename = basename($uri);
      $file->uri = $uri;
      $file->filemime = file_get_mimetype($uri);

      // This is gagged because some uris will not support it.
      $file->filesize = @filesize($uri);
      $file->timestamp = REQUEST_TIME;
      $file->status = FILE_STATUS_PERMANENT;
      $file->is_new = TRUE;
      $file = file_save($file);
      $fid = $file->fid;
    }
    db_update('avatar_selection')
      ->fields(array(
      'fid' => $fid,
    ))
      ->condition('aid', $avatar->aid)
      ->execute();
  }
  return t('Created file objects for D6 avatars.');
}