/*
 * call-seq:
 *   conn.lastval -> Integer
 *
 * Returns the sequence value returned by the last call to the PostgreSQL function <tt>nextval(sequence_name)</tt>. Equivalent to <tt>conn.query('select lastval()').first.first</tt>.
 *
 * This functionality is only available with PostgreSQL 8.1 and newer.
 * See the PostgreSQL documentation on lastval[http://www.postgresql.org/docs/current/interactive/functions-sequence.html] for more information.
 */
static VALUE
pgconn_lastval(obj)
    VALUE obj;
{
    PGconn *conn = get_pgconn(obj);
    PGresult *result;
    VALUE lastval, error;

    result = PQexec(conn, "select lastval()");
    if (!result) rb_raise(rb_ePGError, PQerrorMessage(conn));

    switch (PQresultStatus(result)) {
    case PGRES_TUPLES_OK:
      lastval = rb_cstr2inum(PQgetvalue(result, 0, 0), 10);
      PQclear(result);
      return lastval;

    case PGRES_BAD_RESPONSE:
    case PGRES_FATAL_ERROR:
    case PGRES_NONFATAL_ERROR:
      error = rb_str_new2(PQresultErrorMessage(result));
      PQclear(result);
      rb_raise(rb_ePGError, StringValuePtr(error));

    default:
      PQclear(result);
      rb_raise(rb_ePGError, "unknown lastval");
    }
}