ID: 11320
Updated by: joey
Reported By: [EMAIL PROTECTED]
Old-Status: Open
Status: Assigned
Bug Type: Sybase-ct (ctlib) related
Operating system:
PHP Version: 4.0.5
Assigned To: joey
Comments:
You're still missing a few things, but thanks for the patch!
I have something that is ready, I just want to test it a bit more before applying it,
but I think you can expect to see it by 4.0.7.
Previous Comments:
---------------------------------------------------------------------------
[2001-06-06 22:30:24] [EMAIL PROTECTED]
Hi,
previous patch had small bug, a memory leak, this should be ok.
Martin.
-------------------------------------------
Martin Nedbal COOPERnet
mailto: [EMAIL PROTECTED]
--- php-4.0.5_official_release/ext/sybase_ct/php_sybase_ct.c Sun Mar
11 05:13:53 2001
+++ php-4.0.5/ext/sybase_ct/php_sybase_ct.c Wed Jun 6 20:27:07 2001
@@ -374,8 +374,10 @@
}
-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 */
@@ -397,6 +399,26 @@
if (passwd) {
ct_con_props(sybase->connection, CS_SET, CS_PASSWORD, passwd,
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.");
+ }
+ cs_loc_drop (SybCtG(context),tmp_locale);
+ }
+ }
+ }
+ }
+
ct_con_props(sybase->connection, CS_SET, CS_APPNAME, SybCtG(appname),
CS_NULLTERM, NULL);
if (SybCtG(hostname)) {
@@ -426,7 +448,7 @@
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;
@@ -434,7 +456,7 @@
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___");
@@ -486,6 +508,27 @@
sprintf(hashed_details, "sybase_%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+6+3;
+ hashed_details = (char *)
emalloc(hashed_details_length+1);
+
sprintf(hashed_details,"sybase_%s_%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;
@@ -514,7 +557,7 @@
}
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;
@@ -568,7 +611,7 @@
* 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;
@@ -611,7 +654,7 @@
}
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;
---------------------------------------------------------------------------
[2001-06-06 16:07:54] [EMAIL PROTECTED]
function sybase_connect doesn't accept fourth parameter, charset. Following patch
solves the problem.
Martin Nedbal
--- php-4.0.5/ext/sybase_ct/php_sybase_ct.c Sun Mar 11 05:13:53 2001
+++ php-4.0.5_sybase_ct_charset_path/ext/sybase_ct/php_sybase_ct.c Wed Jun 6
+15:29:42 2001
@@ -375,6 +375,8 @@
-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();
@@ -398,4 +400,26 @@
ct_con_props(sybase->connection, CS_SET, CS_PASSWORD, passwd,
CS_NULLTERM, NULL);
}
+ if (charset) {
+ // 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.");
+ }
+ }
+ }
+ }
+// ct_con_props(sybase->connection, CS_SET, CS_CHARSETCNV, CS_TRUE,
+CS_NULLTERM, NULL);
+// ct_con_props(sybase->connection, CS_SET, CS_CHARSETCNV, charset,
+CS_NULLTERM, NULL);
+ }
+
ct_con_props(sybase->connection, CS_SET, CS_APPNAME, SybCtG(appname),
CS_NULLTERM, NULL);
@@ -427,5 +451,5 @@
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;
@@ -435,5 +459,5 @@
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);
@@ -487,4 +511,25 @@
}
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+6+3;
+
+ hashed_details = (char *)
+emalloc(hashed_details_length+1);
+
+sprintf(hashed_details,"sybase_%s_%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;
@@ -515,5 +560,5 @@
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);
@@ -569,5 +614,5 @@
*/
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);
@@ -612,5 +657,5 @@
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);
---------------------------------------------------------------------------
ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at http://bugs.php.net/?id=11320&edit=2
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]