syntax error
[opensuse:yast-rest-service.git] / webservice / lib / yast_cache.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 require 'digest/md5'
20
21 class YastCache
22
23   def YastCache.reset(key, delay = 0)
24     Rails.cache.delete(key)
25     Delayed::Job.enqueue(PluginJob.new(key),0, (delay).seconds.from_now )
26   end
27     
28   def YastCache.fetch(key, options = {})
29     job_delay = 3
30     raised_exception = nil
31     re_load = Rails.cache.exist?(key) ?  true : false
32     if  block_given?
33       ret = Rails.cache.fetch(key, options) {
34         block_ret = nil
35         begin
36           block_ret = yield
37           if block_ret == nil
38             #no data found -> remove entry from the cache table
39             cache_data = DataCache.all(:conditions => "path = '#{key}'")
40             cache_data.each { |cache|
41               cache.destroy
42             } unless cache_data.blank? 
43           else
44             #update MD5 if needed
45             md5 = Digest::MD5.hexdigest(block_ret.to_json)
46             cache_data = DataCache.all(:conditions => "path = '#{key}' AND ( refreshed_md5 is NULL OR refreshed_md5 != '#{md5}')")
47             cache_data.each { |cache|
48               cache.refreshed_md5 = md5
49               cache.picked_md5 = md5 if cache.picked_md5.blank?
50               cache.save
51             } unless cache_data.blank? 
52           end
53         rescue Exception => raised_exception
54           Rails.logger.error "YastCache.fetch(#{key}) failed: #{raised_exception.inspect}"        
55           Rails.logger.error "Trying again in #{job_delay} seconds" if re_load
56         end
57         block_ret
58       }
59     else
60       ret = Rails.cache.fetch(key, options)
61     end
62     YastCache.reset(key,job_delay) if re_load #add reload into the job queue
63     raise raised_exception unless raised_exception.nil? #raising exception to the next level
64     ret
65   end
66 end
67