From 746c8ddc1d521f5202424330d86caacf15154159 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Sun, 10 May 2015 12:27:38 -0700 Subject: [PATCH] Added common metadata caching to the djvu handler * This should reduce expensive metadata fetches for djvu files with large (~2mb) img_metadata Bug: T96360 Change-Id: I7273ea083f90948f8c1d8948a64929bfb759ee72 --- includes/media/DjVu.php | 58 +++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php index 011fb2a046..a45f6e8c92 100644 --- a/includes/media/DjVu.php +++ b/includes/media/DjVu.php @@ -365,29 +365,55 @@ class DjVuHandler extends ImageHandler { } 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; } /** -- 2.20.1