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