mirror of
https://github.com/php/php-src.git
synced 2024-11-25 19:05:31 +08:00
Added charset support.
This commit is contained in:
parent
f35b85b4c1
commit
d4881848a3
@ -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); /* SAFE */
|
||||
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_%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;
|
||||
|
Loading…
Reference in New Issue
Block a user