OSDN Git Service

fix: fetch err
[pettanr/pettanr.git] / app / assets / javascripts / pettanr / cache.js.coffee
1 class Pettanr.Cache\r
2   \r
3   constructor: (options) ->\r
4     @operators = options.operators\r
5     @data = {}\r
6     @holds = {}\r
7     _.extend(this, Backbone.Events)\r
8   \r
9   # return cached items\r
10   store: (items) ->\r
11     if _.isArray(items)\r
12       return_items = _.map items, (item) =>\r
13         r = @restore(item.cache_key())\r
14         r = @store(item) if !r\r
15         r\r
16     else\r
17       item = items\r
18       cached_item = @restore(item.cache_key())\r
19       return_items = if cached_item\r
20         cached_item  # merge?\r
21       else\r
22         @data[item.cache_key()] = item\r
23       # @refresh(return_items)\r
24     return_items\r
25   \r
26   restore: (key) ->\r
27     k = if _.isString(key)\r
28       key\r
29     else\r
30       key.cache_key()\r
31     item = @data[k]\r
32     #if item\r
33     #  @refresh(item)\r
34   \r
35   is_hold: (item) ->\r
36     if @holds[item.cache_key()]\r
37       true\r
38     else\r
39       false\r
40   \r
41   hold: (item) ->\r
42     return @holds[item.cache_key()] if @holds[item.cache_key()]\r
43     @holds[item.cache_key()] = item.clone()\r
44   \r
45   fix: (item) ->\r
46     delete @holds[item.cache_key()]\r
47     @restore(item).fetch()\r
48   \r
49   release: (item) ->\r
50     delete @holds[item.cache_key()]\r
51   \r
52   free: (item) ->\r
53     delete @data[item.cache_key()]\r
54   \r
55   refresh: (item) ->\r
56     @restore(item.cache_key()).fetch()\r
57     #if item.expire_time\r
58     #  if Date.now() >= return_items.expire_time\r
59     #    @sync(item)\r
60     #item\r
61   \r
62   sync: (item) ->\r
63     item.fetch({\r
64       success: (model, response, opt) =>\r
65         item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
66       error: (model, response, opt) =>\r
67         @trigger('fail', response, opt)\r
68     })\r
69   \r
70 class Pettanr.Cache.Retriever\r
71   \r
72   constructor: (@model, @id) ->\r
73     _.extend(this, Backbone.Events)\r
74   \r
75   retrieve: (force) ->\r
76     empty_item = new @model({id: @id})\r
77     if force\r
78       # query (ex: folders/3?watch)\r
79       @retrieve_force(empty_item)\r
80     else if @id\r
81       # existence item\r
82       item = Pettanr.cache.restore(empty_item)\r
83       if item\r
84         @trigger('retrieve', item)\r
85       else\r
86         empty_item.fetch({\r
87           success: (model, response, opt) =>\r
88             Pettanr.cache.store(empty_item)\r
89             @trigger('retrieve', empty_item)\r
90           error: (model, response, opt) =>\r
91             @trigger('fail', response, opt)\r
92         })\r
93     else\r
94       # new item\r
95       @trigger('retrieve', empty_item)\r
96   \r
97   retrieve_force: (item) ->\r
98     item.fetch({\r
99       success: (model, response, opt) =>\r
100         @trigger('retrieve', item)\r
101       error: (model, response, opt) =>\r
102         @trigger('fail', response, opt)\r
103     })\r
104   \r
105   edit: (options = {}) ->\r
106     empty_item = new @model({id: @id})\r
107     item = empty_item.hold()\r
108     item.fetch({\r
109       success: (model, response, opt) =>\r
110         @trigger('retrieve', item)\r
111       error: (model, response, opt) =>\r
112         @trigger('fail', response, opt)\r
113     })\r
114   \r