summaryrefslogtreecommitdiff
path: root/lib/dojo/store/Cache.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dojo/store/Cache.js')
-rw-r--r--lib/dojo/store/Cache.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/lib/dojo/store/Cache.js b/lib/dojo/store/Cache.js
new file mode 100644
index 000000000..d08d17099
--- /dev/null
+++ b/lib/dojo/store/Cache.js
@@ -0,0 +1,152 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojo.store.Cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.store.Cache"] = true;
+dojo.provide("dojo.store.Cache");
+
+dojo.getObject("store", true, dojo);
+
+/*=====
+dojo.declare("dojo.store.__CacheArgs", null, {
+ constructor: function(){
+ // summary:
+ // These are additional options for how caching is handled.
+ // isLoaded: Function?
+ // This is a function that will be called for each item in a query response to determine
+ // if it is cacheable. If isLoaded returns true, the item will be cached, otherwise it
+ // will not be cached. If isLoaded is not provided, all items will be cached.
+ this.isLoaded = isLoaded;
+ }
+});
+=====*/
+dojo.store.Cache = function(masterStore, cachingStore, /*dojo.store.__CacheArgs*/ options){
+ // summary:
+ // The Cache store wrapper takes a master store and a caching store,
+ // caches data from the master into the caching store for faster
+ // lookup. Normally one would use a memory store for the caching
+ // store and a server store like JsonRest for the master store.
+ // masterStore:
+ // This is the authoritative store, all uncached requests or non-safe requests will
+ // be made against this store.
+ // cachingStore:
+ // This is the caching store that will be used to store responses for quick access.
+ // Typically this should be a local store.
+ // options:
+ // These are additional options for how caching is handled.
+ options = options || {};
+ return dojo.delegate(masterStore, {
+ query: function(query, directives){
+ var results = masterStore.query(query, directives);
+ results.forEach(function(object){
+ if(!options.isLoaded || options.isLoaded(object)){
+ cachingStore.put(object);
+ }
+ });
+ return results;
+ },
+ // look for a queryEngine in either store
+ queryEngine: masterStore.queryEngine || cachingStore.queryEngine,
+ get: function(id, directives){
+ return dojo.when(cachingStore.get(id), function(result){
+ return result || dojo.when(masterStore.get(id, directives), function(result){
+ if(result){
+ cachingStore.put(result, {id: id});
+ }
+ return result;
+ });
+ });
+ },
+ add: function(object, directives){
+ return dojo.when(masterStore.add(object, directives), function(result){
+ // now put result in cache
+ return cachingStore.add(typeof result == "object" ? result : object, directives);
+ });
+ },
+ put: function(object, directives){
+ // first remove from the cache, so it is empty until we get a response from the master store
+ cachingStore.remove((directives && directives.id) || this.getIdentity(object));
+ return dojo.when(masterStore.put(object, directives), function(result){
+ // now put result in cache
+ return cachingStore.put(typeof result == "object" ? result : object, directives);
+ });
+ },
+ remove: function(id, directives){
+ return dojo.when(masterStore.remove(id, directives), function(result){
+ return cachingStore.remove(id, directives);
+ });
+ },
+ evict: function(id){
+ return cachingStore.remove(id);
+ }
+ });
+};
+/*=====
+dojo.declare("dojo.store.Cache", null, {
+ // example:
+ // | var master = new dojo.store.Memory(data);
+ // | var cacher = new dojo.store.Memory();
+ // | var store = new dojo.store.Cache(master, cacher);
+ //
+ query: function(query, directives){
+ // summary:
+ // Query the underlying master store and cache any results.
+ // query: Object|String
+ // The object or string containing query information. Dependent on the query engine used.
+ // directives: dojo.store.util.SimpleQueryEngine.__queryOptions?
+ // An optional keyword arguments object with additional parameters describing the query.
+ // returns: dojo.store.util.QueryResults
+ // A QueryResults object that can be used to iterate over.
+ },
+ get: function(id, directives){
+ // summary:
+ // Get the object with the specific id.
+ // id: Number
+ // The identifier for the object in question.
+ // directives: dojo.store.__GetOptions?
+ // Any additional parameters needed to describe how the get should be performed.
+ // returns: dojo.store.util.QueryResults
+ // A QueryResults object.
+ },
+ add: function(object, directives){
+ // summary:
+ // Add the given object to the store.
+ // object: Object
+ // The object to add to the store.
+ // directives: dojo.store.__AddOptions?
+ // Any additional parameters needed to describe how the add should be performed.
+ // returns: Number
+ // The new id for the object.
+ },
+ put: function(object, directives){
+ // summary:
+ // Put the object into the store (similar to an HTTP PUT).
+ // object: Object
+ // The object to put to the store.
+ // directives: dojo.store.__PutOptions?
+ // Any additional parameters needed to describe how the put should be performed.
+ // returns: Number
+ // The new id for the object.
+ },
+ remove: function(id, directives){
+ // summary:
+ // Remove the object with the specific id.
+ // id: Number
+ // The identifier for the object in question.
+ // directives: dojo.store.__RemoveOptions?
+ // Any additional parameters needed to describe how the remove should be performed.
+ },
+ evict: function(id){
+ // summary:
+ // Remove the object with the given id from the underlying caching store.
+ // id: Number
+ // The identifier for the object in question.
+ }
+});
+=====*/
+
+}