class Amalgalite::Requires
Requires encapsulates requiring items from the database
Attributes
Public Class Methods
Allocate a database connection to the given filename. For file databases, this means giving the same connection back if you ask for a connection to the same file. For in-memory databases, you get a new one each time.
# File lib/amalgalite/requires.rb, line 26 def db_connection_to( dbfile_name ) if dbfile_name == ":memory:" return ::Amalgalite::Database.new( dbfile_name ) else unless connection = load_path_db_connections[ dbfile_name ] connection = ::Amalgalite::Database.new( dbfile_name ) load_path_db_connections[dbfile_name] = connection end return connection end end
# File lib/amalgalite/requires.rb, line 16 def load_path @load_path ||= [] end
# File lib/amalgalite/requires.rb, line 12 def load_path_db_connections @load_path_db_connections ||= {} end
# File lib/amalgalite/requires.rb, line 74 def initialize( opts = {} ) @dbfile_name = opts[:dbfile_name] || Bootstrap::DEFAULT_DB @table_name = opts[:table_name] || Bootstrap::DEFAULT_TABLE @filename_column = opts[:filename_column] || Bootstrap::DEFAULT_FILENAME_COLUMN @contents_column = opts[:contents_column] || Bootstrap::DEFAULT_CONTENTS_COLUMN @compressed_column = opts[:compressed_column] || Bootstrap::DEFAULT_COMPRESSED_COLUMN @db_connection = Requires.db_connection_to( dbfile_name ) Requires.load_path << self end
# File lib/amalgalite/requires.rb, line 46 def require( filename ) if load_path.empty? then raise ::LoadError, "Amalgalite load path is empty -- #{filename}" elsif $LOADED_FEATURES.include?( filename ) then return false elsif Requires.requiring.include?( filename ) then return false else Requires.requiring << filename load_path.each do |lp| if lp.require( filename ) then Requires.requiring.delete( filename ) return true end end Requires.requiring.delete( filename ) raise ::LoadError, "amalgalite has no such file to load -- #{filename}" end end
Setting a class level variable as a flag to know what we are currently in the middle of requiring
# File lib/amalgalite/requires.rb, line 42 def requiring @requiring ||= [] end
Public Instance Methods
Return the contents of the named file.
# File lib/amalgalite/requires.rb, line 125 def file_contents(filename) rows = db_connection.execute(sql, filename) if rows.size > 0 then row = rows.first contents = row[contents_column].to_s if row[compressed_column] then contents = ::Amalgalite::Packer.gunzip( contents ) end return contents else return nil end end
Import an SQL dump into the fake file system.
# File lib/amalgalite/requires.rb, line 145 def import(sql) db_connection.import(sql) end
load a file in this database table. This will check and see if the file is already required. If it isn't it will select the contents associated with the row identified by the filename and eval those contents within the context of TOPLEVEL_BINDING. The filename is then appended to $LOADED_FEATURES.
if the file was required then true is returned, otherwise false
# File lib/amalgalite/requires.rb, line 100 def require( filename ) if $LOADED_FEATURES.include?( filename ) then return false else begin filename = filename.gsub(/\.rb\Z/,'') contents = file_contents(filename) if contents eval( contents, TOPLEVEL_BINDING, filename ) $LOADED_FEATURES << filename return true else return false end rescue => e raise ::LoadError, "Failure loading #{filename} from #{dbfile_name} : #{e}" end end end
return the sql to find the file contents for a file in this requires
# File lib/amalgalite/requires.rb, line 87 def sql @sql ||= "SELECT #{filename_column}, #{compressed_column}, #{contents_column} FROM #{table_name} WHERE #{filename_column} = ?" end