CFLib.org – Common Function Library Project

cacheCallback(cacheKey, duration, callback[, forceRefresh])

Last updated June 11, 2009

author

Adam Tuttle

Version: 0 | Requires: CF5 | Library: UtilityLib

Description:
Pass a unique cache key (string), duration (using createTimeSpan()), and the function whose return value you want to cache. A fourth optional boolean argument will allow you to force cache update. Returns the value of the function passed in, or the cached return value.

Return Values:
Returns a string.

Example:

<cfscript>
function currentTime(){
	return "The current time is #timeformat(now())#";
}
</cfscript>

<cfoutput>#cacheCallback("my.cache.key", CreateTimeSpan(0,0,20,0), currentTime)#</cfoutput>

Parameters:

Name Description Required
cacheKey Unique key used for to store the cache. Yes
duration A timespan that determines the length of the cache. Yes
callback The UDF to run. Yes
forceRefresh If true, forces a refresh. Defaults to false. No

Full UDF Source:

/**
 * An easy way to cache the result of any UDF.
 * 
 * @param cacheKey 	 Unique key used for to store the cache. (Required)
 * @param duration 	 A timespan that determines the length of the cache. (Required)
 * @param callback 	 The UDF to run.  (Required)
 * @param forceRefresh 	 If true, forces a refresh. Defaults to false. (Optional)
 * @return Returns a string. 
 * @author Adam Tuttle (j.adam.tuttle@gmail.com) 
 * @version 0, June 11, 2009 
 */
function cacheCallback(cacheKey, duration, callback) {
	var data = "";
	//optional argument: forceRefresh
	if (arrayLen(arguments) eq 4){arguments.forceRefresh=arguments[4];}else{arguments.forceRefresh=false;}
	//clean cachekey of periods that will cause errors
	arguments.cacheKey = replace(arguments.cacheKey, ".", "_", "ALL");
	//ensure cache structure is setup
	if (not structKeyExists(application, "CCBCache")){application.CCBCache = StructNew();}
	if (not structKeyExists(application.CCBCache, arguments.cacheKey)){application.CCBCache[arguments.cacheKey] = StructNew();}
	if (not structKeyExists(application.CCBCache[arguments.cacheKey], "timeout")){application.CCBCache[arguments.cacheKey].timeout = dateAdd('yyyy',-10,now());}
	if (not structKeyExists(application.CCBCache[arguments.cacheKey], "data")){application.CCBCache[arguments.cacheKey].data = '';}
	//update cache if expired
	if (arguments.forceRefresh or dateCompare(now(), application.CCBCache[arguments.cacheKey].timeout) eq 1){
		data = arguments.callback();
		application.CCBCache[arguments.cacheKey].data = data;
		application.CCBCache[arguments.cacheKey].timeout = arguments.duration;
	}
	return application.CCBCache[arguments.cacheKey].data;
}
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Kevin Cotton added
date2ExcelDate
May 5, 2016

Raymond Camden added
CapFirst
April 25, 2016

Chris Wigginton added
loremIpsum
January 18, 2016

Gary Stanton added
calculateArrival...
November 19, 2015

Sebastiaan Naafs - van Dijk added
getDaysInQuarter
November 13, 2015

Created by Raymond Camden / Design by Justin Johnson