]> granicus.if.org Git - php/commitdiff
Added new function mysqli_set_character_set_name
authorGeorg Richter <georg@php.net>
Sun, 8 May 2005 08:39:56 +0000 (08:39 +0000)
committerGeorg Richter <georg@php.net>
Sun, 8 May 2005 08:39:56 +0000 (08:39 +0000)
ext/mysqli/mysqli_fe.c
ext/mysqli/mysqli_nonapi.c
ext/mysqli/php_mysqli.h
ext/mysqli/tests/065.phpt [new file with mode: 0644]

index eddea9de37a63c7997ef2a06989eee97d365c686..df61d555e093af250495599cdbf6ea88ea57d262 100644 (file)
@@ -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)
index 31d4c1372387bef94031e13c71cf7fb109c7dd89..169b3240b4790c6aab9f1aca1fbb216ec2d71a60 100644 (file)
@@ -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
index b4589cca7d4b28841a095fe1bfa5adaf20fdb537..d72b0a8dc037dd7ca80f4c9a6ca02efce9d8b49b 100644 (file)
@@ -25,6 +25,9 @@
 #undef LIST
 #endif
 
+#include <my_global.h>
+#include <my_sys.h>
+#include <m_ctype.h>
 #include <mysql.h>
 #include <errmsg.h>
 
@@ -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 (file)
index 0000000..1645e9f
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+set character set 
+--SKIPIF--
+<?php 
+require_once('skipif.inc'); 
+?>
+--FILE--
+<?php
+       include "connect.inc";
+
+       $mysql = new mysqli($host, $user, $passwd);
+
+       if ($mysql->set_client_encoding("utf8")) {
+               var_dump($mysql->client_encoding());
+       }
+       $mysql->close();
+?>
+--EXPECT--
+string(4) "utf8"