print (PGresult)

    /*
     * call-seq:
     *    res.print( file, opt )
     *
     * MISSING: Documentation
     */
    static VALUE
    pgresult_print(obj, file, opt)
        VALUE obj, file, opt;
    {
        VALUE value;
        ID mem;
        OpenFile* fp;
        PQprintOpt po;

        Check_Type(file, T_FILE);
        Check_Type(opt,  T_STRUCT);
        GetOpenFile(file, fp);

        memset(&po, 0, sizeof(po));

        mem = rb_intern("header");
        value = rb_struct_getmember(opt, mem);
        po.header = value == Qtrue ? 1 : 0;

        mem = rb_intern("align");
        value = rb_struct_getmember(opt, mem);
        po.align = value == Qtrue ? 1 : 0;

        mem = rb_intern("standard");
        value = rb_struct_getmember(opt, mem);
        po.standard = value == Qtrue ? 1 : 0;

        mem = rb_intern("html3");
        value = rb_struct_getmember(opt, mem);
        po.html3 = value == Qtrue ? 1 : 0;

        mem = rb_intern("expanded");
        value = rb_struct_getmember(opt, mem);
        po.expanded = value == Qtrue ? 1 : 0;

        mem = rb_intern("pager");
        value = rb_struct_getmember(opt, mem);
        po.pager = value == Qtrue ? 1 : 0;

        mem = rb_intern("fieldSep");
        value = rb_struct_getmember(opt, mem);
        if (!NIL_P(value)) {
            Check_Type(value, T_STRING);
            po.fieldSep = StringValuePtr(value);
        }

        mem = rb_intern("tableOpt");
        value = rb_struct_getmember(opt, mem);
        if (!NIL_P(value)) {
            Check_Type(value, T_STRING);
            po.tableOpt = StringValuePtr(value);
        }

        mem = rb_intern("caption");
        value = rb_struct_getmember(opt, mem);
        if (!NIL_P(value)) {
            Check_Type(value, T_STRING);
            po.caption = StringValuePtr(value);
        }

        PQprint(fp->f2?fp->f2:fp->f, get_pgresult(obj), &po);
        return obj;
    }