OSDN Git Service

7dd14af20be96d56c359881b059718abe3af1124
[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   refresh: (item) ->\r
53     @restore(item.cache_key()).fetch()\r
54     #if item.expire_time\r
55     #  if Date.now() >= return_items.expire_time\r
56     #    @sync(item)\r
57     #item\r
58   \r
59   sync: (item) ->\r
60     item.fetch().done =>\r
61       item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
62   \r
63 class Pettanr.Cache.Retriever\r
64   \r
65   constructor: (@model, @id) ->\r
66     _.extend(this, Backbone.Events)\r
67   \r
68   retrieve: (force) ->\r
69     empty_item = new @model({id: @id})\r
70     if force\r
71       # query (ex: folders/3?watch)\r
72       @retrieve_force(empty_item)\r
73     else if @id\r
74       # existence item\r
75       item = Pettanr.cache.restore(empty_item)\r
76       if item\r
77         @trigger('retrieve', item)\r
78       else\r
79         empty_item.fetch().done =>\r
80           Pettanr.cache.store(empty_item)\r
81           @trigger('retrieve', empty_item)\r
82     else\r
83       # new item\r
84       @trigger('retrieve', empty_item)\r
85   \r
86   retrieve_force: (item) ->\r
87     item.fetch().done =>\r
88       @trigger('retrieve', item)\r
89   \r
90   edit: (options = {}) ->\r
91     empty_item = new @model({id: @id})\r
92     item = empty_item.hold()\r
93     if options.with_elements\r
94       item = item.with_elements()\r
95     item.fetch().done =>\r
96       if options.with_elements\r
97         item.attributes = item.replaced_attributes({hold: true})\r
98       @trigger('retrieve', item)\r
99   \r