From: Georg Richter Date: Sun, 8 May 2005 08:39:56 +0000 (+0000) Subject: Added new function mysqli_set_character_set_name X-Git-Tag: php-5.0.1b1~285 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b654b20ef698999221f9faf8756803e0b21c241d;p=php Added new function mysqli_set_character_set_name --- diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index eddea9de37..df61d555e0 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -116,6 +116,9 @@ function_entry mysqli_functions[] = { PHP_FE(mysqli_rpl_probe, NULL) PHP_FE(mysqli_rpl_query_type, NULL) PHP_FE(mysqli_select_db, NULL) +#ifdef HAVE_MYSQLI_SET_CHARSET + PHP_FE(mysqli_set_character_set_name, NULL) +#endif PHP_FE(mysqli_stmt_attr_get, NULL) PHP_FE(mysqli_stmt_attr_set, NULL) PHP_FE(mysqli_stmt_field_count, NULL) @@ -214,6 +217,10 @@ function_entry mysqli_link_methods[] = { PHP_FALIAS(rpl_probe,mysqli_rpl_probe,NULL) PHP_FALIAS(rpl_query_type,mysqli_rpl_query_type,NULL) PHP_FALIAS(select_db,mysqli_select_db,NULL) +#ifdef HAVE_MYSQLI_SET_CHARSET + PHP_FALIAS(set_character_set_name,mysqli_set_character_set_name,NULL) + PHP_FALIAS(set_client_encoding,mysqli_set_character_set_name,NULL) +#endif PHP_FALIAS(set_opt, mysqli_options,NULL) PHP_FALIAS(slave_query,mysqli_slave_query,NULL) PHP_FALIAS(ssl_set,mysqli_ssl_set,NULL) diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 31d4c13723..169b3240b4 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -29,6 +29,8 @@ #include "ext/standard/info.h" #include "php_mysqli.h" +extern const char *charsets_dir; + /* {{{ proto object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]]) Open a connection to a mysql server */ PHP_FUNCTION(mysqli_connect) @@ -251,6 +253,51 @@ PHP_FUNCTION(mysqli_query) } /* }}} */ +#ifdef HAVE_MYSQLI_SET_CHARSET +/* {{{ proto bool mysqli_set_character_set_name(object link, string csname) + sets client character set */ +PHP_FUNCTION(mysqli_set_character_set_name) +{ + struct charset_info_st *cs; + const char *save_csdir = charsets_dir; + MY_MYSQL *mysql; + zval *mysql_link; + char *cs_name = NULL; + unsigned int len; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) { + return; + } + MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link"); + + if (mysql->mysql->options.charset_dir){ + charsets_dir = mysql->mysql->options.charset_dir; + } + + cs = get_charset_by_csname(cs_name, 1, MYF(0)); + + if (cs) { + char buff[MY_CS_NAME_SIZE + 10]; + charsets_dir = save_csdir; + sprintf(buff, "SET NAMES %s", cs_name); + if (!mysql_query(mysql->mysql, buff)) { + mysql->mysql->charset = cs; + RETURN_TRUE; + } + } else { + char cs_dir_name[FN_REFLEN]; + get_charsets_dir(cs_dir_name); + mysql->mysql->net.last_errno=CR_CANT_READ_CHARSET; + strcpy(mysql->mysql->net.sqlstate, "HY000"); + sprintf(mysql->mysql->net.last_error, "Can't initialize character set %-.32s (path: %-.100s)", + cs_name, cs_dir_name); + } + charsets_dir = save_csdir; + RETURN_FALSE; +} +/* }}} */ +#endif + /* * Local variables: * tab-width: 4 diff --git a/ext/mysqli/php_mysqli.h b/ext/mysqli/php_mysqli.h index b4589cca7d..d72b0a8dc0 100644 --- a/ext/mysqli/php_mysqli.h +++ b/ext/mysqli/php_mysqli.h @@ -25,6 +25,9 @@ #undef LIST #endif +#include +#include +#include #include #include @@ -99,7 +102,13 @@ typedef struct { #ifdef PHP_WIN32 #define PHP_MYSQLI_API __declspec(dllexport) +#if MYSQL_VERSION_ID > 50005 +#define HAVE_MYSQLI_SET_CHARSET +#elif MYSQL_VERSION_ID > 40110 && MYSQL_VERSION_ID < 50000 +#define HAVE_MYSQLI_SET_CHARSET +#endif #else +#define HAVE_MYSQLI_SET_CHARSET #define PHP_MYSQLI_API #endif @@ -293,6 +302,9 @@ PHP_FUNCTION(mysqli_affected_rows); PHP_FUNCTION(mysqli_autocommit); PHP_FUNCTION(mysqli_change_user); PHP_FUNCTION(mysqli_character_set_name); +#ifdef HAVE_MYSQLI_SET_CHARSET +PHP_FUNCTION(mysqli_set_character_set_name); +#endif PHP_FUNCTION(mysqli_close); PHP_FUNCTION(mysqli_commit); PHP_FUNCTION(mysqli_connect); diff --git a/ext/mysqli/tests/065.phpt b/ext/mysqli/tests/065.phpt new file mode 100644 index 0000000000..1645e9f818 --- /dev/null +++ b/ext/mysqli/tests/065.phpt @@ -0,0 +1,19 @@ +--TEST-- +set character set +--SKIPIF-- + +--FILE-- +set_client_encoding("utf8")) { + var_dump($mysql->client_encoding()); + } + $mysql->close(); +?> +--EXPECT-- +string(4) "utf8"