/*
* call-seq:
* conn.internal_encoding = value
*
* A wrapper of +PGconn#set_client_encoding+.
* defined in Ruby 1.9 or later.
*
* +value+ can be one of:
* * an Encoding
* * a String - a name of Encoding
* * +nil+ - sets 'SQL_ASCII' to the client_encoding.
*/
static VALUE
pgconn_internal_encoding_set(VALUE self, VALUE enc)
{
if (NIL_P(enc)) {
pgconn_set_client_encoding(self, rb_usascii_str_new_cstr("SQL_ASCII"));
return enc;
}
else if (TYPE(enc) == T_STRING && strcasecmp("JOHAB", RSTRING_PTR(enc)) == 0) {
pgconn_set_client_encoding(self, rb_usascii_str_new_cstr("JOHAB"));
return enc;
}
else {
int i;
const char *name;
name = rb_enc_name(rb_to_encoding(enc));
/* sequential search becuase rarely called */
for (i = 0; i < sizeof(enc_pg2ruby_mapping)/sizeof(enc_pg2ruby_mapping[0]); ++i) {
if (strcmp(name, enc_pg2ruby_mapping[i][1]) == 0) {
if (PQsetClientEncoding(get_pgconn(self), enc_pg2ruby_mapping[i][0]) == -1) {
VALUE server_encoding = pgconn_external_encoding(self);
rb_raise(rb_eEncCompatError, "imcompatible character encodings: %s and %s",
rb_enc_name(rb_to_encoding(server_encoding)),
enc_pg2ruby_mapping[i][0]);
}
return enc;
}
}
/* Ruby 1.9.1 does not support JOHAB */
if (strcasecmp(name, "JOHAB") == 0) {
pgconn_set_client_encoding(self, rb_usascii_str_new_cstr("JOHAB"));
return enc;
}
}
enc = rb_inspect(enc);
rb_raise(rb_ePGError, "unknown encoding: %s", StringValuePtr(enc));
}