]> granicus.if.org Git - php/commitdiff
Added charset support.
authorJoey Smith <joey@php.net>
Tue, 26 Jun 2001 20:56:03 +0000 (20:56 +0000)
committerJoey Smith <joey@php.net>
Tue, 26 Jun 2001 20:56:03 +0000 (20:56 +0000)
ext/sybase_ct/php_sybase_ct.c

index 3196b43d83447b5b3d2dcbcbf5cbf1f746775b11..93c941bf193e434cee8e3f854b805063d9bbd1a2 100644 (file)
@@ -84,7 +84,7 @@ zend_module_entry sybase_module_entry = {
 };
 
 ZEND_DECLARE_MODULE_GLOBALS(sybase)
-static CS_CONTEXT *context;
+/* static CS_CONTEXT *context; */
 
 #ifdef COMPILE_DL_SYBASE_CT
 ZEND_GET_MODULE(sybase)
@@ -378,8 +378,10 @@ PHP_RSHUTDOWN_FUNCTION(sybase)
 }
 
 
-static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char *user, char *passwd)
+static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char *user, char *passwd, char *charset)
 {
+       CS_LOCALE *tmp_locale;
+
        SybCtLS_FETCH();
 
        /* set a CS_CONNECTION record */
@@ -407,6 +409,24 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
                ct_con_props(sybase->connection, CS_SET, CS_HOSTNAME, SybCtG(hostname), CS_NULLTERM, NULL);
        }
 
+       if (charset) {
+               if (cs_loc_alloc(SybCtG(context), &tmp_locale)!=CS_SUCCEED) {
+                       php_error(E_WARNING,"Sybase: Unable to allocate locale information.");
+               } else {
+                       if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_LC_ALL, NULL, CS_NULLTERM, NULL)!=CS_SUCCEED) {
+                               php_error(E_WARNING,"Sybase: Unable to load default locale data.");
+                       } else {
+                               if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_SYB_CHARSET, charset, CS_NULLTERM, NULL)!=CS_SUCCEED) {
+                                       php_error(E_WARNING,"Sybase: Unable to update character set.");
+                               } else {
+                                       if (ct_con_props(sybase->connection, CS_SET, CS_LOC_PROP, tmp_locale, CS_UNUSED, NULL)!=CS_SUCCEED) {
+                                               php_error(E_WARNING,"Sybase: Unable to update connection properties.");
+                                       }
+                               }
+                       }
+               }
+       }
+
        sybase->valid = 1;
        sybase->dead = 0;
 
@@ -430,7 +450,7 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
 
 static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 {
-       char *user,*passwd,*host;
+       char *user,*passwd,*host,*charset;
        char *hashed_details;
        int hashed_details_length;
        sybase_link *sybase_ptr;
@@ -438,7 +458,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 
        switch(ZEND_NUM_ARGS()) {
                case 0: /* defaults */
-                       host=user=passwd=NULL;
+                       host=user=passwd=charset=NULL;
                        hashed_details_length=6+3;
                        hashed_details = (char *) emalloc(hashed_details_length+1);
                        strcpy(hashed_details, "sybase___");
@@ -451,10 +471,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                                }
                                convert_to_string(yyhost);
                                host = yyhost->value.str.val;
-                               user=passwd=NULL;
-                               hashed_details_length = yyhost->value.str.len+6+3;
+                               user=passwd=charset=NULL;
+                               hashed_details_length = yyhost->value.str.len+6+4;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
-                               sprintf(hashed_details, "sybase_%s__", yyhost->value.str.val);
+                               sprintf(hashed_details, "sybase_%s___", yyhost->value.str.val);
                        }
                        break;
                case 2: {
@@ -467,10 +487,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                                convert_to_string(yyuser);
                                host = yyhost->value.str.val;
                                user = yyuser->value.str.val;
-                               passwd=NULL;
-                               hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+6+3;
+                               passwd=charset=NULL;
+                               hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+6+4;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
-                               sprintf(hashed_details, "sybase_%s_%s_", yyhost->value.str.val, yyuser->value.str.val);
+                               sprintf(hashed_details, "sybase_%s_%s__", yyhost->value.str.val, yyuser->value.str.val);
                        }
                        break;
                case 3: {
@@ -485,9 +505,29 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                                host = yyhost->value.str.val;
                                user = yyuser->value.str.val;
                                passwd = yypasswd->value.str.val;
-                               hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+6+3;
+                               charset=NULL;
+                               hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+6+4;
+                               hashed_details = (char *) emalloc(hashed_details_length+1);
+                               sprintf(hashed_details, "sybase_%s_%s_%s_", yyhost->value.str.val, yyuser->value.str.val, yypasswd->value.str.val);
+                       }
+                       break;
+               case 4: {
+                               pval *yyhost,*yyuser,*yypasswd,*yycharset;
+
+                               if (getParameters(ht, 4, &yyhost, &yyuser, &yypasswd, &yycharset) == FAILURE) {
+                                       RETURN_FALSE;
+                               }
+                               convert_to_string(yyhost);
+                               convert_to_string(yyuser);
+                               convert_to_string(yypasswd);
+                               convert_to_string(yycharset);
+                               host = Z_STRVAL_P(yyhost);
+                               user = Z_STRVAL_P(yyuser);
+                               passwd = Z_STRVAL_P(yypasswd);
+                               charset = Z_STRVAL_P(yycharset);
+                               hashed_details_length = Z_STRLEN_P(yyhost)+Z_STRLEN_P(yyuser)+Z_STRLEN_P(yypasswd)+Z_STRLEN_P(yycharset)+6+4;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
-                               sprintf(hashed_details, "sybase_%s_%s_%s", yyhost->value.str.val, yyuser->value.str.val, yypasswd->value.str.val); /* SAFE */
+                               sprintf(hashed_details, "sybase_%s_%s_%s_%s", Z_STRVAL_P(yyhost), Z_STRVAL_P(yyuser), Z_STRVAL_P(yypasswd), Z_STRVAL_P(yycharset));
                        }
                        break;
                default:
@@ -518,7 +558,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                        }
 
                        sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link));
-                       if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
+                       if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
                                free(sybase_ptr);
                                efree(hashed_details);
                                RETURN_FALSE;
@@ -572,7 +612,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                                 * NULL before trying to use it elsewhere . . .)
                                 */
                                memcpy(&sybase, sybase_ptr, sizeof(sybase_link));
-                               if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
+                               if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
                                        memcpy(sybase_ptr, &sybase, sizeof(sybase_link));
                                        efree(hashed_details);
                                        RETURN_FALSE;
@@ -615,7 +655,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
                }
 
                sybase_ptr = (sybase_link *) emalloc(sizeof(sybase_link));
-               if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
+               if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
                        efree(sybase_ptr);
                        efree(hashed_details);
                        RETURN_FALSE;