void encode_result(ei_x_buff* x, PGresult* res, PGconn* conn) { int row, n_rows, col, n_cols; switch (PQresultStatus(res)) { case PGRES_TUPLES_OK: n_rows = PQntuples(res); n_cols = PQnfields(res); ei_x_encode_tuple_header(x, 2); encode_ok(x); ei_x_encode_list_header(x, n_rows+1); ei_x_encode_list_header(x, n_cols); for (col = 0; col < n_cols; ++col) { ei_x_encode_string(x, PQfname(res, col)); } ei_x_encode_empty_list(x); for (row = 0; row < n_rows; ++row) { ei_x_encode_list_header(x, n_cols); for (col = 0; col < n_cols; ++col) { ei_x_encode_string(x, PQgetvalue(res, row, col)); } ei_x_encode_empty_list(x); } ei_x_encode_empty_list(x); break; case PGRES_COMMAND_OK: ei_x_encode_tuple_header(x, 2); encode_ok(x); ei_x_encode_string(x, PQcmdTuples(res)); break; default: encode_error(x, conn); break; } }
static int do_disconnect(our_data_t* data) { ei_x_buff x; if (data->socket == 0) return 0; driver_select(data->port, (ErlDrvEvent)data->socket, DO_READ, 0); data->socket = 0; PQfinish(data->conn); data->conn = NULL; ei_x_new_with_version(&x); encode_ok(&x); driver_output(data->port, x.buff, x.index); ei_x_free(&x); return 0; }
static int do_connect(const char *s, our_data_t* data) { ei_x_buff x; PGconn* conn = PQconnectdb(s); ei_x_new_with_version(&x); if (PQstatus(conn) != CONNECTION_OK) { encode_error(&x, conn); PQfinish(conn); conn = NULL; } else { encode_ok(&x); data->socket = PQsocket(conn); driver_select(data->port, (ErlDrvEvent)data->socket, DO_READ, 1); } driver_output(data->port, x.buff, x.index); ei_x_free(&x); data->conn = conn; return 0; }