getline (PGconn)

    /*
     * call-seq:
     *    conn.getline()
     *
     * Reads a line from the backend server into internal buffer.
     * Returns +nil+ for EOF, +0+ for success, +1+ for buffer overflowed.
     * You need to ensure single "." from backend to confirm  transmission completion.
     * The sample program <tt>psql.rb</tt> (see source for postgres) treats this copy protocol right.
     */
    static VALUE
    pgconn_getline(obj)
        VALUE obj;
    {
        PGconn *conn = get_pgconn(obj);
        VALUE str;
        long size = BUFSIZ;
        long bytes = 0;
        int  ret;

        str = rb_tainted_str_new(0, size);

        for (;;) {
            ret = PQgetline(conn, RSTRING(str)->ptr + bytes, size - bytes);
            switch (ret) {
            case EOF:
              return Qnil;
            case 0:
              rb_str_resize(str, strlen(StringValuePtr(str)));
              return str;
            }
            bytes += BUFSIZ;
            size += BUFSIZ;
            rb_str_resize(str, size);
        }
        return Qnil;
    }