r3996 getFileCache(): new function
authorDenis Ovsienko <infrastation@yandex.ru>
Thu, 28 Oct 2010 20:48:43 +0000 (20:48 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 28 Oct 2010 20:48:43 +0000 (20:48 +0000)
commitAddFileCache(): new function
replaceFile(): reset thumbnail column on replace
renderFilePreview(): update logic to update and use thumbnail cache

ChangeLog
inc/database.php
inc/ophandlers.php
install/init-structure.sql
render_image.php
upgrade.php

index 8b92f3c..bbd29d3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+0.19.0
+       update: cache image files thumbnails and make them JPEGs (#369, by Matt Mills)
 0.18.6
        bugfix: draw administrator's attention to missing LDAP extension (by
        Matt Mills)
index a618c20..14cfe88 100644 (file)
@@ -3186,6 +3186,38 @@ function getFile ($file_id = 0)
        return $ret;
 }
 
+function getFileCache ($file_id = 0)
+{
+       $query = usePreparedSelectBlade
+       (
+               'SELECT File.thumbnail FROM File ' .
+               'WHERE File.id = ? and File.thumbnail IS NOT NULL',
+               array ($file_id)
+       );
+       if (($row = $query->fetch (PDO::FETCH_ASSOC)) == NULL)
+               return FALSE;
+       $ret = $row['contents'];
+       $query->CloseCursor();
+       usePreparedExecuteBlade ('UPDATE File SET atime = ? WHERE id = ?', array (date ('YmdHis'), $file_id));
+       return $ret;
+}
+
+function commitAddFileCache ($file_id, $contents)
+{               
+       global $dbxlink;
+       $query = $dbxlink->prepare('UPDATE File SET thumbnail = ? WHERE id = ?');
+       $query->bindParam(1, $contents, PDO::PARAM_LOB);
+       $query->bindParam(2, $file_id);
+       try     
+       {
+               return $query->execute();
+       }
+       catch (PDOException $e)
+       {
+               throw convertPDOException ($e);
+       }
+}               
+
 function getFileLinks ($file_id = 0)
 {
        $query = usePreparedSelectBlade
index 877aa0b..e2934d5 100644 (file)
@@ -1930,6 +1930,12 @@ function replaceFile ()
        if (FALSE === commitReplaceFile ($sic['file_id'], $fp))
                return buildRedirectURL (__FUNCTION__, 'ERR3');
 
+       usePreparedExecuteBlade
+       (
+               'UPDATE File SET thumbnail = NULL WHERE id = ?',
+               $sic['file_id']
+       );
+
        return buildRedirectURL (__FUNCTION__, 'OK', array (htmlspecialchars ($shortInfo['name'])));
 }
 
index 7855963..8a72a22 100644 (file)
@@ -96,6 +96,7 @@ CREATE TABLE `File` (
   `ctime` datetime NOT NULL,
   `mtime` datetime NOT NULL,
   `atime` datetime NOT NULL,
+  `thumbnail` longblob,
   `contents` longblob NOT NULL,
   `comment` text,
   PRIMARY KEY  (`id`),
index 3fa4e2d..5cefd13 100644 (file)
@@ -219,14 +219,21 @@ function renderFilePreview ($file_id = 0, $mode = 'view')
                echo $file['contents'];
                break;
        case 'preview':
+               if($image = getFileCache($file_id)){ //Cache Hit
+                       header("Content-type: image/jpeg"); 
+                       echo $image;
+                       break;
+               }
+
+               //Cache Miss
                $file = getFile ($file_id);
                $image = imagecreatefromstring ($file['contents']);
-               unset ($file);
+               unset ($file['contents']);
                $width = imagesx ($image);
                $height = imagesy ($image);
+               header ('Content-type: image/jpeg');
                if ($width > getConfigVar ('PREVIEW_IMAGE_MAXPXS') or $height > getConfigVar ('PREVIEW_IMAGE_MAXPXS'))
                {
-                       // TODO: cache thumbs for faster page generation
                        $ratio = getConfigVar ('PREVIEW_IMAGE_MAXPXS') / max ($width, $height);
                        $newwidth = $width * $ratio;
                        $newheight = $height * $ratio;
@@ -234,11 +241,15 @@ function renderFilePreview ($file_id = 0, $mode = 'view')
                        imagecopyresampled ($resampled, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                        imagedestroy ($image);
                        $image = $resampled;
+
+                       //TODO: Find a better way to save the stream of the image... Output buffer seems silly.
+                       ob_start();
+                       imagejpeg ($image);
+                       commitAddFileCache ($file_id, ob_get_flush());
+                       imagedestroy ($image);
+                       unset ($file);
                        unset ($resampled);
                }
-               header("Content-type: image/png"); // don't announce content-length, it may have changed after resampling
-               imagepng ($image);
-               imagedestroy ($image);
                break;
        default:
                showError ('Invalid argument', __FUNCTION__);
index 47e055e..0d25811 100644 (file)
@@ -754,6 +754,10 @@ CREATE TABLE `VLANValidID` (
                        $query[] = "INSERT INTO `Config` (varname, varvalue, vartype, emptyok, is_hidden, is_userdefined, description) VALUES ('MAX_UNFILTERED_ENTITIES','0','uint','no','no','yes','Max item count to display on unfiltered result page')";
                        $query[] = "UPDATE Config SET varvalue = '0.18.5' WHERE varname = 'DB_VERSION'";
                        break;
+               case '0.19.0':
+                       $query[] = 'ALTER TABLE `File` ADD `thumbnail` LONGBLOB NULL AFTER `atime`';
+                       $query[] = "UPDATE Config SET varvalue = '0.19.0' WHERE varname = 'DB_VERSION'";
+                       break;
                default:
                        showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
                        die;