class Pettanr.Cache constructor: (options) -> @operators = options.operators @data = {} @holds = {} _.extend(this, Backbone.Events) # return cached items store: (items) -> if _.isArray(items) return_items = _.map items, (item) => r = @restore(item.cache_key()) r = @store(item) if !r r else item = items cached_item = @restore(item.cache_key()) return_items = if cached_item cached_item # merge? else @data[item.cache_key()] = item # @refresh(return_items) return_items restore: (key) -> k = if _.isString(key) key else key.cache_key() item = @data[k] #if item # @refresh(item) is_hold: (item) -> if @holds[item.cache_key()] true else false hold: (item) -> return @holds[item.cache_key()] if @holds[item.cache_key()] @holds[item.cache_key()] = item.clone() fix: (item) -> delete @holds[item.cache_key()] @restore(item).fetch() release: (item) -> delete @holds[item.cache_key()] free: (item) -> delete @data[item.cache_key()] refresh: (item) -> @restore(item.cache_key()).fetch() #if item.expire_time # if Date.now() >= return_items.expire_time # @sync(item) #item sync: (item) -> item.fetch({ success: (model, response, opt) => item.expire_time.setTime(Date.now() + 10 * 60 * 1000) error: (model, response, opt) => @trigger('fail', response, opt) }) class Pettanr.Cache.Retriever constructor: (@model, @id) -> _.extend(this, Backbone.Events) retrieve: (force) -> empty_item = new @model({id: @id}) if force # query (ex: folders/3?watch) @retrieve_force(empty_item) else if @id # existence item item = Pettanr.cache.restore(empty_item) if item @trigger('retrieve', item) else empty_item.fetch({ success: (model, response, opt) => Pettanr.cache.store(empty_item) @trigger('retrieve', empty_item) error: (model, response, opt) => @trigger('fail', response, opt) }) else # new item @trigger('retrieve', empty_item) retrieve_force: (item) -> item.fetch({ success: (model, response, opt) => @trigger('retrieve', item) error: (model, response, opt) => @trigger('fail', response, opt) }) edit: (options = {}) -> empty_item = new @model({id: @id}) item = empty_item.hold() item.fetch({ success: (model, response, opt) => @trigger('retrieve', item) error: (model, response, opt) => @trigger('fail', response, opt) })