Added charset support.

This commit is contained in:
Joey Smith 2001-06-26 20:56:03 +00:00
parent f35b85b4c1
commit d4881848a3

View 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); /* 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;