# File vapor/repositorymgr.rb, line 127 def initialize( db_spec, user, pass, check_repository = true ) raise TypeError unless db_spec.is_a? String and user.is_a? String and pass.is_a? String # check for validity of database-specifier database = db_spec.split(':') raise TypeError, "invalid db_spec" unless database.size == 3 or database.size == 4 raise TypeError, "invalid database driver" unless database[0] == 'pg' # currently only know PostgreSQL # connect to database driver_url = database.unshift( 'DBI' ).join(':') begin @dbh = DBI.connect( driver_url, user, pass ) rescue DBI::OperationalError => e raise RepositoryOfflineError, e.message end # check PostgreSQL version @psql_version = @dbh.execute('SELECT version()').fetch[0] @psql_version = /^PostgreSQL ([\d\.]+)/.match( @psql_version )[1] # initialize some instance variables @known_klasses = nil @oid_gen = OIDGenerator.new @oid_gen.high_source = self @repository_ok = false # silence PostgreSQL >= 7.3 when creating tables if @psql_version >= "7.3" then @dbh.execute( 'SET CLIENT_MIN_MESSAGES TO ERROR ' ) end # make sure that the database looks like a repository return if !check_repository result = @dbh.execute( "SELECT relname FROM pg_class WHERE relname LIKE ':Vapor::%' AND relkind = 'r'") result = result.fetch_all if result.size != 5 then raise BackendInconsistentError, "database does not seem to be a valid repository," else result.each{|row| if ![":Vapor::AttributeMetaData",":Vapor::ClassMetaData",":Vapor::ObjectList", ":Vapor::RepositoryInfo", ":Vapor::TransactionLog"].include? row[0] then raise BackendInconsistentError, "database does not seem to be a valid repository" end } end @repository_ok = true end