OSDN Git Service

fix:err dialog
[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().done =>\r
64       item.expire_time.setTime(Date.now() + 10 * 60 * 1000)\r
65   \r
66 class Pettanr.Cache.Retriever\r
67   \r
68   constructor: (@model, @id) ->\r
69     _.extend(this, Backbone.Events)\r
70   \r
71   retrieve: (force) ->\r
72     empty_item = new @model({id: @id})\r
73     if force\r
74       # query (ex: folders/3?watch)\r
75       @retrieve_force(empty_item)\r
76     else if @id\r
77       # existence item\r
78       item = Pettanr.cache.restore(empty_item)\r
79       if item\r
80         @trigger('retrieve', item)\r
81       else\r
82         empty_item.fetch({\r
83           success: (model, response, opt) =>\r
84             Pettanr.cache.store(empty_item)\r
85             @trigger('retrieve', empty_item)\r
86           error: (model, response, opt) =>\r
87             @trigger('fail', response, opt)\r
88         })\r
89     else\r
90       # new item\r
91       @trigger('retrieve', empty_item)\r
92   \r
93   retrieve_force: (item) ->\r
94     item.fetch().done =>\r
95       @trigger('retrieve', item)\r
96   \r
97   edit: (options = {}) ->\r
98     empty_item = new @model({id: @id})\r
99     item = empty_item.hold()\r
100     if options.with_elements\r
101       item = item.with_elements()\r
102     item.fetch().done =>\r
103       if options.with_elements\r
104         item.attributes = item.replaced_attributes({hold: true})\r
105       @trigger('retrieve', item)\r
106   \r