/*
 * call-seq:
 *    PGconn.conndefaults() -> Array
 *
 * Returns an array of hashes. Each hash has the keys:
 * [+:keyword+]
 *   the name of the option
 * [+:envvar+]
 *   the environment variable to fall back to
 * [+:compiled+]
 *   the compiled in option as a secondary fallback
 * [+:val+]
 *   the option's current value, or +nil+ if not known
 * [+:label+]
 *   the label for the field
 * [+:dispchar+]
 *   "" for normal, "D" for debug, and "*" for password
 * [+:dispsize+]
 *   field size
 */
static VALUE
pgconn_s_conndefaults(VALUE self)
{
    PQconninfoOption *options = PQconndefaults();
    VALUE ary = rb_ary_new();
    VALUE hash;
    int i = 0;
    
    for(i = 0; options[i].keyword != NULL; i++) {
        hash = rb_hash_new();
        if(options[i].keyword)
            rb_hash_aset(hash, ID2SYM(rb_intern("keyword")), 
                rb_str_new2(options[i].keyword));
        if(options[i].envvar)
            rb_hash_aset(hash, ID2SYM(rb_intern("envvar")), 
                rb_str_new2(options[i].envvar));
        if(options[i].compiled)
            rb_hash_aset(hash, ID2SYM(rb_intern("compiled")), 
                rb_str_new2(options[i].compiled));
        if(options[i].val)
            rb_hash_aset(hash, ID2SYM(rb_intern("val")), 
                rb_str_new2(options[i].val));
        if(options[i].label)
            rb_hash_aset(hash, ID2SYM(rb_intern("label")), 
                rb_str_new2(options[i].label));
        if(options[i].dispchar)
            rb_hash_aset(hash, ID2SYM(rb_intern("dispchar")), 
                rb_str_new2(options[i].dispchar));
        rb_hash_aset(hash, ID2SYM(rb_intern("dispsize")), 
            INT2NUM(options[i].dispsize));
        rb_ary_push(ary, hash);
    }
    PQconninfoFree(options);
    return ary;
}