package railo.runtime.query; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.util.List; import railo.commons.io.cache.Cache; import railo.commons.io.cache.CacheEntry; import railo.commons.lang.KeyGenerator; import railo.runtime.PageContext; import railo.runtime.cache.ram.RamCache; import railo.runtime.cache.util.CacheKeyFilterAll; import railo.runtime.config.ConfigImpl; import railo.runtime.db.SQL; import railo.runtime.functions.cache.Util; import railo.runtime.type.Query; class CacheQueryCache extends QueryCacheSupport { private static final long serialVersionUID = -2321532150542424070L; private final RamCache DEFAULT_CACHE=new RamCache(); public CacheQueryCache(){ } @Override public void clear(PageContext pc) { try { getCache(pc).remove(CacheKeyFilterAll.getInstance()); } catch (IOException e) {} } @Override public void clearUnused(PageContext pc) throws IOException { Cache c = getCache(pc); List<CacheEntry> entries = c.entries(); if(entries.size()<100) return; Iterator<CacheEntry> it = entries.iterator(); while(it.hasNext()){ it.next(); // touch them to makes sure the cache remove them, not really good, cache must do this by itself /*qce=(QueryCacheEntry) entry.getValue(); if(qce.isInCacheRange(null)) { print.o(entry.getKey()); c.remove(entry.getKey()); }*/ } } @Override public Object get(PageContext pc,SQL sql, String datasource, String username,String password, Date cacheAfter) { String key=key(sql,datasource,username,password); Object obj= getCache(pc).getValue(key,null); if(obj instanceof QueryCacheEntry) { QueryCacheEntry entry=(QueryCacheEntry) obj; if(entry.isCachedAfter(cacheAfter)) { return entry.getValue(); } //getCache().remove(key); } return null; } @Override public Query getQuery(PageContext pc,SQL sql, String datasource, String username,String password, Date cacheAfter) { Object o=get(pc,sql, datasource, username, password, cacheAfter); if(o instanceof Query) return (Query) o; return null; } @Override public void remove(PageContext pc,SQL sql, String datasource, String username,String password) { try { getCache(pc).remove(key(sql, datasource, username, password)); } catch (IOException e) {} } @Override public void set(PageContext pc,SQL sql, String datasource, String username,String password, Object value, Date cacheBefore) { long timeSpan = ((cacheBefore.getTime()-System.currentTimeMillis())+1); getCache(pc).put(key(sql, datasource, username, password), new QueryCacheEntry(cacheBefore,value), Long.valueOf(timeSpan), Long.valueOf(timeSpan)); } private Cache getCache(PageContext pc) { Cache c = Util.getDefault(pc,ConfigImpl.CACHE_DEFAULT_QUERY,DEFAULT_CACHE); return c; } private String key(SQL sql, String datasource, String username,String password) { try { return Util.key(KeyGenerator.createKey(sql.toHashString()+datasource+username+password)); //return Util.key(Md5.getDigestAsString(sql.toHashString()+datasource+username+password)); } catch (IOException e) { return null; } } @Override public void clear(PageContext pc,QueryCacheFilter filter) { try { _clear(pc,filter); } catch (IOException e) {} } private void _clear(PageContext pc,QueryCacheFilter filter) throws IOException { Cache c = getCache(pc); Iterator it = c.entries().iterator(); String key; CacheEntry entry; QueryCacheEntry ce; Query q; while(it.hasNext()){ entry=(CacheEntry) it.next(); if(!(entry.getValue() instanceof QueryCacheEntry)) continue; ce=(QueryCacheEntry) entry.getValue(); if(!(ce.getValue() instanceof Query)) continue; q=(Query) ce.getValue(); key=entry.getKey(); if(filter.accept(q.getSql().toString())){ c.remove(key); } } } @Override public int size(PageContext pc) { try { return getCache(pc).keys().size(); } catch (IOException e) { return 0; } } public long sizeOf() { // TODO Auto-generated method stub return 0; } }