00001 /** 00002 * C-JDBC: Clustered JDBC. 00003 * Copyright (C) 2002-2004 French National Institute For Research In Computer 00004 * Science And Control (INRIA). 00005 * Contact: c-jdbc@objectweb.org 00006 * 00007 * This library is free software; you can redistribute it and/or modify it 00008 * under the terms of the GNU Lesser General Public License as published by the 00009 * Free Software Foundation; either version 2.1 of the License, or any later 00010 * version. 00011 * 00012 * This library is distributed in the hope that it will be useful, but WITHOUT 00013 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00014 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 00015 * for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public License 00018 * along with this library; if not, write to the Free Software Foundation, 00019 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 00020 * 00021 * Initial developer(s): Emmanuel Cecchet. 00022 * Contributor(s): Nicolas Modzyk. 00023 */ 00024 00025 package org.objectweb.cjdbc.controller.cache.result; 00026 00027 import java.util.Iterator; 00028 00029 import org.objectweb.cjdbc.common.sql.AbstractWriteRequest; 00030 import org.objectweb.cjdbc.common.sql.ParsingGranularities; 00031 import org.objectweb.cjdbc.common.sql.SelectRequest; 00032 import org.objectweb.cjdbc.common.sql.UpdateRequest; 00033 import org.objectweb.cjdbc.controller.cache.result.entries.CacheEntry; 00034 import org.objectweb.cjdbc.controller.cache.result.schema.CacheDatabaseTable; 00035 00036 /** 00037 * This is a query cache implementation with a table granularity: 00038 * <ul> 00039 * <li><code>TABLE</code>: table granularity, entries in the cache are 00040 * invalidated based on table dependencies.</li> 00041 * </ul> 00042 * 00043 * @author <a href="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a> 00044 * @author <a href="mailto:Nicolas.Modrzyk@inrialpes.fr">Nicolas Modrzyk </a> 00045 * @version 1.0 00046 */ 00047 public class ResultCacheTable extends ResultCache 00048 { 00049 /** 00050 * Builds a new ResultCache with a table granularity. 00051 * 00052 * @param maxEntries maximum number of entries 00053 * @param pendingTimeout pending timeout for concurrent queries 00054 */ 00055 public ResultCacheTable(int maxEntries, int pendingTimeout) 00056 { 00057 super(maxEntries, pendingTimeout); 00058 parsingGranularity = ParsingGranularities.TABLE; 00059 } 00060 00061 /** 00062 * @see org.objectweb.cjdbc.controller.cache.result.ResultCache#processAddToCache 00063 */ 00064 protected void processAddToCache(CacheEntry qe) 00065 { 00066 SelectRequest request = qe.getRequest(); 00067 for (Iterator i = request.getFrom().iterator(); i.hasNext();) 00068 cdbs.getTable((String) i.next()).addCacheEntry(qe); 00069 } 00070 00071 /** 00072 * @see org.objectweb.cjdbc.controller.cache.result.AbstractResultCache#isUpdateNecessary(org.objectweb.cjdbc.common.sql.UpdateRequest) 00073 */ 00074 public boolean isUpdateNecessary(UpdateRequest request) 00075 { 00076 return true; 00077 } 00078 00079 /** 00080 * @see org.objectweb.cjdbc.controller.cache.result.ResultCache#processWriteNotify(org.objectweb.cjdbc.common.sql.AbstractWriteRequest) 00081 */ 00082 protected void processWriteNotify(AbstractWriteRequest request) 00083 { 00084 CacheDatabaseTable cdt = cdbs.getTable(request.getTableName()); 00085 00086 if (cdt != null) 00087 cdt.invalidateAll(); 00088 else 00089 { 00090 logger.warn("Table " + request.getTableName() 00091 + " not found in cache schema. Flushing whole cache."); 00092 flushCache(); 00093 } 00094 } 00095 00096 /** 00097 * @see org.objectweb.cjdbc.controller.cache.result.ResultCache#getName() 00098 */ 00099 public String getName() 00100 { 00101 return "table"; 00102 } 00103 }