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