/*
* 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.
*
* NOTE: this does *not* set the connection's +client_encoding+ for you if
* Encoding.default_internal is set. To set it after the connection is established,
* call PGconn#internal_encoding=. You can also set it automatically by setting
* ENV['PGCLIENTENCODING'], or include the 'options' connection parameter.
*
*/
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 = rb_funcall2( rb_cPGconn, rb_intern("parse_connect_args"), argc, argv );
conn = PQconnectStart(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;
}