[PHP-DEV] Bug #6032: Only default charset available in sybase From: alf <email protected>
Date: 08/08/00

From: alf <email protected>
Operating system: Linux
PHP version: 3.0.16
PHP Bug Type: Sybase-ct (ctlib) related
Bug description: Only default charset available in sybase

I had a problem with sybase-dblib a couple of days ago, and fixed it sending an extra parameter (character set) in the connection information. It turned out I _actually_ needed it with ct-lib, not dblib. Following patch does the same for dblib. (See description in bug #5996).

-+-+-cut from next line. file php3_sybase-ct_charsets.patch-+-+-
--- functions/sybase-ct.c.orig Mon Feb 7 18:54:51 2000
+++ functions/sybase-ct.c Tue Aug 8 20:15:03 2000
@@ -349,8 +349,10 @@
 }

-static int _php3_sybct_really_connect(sybct_link *sybct, char *host, char *user, char *passwd)
+static int _php3_sybct_really_connect(sybct_link *sybct, char *host, char *user, char *passwd, char *charset)
 {
+ CS_LOCALE *tmp_locale;
+
        /* set a CS_CONNECTION record */
        if (ct_con_alloc(context, &sybct->connection)!=CS_SUCCEED) {
                php3_error(E_WARNING,"Sybase: Unable to allocate connection record");
@@ -371,7 +373,25 @@
                ct_con_props(sybct->connection, CS_SET, CS_PASSWORD, passwd, CS_NULLTERM, NULL);
        }
        ct_con_props(sybct->connection, CS_SET, CS_APPNAME, php3_sybct_module.appname, CS_NULLTERM, NULL);
-
+
+ if (charset) {
+ if (cs_loc_alloc(context, &tmp_locale)!=CS_SUCCEED) {
+ php3_error(E_WARNING,"Sybase: Unable to allocate locale information.");
+ } else {
+ if (cs_locale(context, CS_SET, tmp_locale, CS_LC_ALL, NULL, CS_NULLTERM, NULL)!=CS_SUCCEED) {
+ php3_error(E_WARNING,"Sybase: Unable to load default locale data.");
+ } else {
+ if (cs_locale(context, CS_SET, tmp_locale, CS_SYB_CHARSET, charset, CS_NULLTERM, NULL)!=CS_SUCCEED) {
+ php3_error(E_WARNING,"Sybase: Unable to update character set.");
+ } else {
+ if (ct_con_props(sybct->connection, CS_SET, CS_LOC_PROP, tmp_locale, CS_UNUSED, NULL)!=CS_SUCCEED) {
+ php3_error(E_WARNING,"Sybase: Unable to update connection properties.");
+ }
+ }
+ }
+ }
+ }
+
        if (php3_sybct_module.hostname) {
                ct_con_props(sybct->connection, CS_SET, CS_HOSTNAME, php3_sybct_module.hostname, CS_NULLTERM, NULL);
        }
@@ -399,7 +419,7 @@

 static void php3_sybct_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent)
 {
- char *user,*passwd,*host;
+ char *user,*passwd,*host,*charset;
        char *hashed_details;
        int hashed_details_length;
        sybct_link *sybct_ptr;
@@ -409,7 +429,7 @@

        switch(ARG_COUNT(ht)) {
                case 0: /* defaults */
- host=user=passwd=NULL;
+ host=user=passwd=charset=NULL;
                        hashed_details_length=5+3;
                        hashed_details = (char *) emalloc(hashed_details_length+1);
                        strcpy(hashed_details,"sybct___");
@@ -422,7 +442,7 @@
                                }
                                convert_to_string(yyhost);
                                host = yyhost->value.str.val;
- user=passwd=NULL;
+ user=passwd=charset=NULL;
                                hashed_details_length = yyhost->value.str.len+5+3;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
                                sprintf(hashed_details,"sybct_%s__",yyhost->value.str.val);
@@ -438,7 +458,7 @@
                                convert_to_string(yyuser);
                                host = yyhost->value.str.val;
                                user = yyuser->value.str.val;
- passwd=NULL;
+ passwd=charset=NULL;
                                hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+5+3;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
                                sprintf(hashed_details,"sybct_%s_%s_",yyhost->value.str.val,yyuser->value.str.val);
@@ -456,11 +476,31 @@
                                host = yyhost->value.str.val;
                                user = yyuser->value.str.val;
                                passwd = yypasswd->value.str.val;
+ charset = NULL;
                                hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+5+3;
                                hashed_details = (char *) emalloc(hashed_details_length+1);
                                sprintf(hashed_details,"sybct_%s_%s_%s",yyhost->value.str.val,yyuser->value.str.val,yypasswd->value.str.val); /* SAFE */
                        }
                        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 = yyhost->value.str.val;
+ user = yyuser->value.str.val;
+ passwd = yypasswd->value.str.val;
+ charset = yycharset->value.str.val;
+ hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+yycharset->value.str.len+5+3;
+ hashed_details = (char *) emalloc(hashed_details_length+1);
+ sprintf(hashed_details,"sybct_%s_%s_%s",yyhost->value.str.val,yyuser->value.str.val,yypasswd->value.str.val,yycharset->value.str.val); /* SAFE */
+ }
+ break;
                default:
                        WRONG_PARAM_COUNT;
                        break;
@@ -489,7 +529,7 @@
                        }

                        sybct_ptr = (sybct_link *) malloc(sizeof(sybct_link));
- if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd)) {
+ if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd, charset)) {
                                free(sybct_ptr);
                                efree(hashed_details);
                                RETURN_FALSE;
@@ -543,7 +583,7 @@
                                 * NULL before trying to use it elsewhere . . .)
                                 */
                                memcpy(&sybct,sybct_ptr,sizeof(sybct_link));
- if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd)) {
+ if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd, charset)) {
                                        memcpy(sybct_ptr,&sybct,sizeof(sybct_link));
                                        efree(hashed_details);
                                        RETURN_FALSE;
@@ -587,7 +627,7 @@
                }

                sybct_ptr = (sybct_link *) emalloc(sizeof(sybct_link));
- if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd)) {
+ if (!_php3_sybct_really_connect(sybct_ptr, host, user, passwd, charset)) {
                        efree(sybct_ptr);
                        efree(hashed_details);
                        RETURN_FALSE;
--- functions/php3_sybase-ct.h.orig Mon Feb 7 18:54:51 2000
+++ functions/php3_sybase-ct.h Tue Aug 8 20:26:09 2000
@@ -72,6 +72,7 @@

 #include <ctpublic.h>
+#include <cstypes.h>

 typedef struct {
        long default_link;
-+-+-cut to previous line. file php3_sybase-ct_charsets.patch-+-+-
patch with:
patch -p0 < php3_sybase-ct_charsets.patch
from the php directory (/wherever/php-3.0.16)

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: php-dev-unsubscribe <email protected>
For additional commands, e-mail: php-dev-help <email protected>
To contact the list administrators, e-mail: php-list-admin <email protected>