/*
 * call-seq:
 *    conn.escape_string( str ) -> String
 *    PGconn.escape_string( str ) -> String  # DEPRECATED
 *
 * Connection instance method for versions of 8.1 and higher of libpq
 * uses PQescapeStringConn, which is safer. Avoid calling as a class method,
 * the class method uses the deprecated PQescapeString() API function.
 * 
 * Returns a SQL-safe version of the String _str_.
 * This is the preferred way to make strings safe for inclusion in 
 * SQL queries.
 * 
 * Consider using exec_params, which avoids the need for passing values 
 * inside of SQL commands.
 *
 * Encoding of escaped string will be equal to client encoding of connection.
 */
static VALUE
pgconn_s_escape(VALUE self, VALUE string)
{
        char *escaped;
        int size,error;
        VALUE result;
#ifdef M17N_SUPPORTED   
        rb_encoding* enc;
#endif

        Check_Type(string, T_STRING);

        escaped = ALLOC_N(char, RSTRING_LEN(string) * 2 + 1);
        if(rb_obj_class(self) == rb_cPGconn) {
                size = PQescapeStringConn(get_pgconn(self), escaped, 
                        RSTRING_PTR(string), RSTRING_LEN(string), &error);
                if(error) {
                        xfree(escaped);
                        rb_raise(rb_ePGError, "%s", PQerrorMessage(get_pgconn(self)));
                }
        } else {
                size = PQescapeString(escaped, RSTRING_PTR(string),
                        RSTRING_LEN(string));
        }
        result = rb_str_new(escaped, size);
        xfree(escaped);
        OBJ_INFECT(result, string);

#ifdef M17N_SUPPORTED
        if(rb_obj_class(self) == rb_cPGconn) {
                enc = pgconn_get_client_encoding_as_rb_encoding(get_pgconn(self));
        } else {
                enc = rb_enc_get(string);
        }
        rb_enc_associate(result, enc);
#endif

        return result;
}