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