Update of /cvsroot/gallery/gallery2/modules/imageblock/classes
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4397/classes
Modified Files:
ImageBlockHelper.class
Added Files:
GNUmakefile ImageBlockCacheMap.class
Log Message:
Added cache table to improve performance.
--- NEW FILE: ImageBlockCacheMap.class ---
<?php
/*
* $RCSfile: ImageBlockCacheMap.class,v $
*
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2004 Bharat Mediratta
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* @version $Revision: 1.1 $ $Date: 2004/07/01 05:06:28 $
* @package ImageBlock
* @author Alan Harder <alan.harder@...>
*/
/**
* A cache of all viewable items with thumbnails for each user.
*
* @g2 <class-name>ImageBlockCacheMap</class-name>
* @g2 <schema>
* @g2 <schema-major>1</schema-major>
* @g2 <schema-minor>0</schema-minor>
* @g2 </schema>
*
* @package ImageBlock
* @subpackage Classes
*/
class ImageBlockCacheMap_core {
/**
* @g2 <map>
* @g2 <member>
* @g2 <member-name>userId</member-name>
* @g2 <member-type>INTEGER</member-type>
* @g2 <required/>
* @g2 </member>
* @g2 <member>
* @g2 <member-name>itemType</member-name>
* @g2 <member-type>INTEGER</member-type>
* @g2 <required/>
* @g2 </member>
* @g2 <member>
* @g2 <member-name>itemTimestamp</member-name>
* @g2 <member-type>INTEGER</member-type>
* @g2 <required/>
* @g2 </member>
* @g2 <member>
* @g2 <member-name>itemId</member-name>
* @g2 <member-type>INTEGER</member-type>
* @g2 <required/>
* @g2 </member>
* @g2 <index>
* @g2 <member-name>userId</member-name>
* @g2 <member-name>itemType</member-name>
* @g2 </index>
* @g2 </map>
*/
}
include(dirname(__FILE__) . '/interfaces/ImageBlockCacheMap.inc');
?>
--- NEW FILE: GNUmakefile ---
all:
cd interfaces && $(MAKE) -$(MAKEFLAGS)
cd GalleryStorage/DatabaseStorage/schema && $(MAKE) -$(MAKEFLAGS)
%:
cd interfaces && $(MAKE) -$(MAKEFLAGS) $@
cd GalleryStorage/DatabaseStorage/schema && $(MAKE) -$(MAKEFLAGS) $@
Index: ImageBlockHelper.class
===================================================================
RCS file: /cvsroot/gallery/gallery2/modules/imageblock/classes/ImageBlockHelper.class,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ImageBlockHelper.class 20 May 2004 23:12:26 -0000 1.3
+++ ImageBlockHelper.class 1 Jul 2004 05:06:28 -0000 1.4
@@ -61,12 +61,12 @@
function fetchViewableData($itemType, $order) {
global $gallery;
$storage = $gallery->getStorage();
+ $typeMap = array('GalleryPhotoItem' => 1, 'GalleryAlbumItem' => 2);
- list ($ret, $permissionBits) = GalleryCoreApi::convertPermissionIdsToBits('core.view');
- if ($ret->isError()) {
- return array($ret->wrap(__FILE__, __LINE__), null);
- }
-
+ /* Prepare the query */
+ $select = '[ImageBlockCacheMap::itemId], [ImageBlockCacheMap::itemTimestamp]';
+ $from = '[ImageBlockCacheMap]';
+ $where ='[ImageBlockCacheMap::userId] = ? AND [ImageBlockCacheMap::itemType] = ?';
switch ($order) {
case IMAGE_BLOCK_RANDOM:
list ($ret, $orderBy) = $storage->getFunctionSql('RAND', array());
@@ -75,71 +75,149 @@
}
break;
case IMAGE_BLOCK_RECENT:
- $orderBy = '[GalleryEntity::creationTimestamp] DESC';
+ $orderBy = '[ImageBlockCacheMap::itemTimestamp] DESC';
break;
case IMAGE_BLOCK_VIEWED:
+ $select .= ', [GalleryItemAttributesMap::viewCount]';
+ $from .= ', [GalleryItemAttributesMap]';
+ $where .= ' AND [ImageBlockCacheMap::itemId] = [GalleryItemAttributesMap::itemId]';
$orderBy = '[GalleryItemAttributesMap::viewCount] DESC';
break;
default:
return array(GalleryStatus::ERROR_UNIMPLEMENTED(__FILE__, __LINE__), null);
}
- list ($ret, $groupIds) = GalleryCoreApi::fetchGroupsForUser($gallery->getActiveUserId());
+ $query = "SELECT $select FROM $from WHERE $where ORDER BY $orderBy LIMIT 1";
+ $data[] = $gallery->getActiveUserId();
+ $data[] = $typeMap[$itemType];
+ $result = null;
+
+ while (true) {
+ list ($ret, $searchResults) = $gallery->search($query, $data, array());
+ if ($ret->isError()) {
+ return array($ret->wrap(__FILE__, __LINE__), null);
+ }
+ if ($rec = $searchResults->nextResult()) {
+ $result = array('id' => (int)$rec[0],
+ 'creationTimestamp' => (int)$rec[1]);
+ if ($order == IMAGE_BLOCK_VIEWED) {
+ $result['viewCount'] = (int)$rec[2];
+ }
+ break;
+ }
+ if (isset($cached)) {
+ break;
+ }
+ $ret = ImageBlockHelper::cacheViewableTree();
+ if ($ret->isError()) {
+ return array($ret->wrap(__FILE__, __LINE__), null);
+ }
+ $cached = true;
+ }
+
+ if (isset($result) && !isset($result['viewCount'])) {
+ list ($ret, $result['viewCount']) = GalleryCoreApi::fetchItemViewCount($result['id']);
+ if ($ret->isError()) {
+ return array($ret->wrap(__FILE__, __LINE__), null);
+ }
+ }
+
+ return array(GalleryStatus::success(), $result);
+ }
+
+ /**
+ * Cache viewable data for current user
+ *
+ * @return object GalleryStatus a status code
+ * @static
+ */
+ function cacheViewableTree() {
+ global $gallery;
+ $storage = $gallery->getStorage();
+
+ list ($ret, $permissionBits) = GalleryCoreApi::convertPermissionIdsToBits('core.view');
if ($ret->isError()) {
return array($ret->wrap(__FILE__, __LINE__), null);
}
+ $userId = $gallery->getActiveUserId();
+ list ($ret, $groupIds) = GalleryCoreApi::fetchGroupsForUser($userId);
+ if ($ret->isError()) {
+ return array($ret->wrap(__FILE__, __LINE__), null);
+ }
$groupIds = array_keys($groupIds);
$groupIdMarkers = GalleryUtilities::makeMarkers($groupIds);
- /* Prepare the query */
$query = '
+ INSERT INTO
+ [ImageBlockCacheMap]
SELECT
- [GalleryEntity::id], [GalleryEntity::creationTimestamp], [GalleryItemAttributesMap::viewCount]
+ ?, ?, [GalleryEntity::creationTimestamp], [GalleryEntity::id]
FROM
- [GalleryEntity], [GalleryPermissionMap], [GalleryItemAttributesMap], [GalleryChildEntity], [GalleryDerivative]
+ [GalleryEntity], [GalleryPermissionMap], [GalleryChildEntity], [GalleryDerivative]
WHERE
+ [GalleryEntity::entityType] = ?
+ AND
([GalleryPermissionMap::userId] = ?
OR
[GalleryPermissionMap::groupId] IN (' . $groupIdMarkers . '))
AND
- [GalleryPermissionMap::permission] & ? > ?
+ [GalleryPermissionMap::permission] & ? > 0
AND
[GalleryPermissionMap::itemId] = [GalleryEntity::id]
AND
- [GalleryEntity::entityType] = ?
- AND
- [GalleryItemAttributesMap::itemId] = [GalleryEntity::id]
- AND
[GalleryChildEntity::parentId] = [GalleryEntity::id]
AND
[GalleryDerivative::id] = [GalleryChildEntity::id]
AND
- [GalleryDerivative::derivativeType] = ' .
- DERIVATIVE_TYPE_IMAGE_THUMBNAIL . '
- GROUP BY
- [GalleryEntity::id], [GalleryEntity::creationTimestamp], [GalleryItemAttributesMap::viewCount]
- ORDER BY ' . $orderBy . ' LIMIT 1';
+ [GalleryDerivative::derivativeType] = ' . DERIVATIVE_TYPE_IMAGE_THUMBNAIL . '
+ ';
- $data[] = $gallery->getActiveUserId();
+ $data = array($userId, 1, 'GalleryPhotoItem', $userId);
array_splice($data, sizeof($data), 0, $groupIds);
$data[] = $storage->convertIntToBits($permissionBits);
- $data[] = $storage->convertIntToBits(0);
- $data[] = $itemType;
- list ($ret, $searchResults) = $gallery->search($query, $data, array());
+ $ret = $storage->execute($query, $data);
if ($ret->isError()) {
return array($ret->wrap(__FILE__, __LINE__), null);
}
- $data = null;
- while ($result = $searchResults->nextResult()) {
- $data = array('id' => (int)$result[0],
- 'creationTimestamp' => (int)$result[1],
- 'viewCount' => (int)$result[2]);
+ $data[1] = 2;
+ $data[2] = 'GalleryAlbumItem';
+ $ret = $storage->execute($query, $data);
+ if ($ret->isError()) {
+ return array($ret->wrap(__FILE__, __LINE__), null);
}
- return array(GalleryStatus::success(), $data);
+
+ return GalleryStatus::success();
}
+ /**
+ * Event handler for Gallery::ViewableTreeChange event
+ * Invalidate image block cache for specified user, or entire cache if no user
+ *
+ * @param object GalleryEvent the event
+ * @return object GalleryStatus a status code
+ */
+ function handleEvent($event) {
+ require_once(dirname(__FILE__) . '/ImageBlockCacheMap.class');
+ if ($event->getEventName() == 'Gallery::ViewableTreeChange') {
+ $param = $event->getEntity();
+ if (isset($param['userId'])) {
+ $ret = ImageBlockCacheMap::removeMapEntry(array('userId' => $param['userId']));
+ if ($ret->isError()) {
+ return $ret->wrap(__FILE__, __LINE__);
+ }
+ } else {
+ global $gallery;
+ $storage = $gallery->getStorage();
+ $ret = $storage->execute('DELETE FROM [ImageBlockCacheMap]', array());
+ if ($ret->isError()) {
+ return $ret->wrap(__FILE__, __LINE__);
+ }
+ }
+ }
+ return GalleryStatus::success();
+ }
}
?>
|