1219: def initialize(options)
1220: super()
1221: options.each do |key, value|
1222: case key
1223: when :engine
1224: @engine = value.to_sym
1225: when :host
1226: @host = value.to_s.dup.freeze if value
1227: when :port
1228: @port = value.to_i
1229: when :options
1230: @options = options.to_s.dup.freeze if value
1231: when :db
1232: @dbname = value.to_s.dup.freeze if value
1233: when :user
1234: @login = value.to_s.dup.freeze if value
1235: when :pass
1236: @passwd = value.to_s.dup.freeze if value
1237: when :data_types
1238: @data_types = value.to_hash.dup.freeze if value
1239: else
1240: raise ArgumentError, "Unknown option '#{key}'."
1241: end
1242: end
1243: raise ArgumentError, "No engine selected." if @engine.nil?
1244: raise ArgumentError, "Engine '#{@engine}' not supported." unless @engine == :postgresql
1245: unless @data_types
1246: @data_types = {}
1247: options[:data_types] = {}
1248: connection = nil
1249: begin
1250: connection = FlexiRecord::Connection.new(options)
1251: connection.query('SELECT "oid", "typname" FROM "pg_type" WHERE typtype=$', 'b').each do |type_record|
1252: @data_types[type_record.oid.to_i] = type_record.typname.to_s.freeze
1253: end
1254: ensure
1255: connection.close if connection
1256: end
1257: options[:data_types] = @data_types.freeze
1258: end
1259: @backend_connection = PGconn.new(@host, @port, @options, nil, @dbname, @login, @passwd)
1260: @transaction_stacklevel = 0
1261: @isolation_level = nil
1262: nil
1263: end