/*
 * 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;
}