#--
# 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.
#++
require 'rubygems'
require 'active_record'
#= 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
end
if !ActiveRecord::Base.connected?
begin
possible_config_files = [
"./config/database.yml",
"./database.yml",
"../config/database.yml",
"../database.yml",
"../../config/database.yml",
"../../database.yml",
"../../../config/database.yml",
"../../../database.yml"
]
database_config_file = nil
for file in possible_config_files
if File.exists?(File.expand_path(file))
database_config_file = file
@config_path = database_config_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 the path to the database.yml config file that FeedTools loaded.
def DatabaseFeedCache.config_path
if !defined?(@config_path) || @config_path.blank?
@config_path = nil
end
return @config_path
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.select_one("select id, href, title, " +
"link, feed_data, feed_data_type, http_headers, last_retrieved " +
"from #{self.table_name()}")
rescue ActiveRecord::StatementInvalid
return false
rescue
return false
end
return true
end
end
end