Skip to content

Instantly share code, notes, and snippets.

@Bajena
Created June 24, 2018 18:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Bajena/db4296c7fa17642148e39187369dc911 to your computer and use it in GitHub Desktop.
Save Bajena/db4296c7fa17642148e39187369dc911 to your computer and use it in GitHub Desktop.
DataCache with chunking
/**
* Constructor for DataCache.
* More info on caching: https://developers.google.com/apps-script/reference/cache/cache
*
* @param {object} cacheService - GDS caching service
* @param {Date} startDate - beggining of GDS request interval
* @param {Date} endDate - end of GDS request interval
*
* @return {object} DataCache.
*/
function DataCache(cacheService, startDate, endDate) {
this.service = cacheService;
this.cacheKey = this.buildCacheKey(startDate, endDate);
return this;
}
/** @const - 6 hours, Google's max */
DataCache.REQUEST_CACHING_TIME = 21600;
/** @const - 100 KB */
DataCache.MAX_CACHE_SIZE = 100 * 1024;
/**
* Builds a cache key for given GDS request
*
* @return {String} cache key
*/
DataCache.prototype.buildCacheKey = function(startDate, endDate) {
return startDate + '__' + endDate;
};
/**
* Gets stored value
*
* @return {String} Response string
*/
DataCache.prototype.get = function() {
var value = '';
var chunk = '';
var chunkIndex = 0;
do {
var chunkKey = this.getChunkKey(chunkIndex);
chunk = this.service.get(chunkKey);
value += (chunk || '');
chunkIndex++;
} while (chunk && chunk.length == DataCache.MAX_CACHE_SIZE);
return value;
};
/**
* Stores value in cache.
*
* @param {String} key - cache key
* @param {String} value
*/
DataCache.prototype.set = function(value) {
this.storeChunks(value);
};
DataCache.prototype.storeChunks = function(value) {
var chunks = this.splitInChunks(value);
for (var i = 0; i < chunks.length; i++) {
var chunkKey = this.getChunkKey(i);
this.service.put(chunkKey, chunks[i], DataCache.REQUEST_CACHING_TIME);
}
};
DataCache.prototype.getChunkKey = function(chunkIndex) {
return this.cacheKey + '_' + chunkIndex;
};
DataCache.prototype.splitInChunks = function(str) {
var size = DataCache.MAX_CACHE_SIZE;
var numChunks = Math.ceil(str.length / size);
var chunks = new Array(numChunks);
for (var i = 0, o = 0; i < numChunks; ++i, o += size) {
chunks[i] = str.substr(o, size);
}
return chunks;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment