Merge "Added common metadata caching to the djvu handler"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 12 May 2015 05:59:16 +0000 (05:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 12 May 2015 05:59:16 +0000 (05:59 +0000)
1  2 
includes/media/DjVu.php

diff --combined includes/media/DjVu.php
@@@ -27,8 -27,6 +27,8 @@@
   * @ingroup Media
   */
  class DjVuHandler extends ImageHandler {
 +      const EXPENSIVE_SIZE_LIMIT = 10485760; // 10MiB
 +
        /**
         * @return bool
         */
                return true;
        }
  
 +      /**
 +       * True if creating thumbnails from the file is large or otherwise resource-intensive.
 +       * @param File $file
 +       * @return bool
 +       */
 +      public function isExpensiveToThumbnail( $file ) {
 +              return $file->getSize() > static::EXPENSIVE_SIZE_LIMIT;
 +      }
 +
        /**
         * @param File $file
         * @return bool
        }
  
        function pageCount( $image ) {
-               $tree = $this->getMetaTree( $image );
-               if ( !$tree ) {
-                       return false;
+               global $wgMemc;
+               $key = wfMemcKey( 'file-djvu', 'pageCount', $image->getSha1() );
+               $count = $wgMemc->get( $key );
+               if ( $count === false ) {
+                       $tree = $this->getMetaTree( $image );
+                       if ( !$tree ) {
+                               return false;
+                       }
+                       $count = count( $tree->xpath( '//OBJECT' ) );
+                       $wgMemc->set( $key, $count );
                }
  
-               return count( $tree->xpath( '//OBJECT' ) );
+               return $count;
        }
  
        function getPageDimensions( $image, $page ) {
-               $tree = $this->getMetaTree( $image );
-               if ( !$tree ) {
-                       return false;
-               }
+               global $wgMemc;
  
-               $o = $tree->BODY[0]->OBJECT[$page - 1];
-               if ( $o ) {
-                       return array(
-                               'width' => intval( $o['width'] ),
-                               'height' => intval( $o['height'] )
-                       );
-               } else {
-                       return false;
+               $key = wfMemcKey( 'file-djvu', 'dimensions', $image->getSha1() );
+               $dimsByPage = $wgMemc->get( $key );
+               if ( !is_array( $dimsByPage ) ) {
+                       $tree = $this->getMetaTree( $image );
+                       if ( !$tree ) {
+                               return false;
+                       }
+                       $dimsByPage = array();
+                       $count = count( $tree->xpath( '//OBJECT' ) );
+                       for ( $i = 0; $i < $count; ++$i ) {
+                               $o = $tree->BODY[0]->OBJECT[$i];
+                               if ( $o ) {
+                                       $dimsByPage[$i] = array(
+                                               'width' => (int)$o['width'],
+                                               'height' => (int)$o['height']
+                                       );
+                               } else {
+                                       $dimsByPage[$i] = false;
+                               }
+                       }
+                       $wgMemc->set( $key, $dimsByPage );
                }
+               $index = $page - 1; // MW starts pages at 1
+               return isset( $dimsByPage[$index] ) ? $dimsByPage[$index] : false;
        }
  
        /**