OSDN Git Service

fix:retrive
[pettanr/pettanr.git] / app / assets / javascripts / pettanr / cache.js.coffee
index 93e85d2..7dd14af 100644 (file)
@@ -1,7 +1,9 @@
 class Pettanr.Cache\r
   \r
   constructor: (options) ->\r
+    @operators = options.operators\r
     @data = {}\r
+    @holds = {}\r
     _.extend(this, Backbone.Events)\r
   \r
   # return cached items\r
@@ -13,7 +15,11 @@ class Pettanr.Cache
         r\r
     else\r
       item = items\r
-      return_items = @data[item.cache_key()] = @restore(item.cache_key()) || item\r
+      cached_item = @restore(item.cache_key())\r
+      return_items = if cached_item\r
+        cached_item  # merge?\r
+      else\r
+        @data[item.cache_key()] = item\r
       @refresh(return_items)\r
     return_items\r
   \r
@@ -21,16 +27,73 @@ class Pettanr.Cache
     k = if _.isString(key)\r
       key\r
     else\r
-      key.cache_key()  # key = item\r
-    @refresh(k)\r
+      key.cache_key()\r
+    item = @data[k]\r
+    #if item\r
+    #  @refresh(item)\r
+  \r
+  is_hold: (item) ->\r
+    if @holds[item.cache_key()]\r
+      true\r
+    else\r
+      false\r
+  \r
+  hold: (item) ->\r
+    return @holds[item.cache_key()] if @holds[item.cache_key()]\r
+    @holds[item.cache_key()] = item.clone()\r
+  \r
+  fix: (item) ->\r
+    delete @holds[item.cache_key()]\r
+    @restore(item).fetch()\r
+  \r
+  release: (item) ->\r
+    delete @holds[item.cache_key()]\r
   \r
   refresh: (item) ->\r
-    if item.expire_time\r
-      if Date.now() >= return_items.expire_time\r
-        @sync(item)\r
-    item\r
+    @restore(item.cache_key()).fetch()\r
+    #if item.expire_time\r
+    #  if Date.now() >= return_items.expire_time\r
+    #    @sync(item)\r
+    #item\r
   \r
   sync: (item) ->\r
     item.fetch().done =>\r
       item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
   \r
+class Pettanr.Cache.Retriever\r
+  \r
+  constructor: (@model, @id) ->\r
+    _.extend(this, Backbone.Events)\r
+  \r
+  retrieve: (force) ->\r
+    empty_item = new @model({id: @id})\r
+    if force\r
+      # query (ex: folders/3?watch)\r
+      @retrieve_force(empty_item)\r
+    else if @id\r
+      # existence item\r
+      item = Pettanr.cache.restore(empty_item)\r
+      if item\r
+        @trigger('retrieve', item)\r
+      else\r
+        empty_item.fetch().done =>\r
+          Pettanr.cache.store(empty_item)\r
+          @trigger('retrieve', empty_item)\r
+    else\r
+      # new item\r
+      @trigger('retrieve', empty_item)\r
+  \r
+  retrieve_force: (item) ->\r
+    item.fetch().done =>\r
+      @trigger('retrieve', item)\r
+  \r
+  edit: (options = {}) ->\r
+    empty_item = new @model({id: @id})\r
+    item = empty_item.hold()\r
+    if options.with_elements\r
+      item = item.with_elements()\r
+    item.fetch().done =>\r
+      if options.with_elements\r
+        item.attributes = item.replaced_attributes({hold: true})\r
+      @trigger('retrieve', item)\r
+  \r