/*
 * call-seq:
 *   conn.external_encoding() -> Encoding
 *
 * defined in Ruby 1.9 or later.
 * * Returns the server_encoding of the connected database as a Ruby Encoding object.
 * * Maps 'SQL_ASCII' to ASCII-8BIT.
 */
static VALUE
pgconn_external_encoding(VALUE self)
{
    VALUE enc;
    enc = rb_iv_get(self, "@external_encoding");
    if (RTEST(enc)) {
        return enc;
    }
    else {
        int i;
        VALUE query = rb_usascii_str_new_cstr("SHOW server_encoding");
        VALUE pgresult = pgconn_exec(1, &query, self);
        VALUE enc_name = rb_ensure(enc_server_encoding_getvalue, pgresult, pgresult_clear, pgresult);

        if (strcmp("SQL_ASCII", StringValuePtr(enc_name)) == 0) {
            enc = rb_enc_from_encoding(rb_ascii8bit_encoding());
            goto cache;
        }
        for (i = 0; i < sizeof(enc_pg2ruby_mapping)/sizeof(enc_pg2ruby_mapping[0]); ++i) {
            if (strcmp(StringValuePtr(enc_name), enc_pg2ruby_mapping[i][0]) == 0) {
                enc = rb_enc_from_encoding(rb_enc_find(enc_pg2ruby_mapping[i][1]));
                goto cache;
            }
        }

        /* Ruby 1.9.1 does not supoort JOHAB */
        if (strcmp(StringValuePtr(enc_name), "JOHAB") == 0) {
            enc = rb_enc_from_encoding(find_or_create_johab());
            goto cache;
        }

        /* fallback */
        enc = rb_enc_from_encoding(rb_enc_find(StringValuePtr(enc_name)));
    }

cache:
    rb_iv_set(self, "@external_encoding", enc);
    return enc;
}