OSDN Git Service

change: cache
[pettanr/pettanr.git] / app / assets / javascripts / pettanr / cache.js.coffee
1 class Pettanr.Cache\r
2   \r
3   constructor: (options) ->\r
4     @data = {}\r
5     @holds = {}\r
6     _.extend(this, Backbone.Events)\r
7   \r
8   # return cached items\r
9   store: (items) ->\r
10     if _.isArray(items)\r
11       return_items = _.map items, (item) =>\r
12         r = @restore(item.cache_key())\r
13         r = @store(item) if !r\r
14         r\r
15     else\r
16       item = items\r
17       cached_item = @restore(item.cache_key())\r
18       return_items = if cached_item\r
19         cached_item  # merge?\r
20       else\r
21         @data[item.cache_key()] = item\r
22       @refresh(return_items)\r
23     return_items\r
24   \r
25   restore: (key) ->\r
26     k = if _.isString(key)\r
27       key\r
28     else\r
29       key.cache_key()\r
30     item = @data[k]\r
31     #if item\r
32     #  @refresh(item)\r
33   \r
34   is_hold: (item) ->\r
35     if @holds[item.cache_key()]\r
36       true\r
37     else\r
38       false\r
39   \r
40   hold: (item) ->\r
41     return @holds[item.cache_key()] if @holds[item.cache_key()]\r
42     @holds[item.cache_key()] = item.clone()\r
43   \r
44   release: (item) ->\r
45     @data[item.cache_key()] = item  # overwrite\r
46     delete @holds[item.cache_key()]\r
47   \r
48   refresh: (item) ->\r
49     if item.expire_time\r
50       if Date.now() >= return_items.expire_time\r
51         @sync(item)\r
52     item\r
53   \r
54   sync: (item) ->\r
55     item.fetch().done =>\r
56       item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
57   \r
58 class Pettanr.Cache.Retriever\r
59   \r
60   constructor: (@model, @id) ->\r
61     _.extend(this, Backbone.Events)\r
62   \r
63   retrieve: (force) ->\r
64     empty_item = new @model({id: @id})\r
65     if force\r
66       # query\r
67       empty_item.fetch().done =>\r
68         @trigger('retrieve', empty_item)\r
69     else if @id\r
70       # existence item\r
71       item = Pettanr.cache.restore(empty_item)\r
72       if item\r
73         @trigger('retrieve', item)\r
74       else\r
75         empty_item.fetch().done =>\r
76           Pettanr.cache.store(empty_item)\r
77           @trigger('retrieve', empty_item)\r
78     else\r
79       # new item\r
80       @trigger('retrieve', empty_item)\r
81   \r
82   edit: (model, id) ->\r
83     empty_item = new @model({id: @id})\r
84     item = Pettanr.cache.hold(empty_item)\r
85     item.fetch().done =>\r
86       @item.attributes = @item.replaced_attributes()\r
87       @trigger('retrieve', item)\r
88  \r