connect_start (PGconn)

    /*
     * call-seq:
     *    PGconn.connect_start(connection_hash) -> PGconn
     *    PGconn.connect_start(connection_string) -> PGconn
     *    PGconn.connect_start(host, port, options, tty, dbname, login, password) ->  PGconn
     *
     * This is an asynchronous version of PGconn.connect().
     *
     * Use PGconn#connect_poll to poll the status of the connection.
     */
    static VALUE
    pgconn_s_connect_start(int argc, VALUE *argv, VALUE self)
    {
            PGconn *conn = NULL;
            VALUE rb_conn;
            VALUE conninfo;
            VALUE error;

            /*
             * PGconn.connect_start must act as both alloc() and initialize()
             * because it is not invoked by calling new().
             */
            rb_conn = pgconn_alloc(rb_cPGconn);

            conninfo = parse_connect_args(argc, argv, self);
            conn = PQconnectdb(StringValuePtr(conninfo));

            if(conn == NULL)
                    rb_raise(rb_ePGError, "PQconnectStart() unable to allocate structure");
            if (PQstatus(conn) == CONNECTION_BAD) {
                    error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
                    rb_iv_set(error, "@connection", self);
                    rb_exc_raise(error);
            }

            Check_Type(rb_conn, T_DATA);
            DATA_PTR(rb_conn) = conn;

            if (rb_block_given_p()) {
                    return rb_ensure(rb_yield, self, pgconn_finish, self);
            }
            return rb_conn;
    }