Revert r29361 -- breaks upload, calls nonexistent functions
[lhc/web/wiklou.git] / includes / filerepo / LocalFile.php
index 44000e4..06f7b0d 100644 (file)
@@ -110,12 +110,9 @@ class LocalFile extends File
                        wfDebug( "Pulling file metadata from cache key $key\n" );
                        $this->fileExists = $cachedValues['fileExists'];
                        if ( $this->fileExists ) {
-                               unset( $cachedValues['version'] );
-                               unset( $cachedValues['fileExists'] );
-                               foreach ( $cachedValues as $name => $value ) {
-                                       $this->$name = $value;
-                               }
+                               $this->setProps( $cachedValues );
                        }
+                       $this->dataLoaded = true;
                }
                if ( $this->dataLoaded ) {
                        wfIncrStats( 'image_cache_hit' );
@@ -210,7 +207,6 @@ class LocalFile extends File
                }
                $decoded = array();
                foreach ( $array as $name => $value ) {
-                       $deprefixedName = substr( $name, $prefixLength );
                        $decoded[substr( $name, $prefixLength )] = $value;
                }
                $decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
@@ -262,8 +258,7 @@ class LocalFile extends File
                        return;
                }
                if ( is_null($this->media_type) || 
-                       $this->mime == 'image/svg' || 
-                       $this->sha1 == ''
+                       $this->mime == 'image/svg'
                ) {
                        $this->upgradeRow();
                        $this->upgraded = true;
@@ -315,6 +310,13 @@ class LocalFile extends File
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Set properties in this object to be equal to those given in the 
+        * associative array $info. Only cacheable fields can be set.
+        * 
+        * If 'mime' is given, it will be split into major_mime/minor_mime. 
+        * If major_mime/minor_mime are given, $this->mime will also be set.
+        */
        function setProps( $info ) {
                $this->dataLoaded = true;
                $fields = $this->getCacheFields( '' );
@@ -539,7 +541,6 @@ class LocalFile extends File
                $dir = $this->getThumbPath();
                $urls = array();
                foreach ( $files as $file ) {
-                       $m = array();
                        # Check that the base file name is part of the thumb name
                        # This is a basic sanity check to avoid erasing unrelated directories
                        if ( strpos( $file, $this->getName() ) !== false ) {
@@ -694,6 +695,7 @@ class LocalFile extends File
                        return false;
                }
 
+               $reupload = false;
                if ( $timestamp === false ) {
                        $timestamp = $dbw->timestamp();
                }
@@ -723,6 +725,8 @@ class LocalFile extends File
                );
 
                if( $dbw->affectedRows() == 0 ) {
+                       $reupload = true;
+               
                        # Collision, this is an update of a file
                        # Insert previous contents into oldimage
                        $dbw->insertSelect( 'oldimage', 'image',
@@ -777,12 +781,14 @@ class LocalFile extends File
 
                # Add the log entry
                $log = new LogPage( 'upload' );
-               $log->addEntry( 'upload', $descTitle, $comment );
+               $action = $reupload ? 'overwrite' : 'upload';
+               $log->addEntry( $action, $descTitle, $comment );
 
                if( $descTitle->exists() ) {
                        # Create a null revision
                        $nullRevision = Revision::newNullRevision( $dbw, $descTitle->getArticleId(), $log->getRcComment(), false );
                        $nullRevision->insertOn( $dbw );
+                       $article->updateRevisionOn( $dbw, $nullRevision );
 
                        # Invalidate the cache for the description page
                        $descTitle->invalidateCache();
@@ -969,6 +975,19 @@ class LocalFile extends File
 
        function getSha1() {
                $this->load();
+               // Initialise now if necessary
+               if ( $this->sha1 == '' && $this->fileExists ) {
+                       $this->sha1 = File::sha1Base36( $this->getPath() );
+                       if ( strval( $this->sha1 ) != '' ) {
+                               $dbw = $this->repo->getMasterDB();
+                               $dbw->update( 'image', 
+                                       array( 'img_sha1' => $this->sha1 ),
+                                       array( 'img_name' => $this->getName() ),
+                                       __METHOD__ );
+                               $this->saveToCache();
+                       }
+               }
+
                return $this->sha1;
        }
 
@@ -1173,12 +1192,12 @@ class LocalFileDeleteBatch {
                list( $oldRels, $deleteCurrent ) = $this->getOldRels();
 
                if ( $deleteCurrent ) {
+                       $concat = $dbw->buildConcat( array( "img_sha1", $encExt ) );
                        $where = array( 'img_name' => $this->file->getName() );
                        $dbw->insertSelect( 'filearchive', 'image',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key'   => "IF(img_sha1='', '', CONCAT(img_sha1,$encExt))",
-
+                                       'fa_storage_key'   => "CASE WHEN img_sha1='' THEN '' ELSE $concat END",
                                        'fa_deleted_user'      => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason'    => $encReason,
@@ -1202,15 +1221,14 @@ class LocalFileDeleteBatch {
                }
 
                if ( count( $oldRels ) ) {
+                       $concat = $dbw->buildConcat( array( "oi_sha1", $encExt ) );
                        $where = array(
                                'oi_name' => $this->file->getName(),
                                'oi_archive_name IN (' . $dbw->makeList( array_keys( $oldRels ) ) . ')' );
-
                        $dbw->insertSelect( 'filearchive', 'oldimage', 
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key'   => "IF(oi_sha1='', '', CONCAT(oi_sha1,$encExt))",
-
+                                       'fa_storage_key'   => "CASE WHEN oi_sha1='' THEN '' ELSE $concat END",
                                        'fa_deleted_user'      => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason'    => $encReason,
@@ -1238,7 +1256,6 @@ class LocalFileDeleteBatch {
                $dbw = $this->file->repo->getMasterDB();
                list( $oldRels, $deleteCurrent ) = $this->getOldRels();
                if ( $deleteCurrent ) {
-                       $where = array( 'img_name' => $this->file->getName() );
                        $dbw->delete( 'image', array( 'img_name' => $this->file->getName() ), __METHOD__ );
                }
                if ( count( $oldRels ) ) {
@@ -1301,7 +1318,7 @@ class LocalFileDeleteBatch {
                        $urls = array();
                        foreach ( $this->srcRels as $srcRel ) {
                                $urlRel = str_replace( '%2F', '/', rawurlencode( $srcRel ) );
-                               $urls[] = $this->repo->getZoneUrl( 'public' ) . '/' . $urlRel;
+                               $urls[] = $this->file->repo->getZoneUrl( 'public' ) . '/' . $urlRel;
                        }
                        SquidUpdate::purge( $urls );
                }
@@ -1416,21 +1433,35 @@ class LocalFileRestoreBatch {
                        if ( strlen( $sha1 ) == 32 && $sha1[0] == '0' ) {
                                $sha1 = substr( $sha1, 1 );
                        }
+                       
+                       if( is_null( $row->fa_major_mime ) || $row->fa_major_mime == 'unknown'
+                               || is_null( $row->fa_minor_mime ) || $row->fa_minor_mime == 'unknown'
+                               || is_null( $row->fa_media_type ) || $row->fa_media_type == 'UNKNOWN'
+                               || is_null( $row->fa_metadata ) ) {
+                               // Refresh our metadata
+                               // Required for a new current revision; nice for older ones too. :)
+                               $props = RepoGroup::singleton()->getFileProps( $deletedUrl );
+                       } else {
+                               $props = array(
+                                       'minor_mime' => $row->fa_minor_mime,
+                                       'major_mime' => $row->fa_major_mime,
+                                       'media_type' => $row->fa_media_type,
+                                       'metadata' => $row->fa_metadata );
+                       }
 
                        if ( $first && !$exists ) {
                                // This revision will be published as the new current version
                                $destRel = $this->file->getRel();
-                               $info = $this->file->repo->getFileProps( $deletedUrl );
                                $insertCurrent = array(
                                        'img_name'        => $row->fa_name,
                                        'img_size'        => $row->fa_size,
                                        'img_width'       => $row->fa_width,
                                        'img_height'      => $row->fa_height,
-                                       'img_metadata'    => $row->fa_metadata,
+                                       'img_metadata'    => $props['metadata'],
                                        'img_bits'        => $row->fa_bits,
-                                       'img_media_type'  => $row->fa_media_type,
-                                       'img_major_mime'  => $row->fa_major_mime,
-                                       'img_minor_mime'  => $row->fa_minor_mime,
+                                       'img_media_type'  => $props['media_type'],
+                                       'img_major_mime'  => $props['major_mime'],
+                                       'img_minor_mime'  => $props['minor_mime'],
                                        'img_description' => $row->fa_description,
                                        'img_user'        => $row->fa_user,
                                        'img_user_text'   => $row->fa_user_text,
@@ -1461,10 +1492,10 @@ class LocalFileRestoreBatch {
                                        'oi_user'         => $row->fa_user,
                                        'oi_user_text'    => $row->fa_user_text,
                                        'oi_timestamp'    => $row->fa_timestamp,
-                                       'oi_metadata'     => $row->fa_metadata,
-                                       'oi_media_type'   => $row->fa_media_type,
-                                       'oi_major_mime'   => $row->fa_major_mime,
-                                       'oi_minor_mime'   => $row->fa_minor_mime,
+                                       'oi_metadata'     => $props['metadata'],
+                                       'oi_media_type'   => $props['media_type'],
+                                       'oi_major_mime'   => $props['major_mime'],
+                                       'oi_minor_mime'   => $props['minor_mime'],
                                        'oi_deleted'      => $row->fa_deleted,
                                        'oi_sha1'         => $sha1 );
                        }