From b1b8b431f7785c3224239803b0efa44467bd03d3 Mon Sep 17 00:00:00 2001 From: Antoine Musso Date: Sun, 3 Jun 2007 17:10:45 +0000 Subject: [PATCH] propset --- includes/filerepo/OldLocalFile.php | 444 ++++++++++----------- maintenance/archives/patch-oi_metadata.sql | 32 +- 2 files changed, 238 insertions(+), 238 deletions(-) diff --git a/includes/filerepo/OldLocalFile.php b/includes/filerepo/OldLocalFile.php index 846f728afd..9db5e44b49 100644 --- a/includes/filerepo/OldLocalFile.php +++ b/includes/filerepo/OldLocalFile.php @@ -1,222 +1,222 @@ -oi_name ); - $file = new self( $title, $repo, null, $row->oi_archive_name ); - $file->loadFromRow( $row, 'oi_' ); - return $file; - } - - /** - * @param Title $title - * @param FileRepo $repo - * @param string $time Timestamp or null to load by archive name - * @param string $archiveName Archive name or null to load by timestamp - */ - function __construct( $title, $repo, $time, $archiveName ) { - parent::__construct( $title, $repo ); - $this->requestedTime = $time; - $this->archive_name = $archiveName; - if ( is_null( $time ) && is_null( $archiveName ) ) { - throw new MWException( __METHOD__.': must specify at least one of $time or $archiveName' ); - } - } - - function getCacheKey() { - $hashedName = md5($this->getName()); - return wfMemcKey( 'oldfile', $hashedName ); - } - - function getArchiveName() { - if ( !isset( $this->archive_name ) ) { - $this->load(); - } - return $this->archive_name; - } - - function isOld() { - return true; - } - - /** - * Try to load file metadata from memcached. Returns true on success. - */ - function loadFromCache() { - global $wgMemc; - wfProfileIn( __METHOD__ ); - $this->dataLoaded = false; - $key = $this->getCacheKey(); - if ( !$key ) { - return false; - } - $oldImages = $wgMemc->get( $key ); - - if ( isset( $oldImages['version'] ) && $oldImages['version'] == MW_OLDFILE_VERSION ) { - unset( $oldImages['version'] ); - $more = isset( $oldImages['more'] ); - unset( $oldImages['more'] ); - $found = false; - if ( is_null( $this->requestedTime ) ) { - foreach ( $oldImages as $timestamp => $info ) { - if ( $info['archive_name'] == $this->archive_name ) { - $found = true; - break; - } - } - } else { - krsort( $oldImages ); - foreach ( $oldImages as $timestamp => $info ) { - if ( $timestamp <= $this->requestedTime ) { - $found = true; - break; - } - } - } - if ( $found ) { - wfDebug( "Pulling file metadata from cache key {$key}[{$timestamp}]\n" ); - $this->dataLoaded = true; - foreach ( $cachedValues as $name => $value ) { - $this->$name = $value; - } - } elseif ( $more ) { - wfDebug( "Cache key was truncated, oldimage row might be found in the database\n" ); - } else { - wfDebug( "Image did not exist at the specified time.\n" ); - $this->fileExists = false; - $this->dataLoaded = true; - } - } - - if ( $this->dataLoaded ) { - wfIncrStats( 'image_cache_hit' ); - } else { - wfIncrStats( 'image_cache_miss' ); - } - - wfProfileOut( __METHOD__ ); - return $this->dataLoaded; - } - - function saveToCache() { - // Cache the entire history of the image (up to MAX_CACHE_ROWS). - // This is expensive, so we only do it if $wgMemc is real - global $wgMemc; - if ( $wgMemc instanceof FakeMemcachedClient ) { - return; - } - $key = $this->getCacheKey(); - if ( !$key ) { - return; - } - wfProfileIn( __METHOD__ ); - - $dbr = $this->repo->getSlaveDB(); - $res = $dbr->select( 'oldimage', $this->getCacheFields(), - array( 'oi_name' => $this->getName() ), __METHOD__, - array( - 'LIMIT' => self::MAX_CACHE_ROWS + 1, - 'ORDER BY' => 'oi_timestamp DESC', - )); - $cache = array( 'version' => self::CACHE_VERSION ); - $numRows = $dbr->numRows( $res ); - if ( $numRows > self::MAX_CACHE_ROWS ) { - $cache['more'] = true; - $numRows--; - } - for ( $i = 0; $i < $numRows; $i++ ) { - $row = $dbr->fetchObject( $res ); - $this->decodeRow( $row, 'oi_' ); - $cache[$row->oi_timestamp] = $row; - } - $dbr->freeResult( $res ); - $wgMemc->set( $key, $cache, 7*86400 /* 1 week */ ); - wfProfileOut( __METHOD__ ); - } - - function loadFromDB() { - wfProfileIn( __METHOD__ ); - $dbr = $this->repo->getSlaveDB(); - $conds = array( 'oi_name' => $this->getName() ); - if ( is_null( $this->requestedTime ) ) { - $conds['oi_archive_name'] = $this->archive_name; - } else { - $conds[] = 'oi_timestamp <= ' . $dbr->addQuotes( $this->requestedTime ); - } - $row = $dbr->selectRow( 'oldimage', $this->getCacheFields( 'oi_' ), - $conds, __METHOD__, array( 'ORDER BY' => 'oi_timestamp DESC' ) ); - if ( $row ) { - $this->loadFromRow( $row, 'oi_' ); - } else { - $this->fileExists = false; - } - $this->dataLoaded = true; - } - - function getCacheFields( $prefix = 'img_' ) { - $fields = parent::getCacheFields( $prefix ); - $fields[] = $prefix . 'archive_name'; - - // XXX: Temporary hack before schema update - $fields = array_diff( $fields, array( - 'oi_media_type', 'oi_major_mime', 'oi_minor_mime', 'oi_metadata' ) ); - return $fields; - } - - function getRel() { - return 'archive/' . $this->getHashPath() . $this->getArchiveName(); - } - - function getUrlRel() { - return 'archive/' . $this->getHashPath() . urlencode( $this->getArchiveName() ); - } - - function upgradeRow() { - wfProfileIn( __METHOD__ ); - - $this->loadFromFile(); - - $dbw = $this->repo->getMasterDB(); - list( $major, $minor ) = self::splitMime( $this->mime ); - - wfDebug(__METHOD__.': upgrading '.$this->archive_name." to the current schema\n"); - $dbw->update( 'oldimage', - array( - 'oi_width' => $this->width, - 'oi_height' => $this->height, - 'oi_bits' => $this->bits, - #'oi_media_type' => $this->media_type, - #'oi_major_mime' => $major, - #'oi_minor_mime' => $minor, - #'oi_metadata' => $this->metadata, - ), array( 'oi_name' => $this->getName(), 'oi_timestamp' => $this->requestedTime ), - __METHOD__ - ); - wfProfileOut( __METHOD__ ); - } - - // XXX: Temporary hack before schema update - function maybeUpgradeRow() {} - -} - - -?> +oi_name ); + $file = new self( $title, $repo, null, $row->oi_archive_name ); + $file->loadFromRow( $row, 'oi_' ); + return $file; + } + + /** + * @param Title $title + * @param FileRepo $repo + * @param string $time Timestamp or null to load by archive name + * @param string $archiveName Archive name or null to load by timestamp + */ + function __construct( $title, $repo, $time, $archiveName ) { + parent::__construct( $title, $repo ); + $this->requestedTime = $time; + $this->archive_name = $archiveName; + if ( is_null( $time ) && is_null( $archiveName ) ) { + throw new MWException( __METHOD__.': must specify at least one of $time or $archiveName' ); + } + } + + function getCacheKey() { + $hashedName = md5($this->getName()); + return wfMemcKey( 'oldfile', $hashedName ); + } + + function getArchiveName() { + if ( !isset( $this->archive_name ) ) { + $this->load(); + } + return $this->archive_name; + } + + function isOld() { + return true; + } + + /** + * Try to load file metadata from memcached. Returns true on success. + */ + function loadFromCache() { + global $wgMemc; + wfProfileIn( __METHOD__ ); + $this->dataLoaded = false; + $key = $this->getCacheKey(); + if ( !$key ) { + return false; + } + $oldImages = $wgMemc->get( $key ); + + if ( isset( $oldImages['version'] ) && $oldImages['version'] == MW_OLDFILE_VERSION ) { + unset( $oldImages['version'] ); + $more = isset( $oldImages['more'] ); + unset( $oldImages['more'] ); + $found = false; + if ( is_null( $this->requestedTime ) ) { + foreach ( $oldImages as $timestamp => $info ) { + if ( $info['archive_name'] == $this->archive_name ) { + $found = true; + break; + } + } + } else { + krsort( $oldImages ); + foreach ( $oldImages as $timestamp => $info ) { + if ( $timestamp <= $this->requestedTime ) { + $found = true; + break; + } + } + } + if ( $found ) { + wfDebug( "Pulling file metadata from cache key {$key}[{$timestamp}]\n" ); + $this->dataLoaded = true; + foreach ( $cachedValues as $name => $value ) { + $this->$name = $value; + } + } elseif ( $more ) { + wfDebug( "Cache key was truncated, oldimage row might be found in the database\n" ); + } else { + wfDebug( "Image did not exist at the specified time.\n" ); + $this->fileExists = false; + $this->dataLoaded = true; + } + } + + if ( $this->dataLoaded ) { + wfIncrStats( 'image_cache_hit' ); + } else { + wfIncrStats( 'image_cache_miss' ); + } + + wfProfileOut( __METHOD__ ); + return $this->dataLoaded; + } + + function saveToCache() { + // Cache the entire history of the image (up to MAX_CACHE_ROWS). + // This is expensive, so we only do it if $wgMemc is real + global $wgMemc; + if ( $wgMemc instanceof FakeMemcachedClient ) { + return; + } + $key = $this->getCacheKey(); + if ( !$key ) { + return; + } + wfProfileIn( __METHOD__ ); + + $dbr = $this->repo->getSlaveDB(); + $res = $dbr->select( 'oldimage', $this->getCacheFields(), + array( 'oi_name' => $this->getName() ), __METHOD__, + array( + 'LIMIT' => self::MAX_CACHE_ROWS + 1, + 'ORDER BY' => 'oi_timestamp DESC', + )); + $cache = array( 'version' => self::CACHE_VERSION ); + $numRows = $dbr->numRows( $res ); + if ( $numRows > self::MAX_CACHE_ROWS ) { + $cache['more'] = true; + $numRows--; + } + for ( $i = 0; $i < $numRows; $i++ ) { + $row = $dbr->fetchObject( $res ); + $this->decodeRow( $row, 'oi_' ); + $cache[$row->oi_timestamp] = $row; + } + $dbr->freeResult( $res ); + $wgMemc->set( $key, $cache, 7*86400 /* 1 week */ ); + wfProfileOut( __METHOD__ ); + } + + function loadFromDB() { + wfProfileIn( __METHOD__ ); + $dbr = $this->repo->getSlaveDB(); + $conds = array( 'oi_name' => $this->getName() ); + if ( is_null( $this->requestedTime ) ) { + $conds['oi_archive_name'] = $this->archive_name; + } else { + $conds[] = 'oi_timestamp <= ' . $dbr->addQuotes( $this->requestedTime ); + } + $row = $dbr->selectRow( 'oldimage', $this->getCacheFields( 'oi_' ), + $conds, __METHOD__, array( 'ORDER BY' => 'oi_timestamp DESC' ) ); + if ( $row ) { + $this->loadFromRow( $row, 'oi_' ); + } else { + $this->fileExists = false; + } + $this->dataLoaded = true; + } + + function getCacheFields( $prefix = 'img_' ) { + $fields = parent::getCacheFields( $prefix ); + $fields[] = $prefix . 'archive_name'; + + // XXX: Temporary hack before schema update + $fields = array_diff( $fields, array( + 'oi_media_type', 'oi_major_mime', 'oi_minor_mime', 'oi_metadata' ) ); + return $fields; + } + + function getRel() { + return 'archive/' . $this->getHashPath() . $this->getArchiveName(); + } + + function getUrlRel() { + return 'archive/' . $this->getHashPath() . urlencode( $this->getArchiveName() ); + } + + function upgradeRow() { + wfProfileIn( __METHOD__ ); + + $this->loadFromFile(); + + $dbw = $this->repo->getMasterDB(); + list( $major, $minor ) = self::splitMime( $this->mime ); + + wfDebug(__METHOD__.': upgrading '.$this->archive_name." to the current schema\n"); + $dbw->update( 'oldimage', + array( + 'oi_width' => $this->width, + 'oi_height' => $this->height, + 'oi_bits' => $this->bits, + #'oi_media_type' => $this->media_type, + #'oi_major_mime' => $major, + #'oi_minor_mime' => $minor, + #'oi_metadata' => $this->metadata, + ), array( 'oi_name' => $this->getName(), 'oi_timestamp' => $this->requestedTime ), + __METHOD__ + ); + wfProfileOut( __METHOD__ ); + } + + // XXX: Temporary hack before schema update + function maybeUpgradeRow() {} + +} + + +?> diff --git a/maintenance/archives/patch-oi_metadata.sql b/maintenance/archives/patch-oi_metadata.sql index 532f3830a2..313df18abb 100644 --- a/maintenance/archives/patch-oi_metadata.sql +++ b/maintenance/archives/patch-oi_metadata.sql @@ -1,16 +1,16 @@ --- --- patch-indexes.sql --- --- Add data to allow for direct reference to old images --- They can be included into pages --- - -ALTER TABLE /*$wgDBprefix*/oldimage - DROP INDEX oi_name, - ADD INDEX oi_name_timestamp (oi_name,oi_timestamp), - ADD INDEX oi_name_archive_name (oi_name,oi_archive_name), - ADD oi_metadata mediumblob NOT NULL, - ADD oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, - ADD oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown", - ADD oi_minor_mime varchar(32) NOT NULL default "unknown", - ADD oi_deleted tinyint(1) unsigned NOT NULL default '0'; +-- +-- patch-indexes.sql +-- +-- Add data to allow for direct reference to old images +-- They can be included into pages +-- + +ALTER TABLE /*$wgDBprefix*/oldimage + DROP INDEX oi_name, + ADD INDEX oi_name_timestamp (oi_name,oi_timestamp), + ADD INDEX oi_name_archive_name (oi_name,oi_archive_name), + ADD oi_metadata mediumblob NOT NULL, + ADD oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + ADD oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown", + ADD oi_minor_mime varchar(32) NOT NULL default "unknown", + ADD oi_deleted tinyint(1) unsigned NOT NULL default '0'; -- 2.20.1