From 009d60b4d8cb5b9074e136a33709c6e44916c76f Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 23 Nov 2007 21:47:00 +0000 Subject: [PATCH] * Only load data when necessary * Make field names more consistent with other file types * List off member variables * Add some access functions --- includes/filerepo/ArchivedFile.php | 279 +++++++++++++++++++++++++---- 1 file changed, 245 insertions(+), 34 deletions(-) diff --git a/includes/filerepo/ArchivedFile.php b/includes/filerepo/ArchivedFile.php index bd9ff6338b..1d0dca0edb 100644 --- a/includes/filerepo/ArchivedFile.php +++ b/includes/filerepo/ArchivedFile.php @@ -5,24 +5,70 @@ */ class ArchivedFile { - /** - * Returns a file object from the filearchive table - * @param $title, the corresponding image page title - * @param $id, the image id, a unique key - * @param $key, optional storage key - * @return ResultWrapper + /**#@+ + * @private */ + var $id, # filearchive row ID + $title, # image title + $name, # image name + $group, # FileStore storage group + $key, # FileStore sha1 key + $size, # file dimensions + $bits, # size in bytes + $width, # width + $height, # height + $metadata, # metadata string + $mime, # mime type + $media_type, # media type + $description, # upload description + $user, # user ID of uploader + $user_text, # user name of uploader + $timestamp, # time of upload + $dataLoaded, # Whether or not all this has been loaded from the database (loadFromXxx) + $deleted; # Bitfield akin to rev_deleted + + /**#@-*/ + function ArchivedFile( $title, $id=0, $key='' ) { - if( !is_object( $title ) ) { + if( !is_object($title) ) { throw new MWException( 'ArchivedFile constructor given bogus title.' ); } - $conds = ($id) ? "fa_id = $id" : "fa_storage_key = '$key'"; - if( $title->getNamespace() == NS_IMAGE ) { + $this->id = -1; + $this->title = $title; + $this->name = $title->getDBKey(); + $this->group = ''; + $this->key = ''; + $this->size = 0; + $this->bits = 0; + $this->width = 0; + $this->height = 0; + $this->metadata = ''; + $this->mime = "unknown/unknown"; + $this->media_type = ''; + $this->description = ''; + $this->user = 0; + $this->user_text = ''; + $this->timestamp = NULL; + $this->deleted = 0; + $this->dataLoaded = false; + } + + /** + * Loads a file object from the filearchive table + * @return ResultWrapper + */ + public function load() { + if ( $this->dataLoaded ) { + return true; + } + $conds = ($this->id) ? "fa_id = {$this->id}" : "fa_storage_key = '{$this->key}'"; + if( $this->title->getNamespace() == NS_IMAGE ) { $dbr = wfGetDB( DB_SLAVE ); $res = $dbr->select( 'filearchive', array( 'fa_id', 'fa_name', + 'fa_archive_name', 'fa_storage_key', 'fa_storage_group', 'fa_size', @@ -39,7 +85,7 @@ class ArchivedFile 'fa_timestamp', 'fa_deleted' ), array( - 'fa_name' => $title->getDbKey(), + 'fa_name' => $this->title->getDBKey(), $conds ), __METHOD__, array( 'ORDER BY' => 'fa_timestamp DESC' ) ); @@ -52,36 +98,203 @@ class ArchivedFile $row = $ret->fetchObject(); // initialize fields for filestore image object - $this->mId = intval($row->fa_id); - $this->mName = $row->fa_name; - $this->mGroup = $row->fa_storage_group; - $this->mKey = $row->fa_storage_key; - $this->mSize = $row->fa_size; - $this->mBits = $row->fa_bits; - $this->mWidth = $row->fa_width; - $this->mHeight = $row->fa_height; - $this->mMetaData = $row->fa_metadata; - $this->mMime = "$row->fa_major_mime/$row->fa_minor_mime"; - $this->mType = $row->fa_media_type; - $this->mDescription = $row->fa_description; - $this->mUser = $row->fa_user; - $this->mUserText = $row->fa_user_text; - $this->mTimestamp = $row->fa_timestamp; - $this->mDeleted = $row->fa_deleted; + $this->id = intval($row->fa_id); + $this->name = $row->fa_name; + $this->archive_name = $row->fa_archive_name; + $this->group = $row->fa_storage_group; + $this->key = $row->fa_storage_key; + $this->size = $row->fa_size; + $this->bits = $row->fa_bits; + $this->width = $row->fa_width; + $this->height = $row->fa_height; + $this->metadata = $row->fa_metadata; + $this->mime = "$row->fa_major_mime/$row->fa_minor_mime"; + $this->media_type = $row->fa_media_type; + $this->description = $row->fa_description; + $this->user = $row->fa_user; + $this->user_text = $row->fa_user_text; + $this->timestamp = $row->fa_timestamp; + $this->deleted = $row->fa_deleted; } else { throw new MWException( 'This title does not correspond to an image page.' ); return; } + $this->dataLoaded = true; + return true; } + /** + * Loads a file object from the filearchive table + * @return ResultWrapper + */ + public static function newFromRow( $row ) { + $file = new ArchivedFile( Title::makeTitle( NS_IMAGE, $row->fa_name ) ); + + $file->id = intval($row->fa_id); + $file->name = $row->fa_name; + $file->archive_name = $row->fa_archive_name; + $file->group = $row->fa_storage_group; + $file->key = $row->fa_storage_key; + $file->size = $row->fa_size; + $file->bits = $row->fa_bits; + $file->width = $row->fa_width; + $file->height = $row->fa_height; + $file->metadata = $row->fa_metadata; + $file->mime = "$row->fa_major_mime/$row->fa_minor_mime"; + $file->media_type = $row->fa_media_type; + $file->description = $row->fa_description; + $file->user = $row->fa_user; + $file->user_text = $row->fa_user_text; + $file->timestamp = $row->fa_timestamp; + $file->deleted = $row->fa_deleted; + + return $file; + } + + /** + * Return the associated title object + * @public + */ + public function getTitle() { + return $this->title; + } + + public function getID() { + $this->load(); + return $this->id; + } + + public function getKey() { + $this->load(); + return $this->key; + } + + /** + * Return the width of the image + */ + public function getWidth() { + $this->load(); + return $this->width; + } + + /** + * Return the height of the image + */ + public function getHeight() { + $this->load(); + return $this->height; + } + + /** + * Get handler-specific metadata + */ + public function getMetadata() { + $this->load(); + return $this->metadata; + } + + /** + * Return the size of the image file, in bytes + * @public + */ + public function getSize() { + $this->load(); + return $this->size; + } + + /** + * Returns the mime type of the file. + */ + public function getMimeType() { + $this->load(); + return $this->mime; + } + + /** + * Return the type of the media in the file. + * Use the value returned by this function with the MEDIATYPE_xxx constants. + */ + public function getMediaType() { + $this->load(); + return $this->media_type; + } + + /** + * Return upload timestamp. + */ + public function getTimestamp() { + $this->load(); + return $this->timestamp; + } + + /** + * Return the user ID of the uploader. + */ + public function getUser() { + $this->load(); + if( $this->isDeleted( File::DELETED_USER ) ) { + return 0; + } else { + return $this->user; + } + } + + /** + * Return the user name of the uploader. + */ + public function getUserText() { + $this->load(); + if( $this->isDeleted( File::DELETED_USER ) ) { + return 0; + } else { + return $this->user_text; + } + } + + /** + * Return upload description. + */ + public function getDescription() { + $this->load(); + if( $this->isDeleted( File::DELETED_COMMENT ) ) { + return 0; + } else { + return $this->description; + } + } + + /** + * Return the user ID of the uploader. + */ + public function getRawUser() { + $this->load(); + return $this->user; + } + + /** + * Return the user name of the uploader. + */ + public function getRawUserText() { + $this->load(); + return $this->user_text; + } + + /** + * Return upload description. + */ + public function getRawDescription() { + $this->load(); + return $this->description; + } + /** * int $field one of DELETED_* bitfield constants * for file or revision rows * @return bool */ - function isDeleted( $field ) { - return ($this->mDeleted & $field) == $field; + public function isDeleted( $field ) { + return ($this->deleted & $field) == $field; } /** @@ -90,19 +303,17 @@ class ArchivedFile * @param int $field * @return bool */ - function userCan( $field ) { - if( isset($this->mDeleted) && ($this->mDeleted & $field) == $field ) { + public function userCan( $field ) { + if( isset($this->deleted) && ($this->deleted & $field) == $field ) { // images global $wgUser; - $permission = ( $this->mDeleted & File::DELETED_RESTRICTED ) == File::DELETED_RESTRICTED + $permission = ( $this->deleted & File::DELETED_RESTRICTED ) == File::DELETED_RESTRICTED ? 'hiderevision' : 'deleterevision'; - wfDebug( "Checking for $permission due to $field match on $this->mDeleted\n" ); + wfDebug( "Checking for $permission due to $field match on $this->deleted\n" ); return $wgUser->isAllowed( $permission ); } else { return true; } } } - - -- 2.20.1