#-- # Copyright (c) 2005 Robert Aman # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #++ #= database_feed_cache.rb # # The DatabaseFeedCache is the default caching mechanism for # FeedTools. This mechanism can be replaced easily by creating another # class with the required set of methods and setting # FeedTools#feed_cache to the new class. module FeedTools # The default caching mechanism for the FeedTools module class DatabaseFeedCache < ActiveRecord::Base # Overrides the default table name to use the "feeds" table. set_table_name("cached_feeds") # If ActiveRecord is not already connected, attempts to find a configuration file and use # it to open a connection for ActiveRecord. # This method is probably unnecessary for anything but testing and debugging purposes. # In a Rails environment, the connection will already have been established # and this method will simply do nothing. # # This method should not raise any exceptions because it's designed to be run only when # the module is first loaded. If it fails, the user should get an exception when they # try to perform some action that makes use of the caching functionality, and not until. def DatabaseFeedCache.initialize_cache # Establish a connection if we don't already have one begin ActiveRecord::Base.default_timezone = :utc ActiveRecord::Base.connection rescue begin possible_config_files = [ "./config/database.yml", "../config/database.yml", "./database.yml", "../database.yml", "../../database.yml" ] database_config_file = nil for file in possible_config_files if File.exists? file database_config_file = file break end end database_config_hash = File.open(database_config_file) do |file| config_hash = YAML::load(file) unless config_hash[FEED_TOOLS_ENV].nil? config_hash = config_hash[FEED_TOOLS_ENV] end config_hash end ActiveRecord::Base.configurations = database_config_hash ActiveRecord::Base.establish_connection(database_config_hash) ActiveRecord::Base.connection rescue end end return nil end # Returns true if a connection to the database has been established and the # required table structure is in place. def DatabaseFeedCache.connected? begin ActiveRecord::Base.connection return false if ActiveRecord::Base.configurations.nil? return false unless DatabaseFeedCache.table_exists? rescue => error return false end return true end # False if there is an error of any kind def DatabaseFeedCache.set_up_correctly? begin ActiveRecord::Base.connection if !ActiveRecord::Base.configurations.nil? && !DatabaseFeedCache.table_exists? return false end rescue Exception return false end return true end # True if the appropriate database table already exists def DatabaseFeedCache.table_exists? begin ActiveRecord::Base.connection.execute "select id, href, title, " + "link, feed_data, feed_data_type, http_headers, last_retrieved " + "from #{self.table_name()} limit 1" rescue ActiveRecord::StatementInvalid return false rescue return false end return true end end end