php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #6032 Only default charset available in sybase
Submitted: 2000-08-08 21:45 UTC Modified: 2005-03-31 16:13 UTC
From: alf at alpha dot ulatina dot ac dot cr Assigned:
Status: Wont fix Package: Sybase-ct (ctlib) related
PHP Version: 3.0 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: alf at alpha dot ulatina dot ac dot cr
New email:
PHP Version: OS:

 

 [2000-08-08 21:45 UTC] alf at alpha dot ulatina dot ac dot cr
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)

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-02-10 14:57 UTC] jimw@php.net
refiled against 4.0.
 [2001-02-13 16:09 UTC] joey@php.net
Actually, this patch has been in 4.0 since 4.0.2...this is a patch against 3.0 to do the same thing.
 [2005-03-31 16:13 UTC] php-bugs at lists dot php dot net
We are sorry, but we do not support PHP 3 related problems anymore.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Dec 22 01:01:30 2024 UTC