Skip to content

Commit d488184

Browse files
author
Joey Smith
committed
Added charset support.
1 parent f35b85b commit d488184

File tree

1 file changed

+55
-15
lines changed

1 file changed

+55
-15
lines changed

ext/sybase_ct/php_sybase_ct.c

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ zend_module_entry sybase_module_entry = {
8484
};
8585

8686
ZEND_DECLARE_MODULE_GLOBALS(sybase)
87-
static CS_CONTEXT *context;
87+
/* static CS_CONTEXT *context; */
8888

8989
#ifdef COMPILE_DL_SYBASE_CT
9090
ZEND_GET_MODULE(sybase)
@@ -378,8 +378,10 @@ PHP_RSHUTDOWN_FUNCTION(sybase)
378378
}
379379

380380

381-
static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char *user, char *passwd)
381+
static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char *user, char *passwd, char *charset)
382382
{
383+
CS_LOCALE *tmp_locale;
384+
383385
SybCtLS_FETCH();
384386

385387
/* set a CS_CONNECTION record */
@@ -407,6 +409,24 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
407409
ct_con_props(sybase->connection, CS_SET, CS_HOSTNAME, SybCtG(hostname), CS_NULLTERM, NULL);
408410
}
409411

412+
if (charset) {
413+
if (cs_loc_alloc(SybCtG(context), &tmp_locale)!=CS_SUCCEED) {
414+
php_error(E_WARNING,"Sybase: Unable to allocate locale information.");
415+
} else {
416+
if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_LC_ALL, NULL, CS_NULLTERM, NULL)!=CS_SUCCEED) {
417+
php_error(E_WARNING,"Sybase: Unable to load default locale data.");
418+
} else {
419+
if (cs_locale(SybCtG(context), CS_SET, tmp_locale, CS_SYB_CHARSET, charset, CS_NULLTERM, NULL)!=CS_SUCCEED) {
420+
php_error(E_WARNING,"Sybase: Unable to update character set.");
421+
} else {
422+
if (ct_con_props(sybase->connection, CS_SET, CS_LOC_PROP, tmp_locale, CS_UNUSED, NULL)!=CS_SUCCEED) {
423+
php_error(E_WARNING,"Sybase: Unable to update connection properties.");
424+
}
425+
}
426+
}
427+
}
428+
}
429+
410430
sybase->valid = 1;
411431
sybase->dead = 0;
412432

@@ -430,15 +450,15 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
430450

431451
static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
432452
{
433-
char *user,*passwd,*host;
453+
char *user,*passwd,*host,*charset;
434454
char *hashed_details;
435455
int hashed_details_length;
436456
sybase_link *sybase_ptr;
437457
SybCtLS_FETCH();
438458

439459
switch(ZEND_NUM_ARGS()) {
440460
case 0: /* defaults */
441-
host=user=passwd=NULL;
461+
host=user=passwd=charset=NULL;
442462
hashed_details_length=6+3;
443463
hashed_details = (char *) emalloc(hashed_details_length+1);
444464
strcpy(hashed_details, "sybase___");
@@ -451,10 +471,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
451471
}
452472
convert_to_string(yyhost);
453473
host = yyhost->value.str.val;
454-
user=passwd=NULL;
455-
hashed_details_length = yyhost->value.str.len+6+3;
474+
user=passwd=charset=NULL;
475+
hashed_details_length = yyhost->value.str.len+6+4;
456476
hashed_details = (char *) emalloc(hashed_details_length+1);
457-
sprintf(hashed_details, "sybase_%s__", yyhost->value.str.val);
477+
sprintf(hashed_details, "sybase_%s___", yyhost->value.str.val);
458478
}
459479
break;
460480
case 2: {
@@ -467,10 +487,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
467487
convert_to_string(yyuser);
468488
host = yyhost->value.str.val;
469489
user = yyuser->value.str.val;
470-
passwd=NULL;
471-
hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+6+3;
490+
passwd=charset=NULL;
491+
hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+6+4;
472492
hashed_details = (char *) emalloc(hashed_details_length+1);
473-
sprintf(hashed_details, "sybase_%s_%s_", yyhost->value.str.val, yyuser->value.str.val);
493+
sprintf(hashed_details, "sybase_%s_%s__", yyhost->value.str.val, yyuser->value.str.val);
474494
}
475495
break;
476496
case 3: {
@@ -485,9 +505,29 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
485505
host = yyhost->value.str.val;
486506
user = yyuser->value.str.val;
487507
passwd = yypasswd->value.str.val;
488-
hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+6+3;
508+
charset=NULL;
509+
hashed_details_length = yyhost->value.str.len+yyuser->value.str.len+yypasswd->value.str.len+6+4;
510+
hashed_details = (char *) emalloc(hashed_details_length+1);
511+
sprintf(hashed_details, "sybase_%s_%s_%s_", yyhost->value.str.val, yyuser->value.str.val, yypasswd->value.str.val);
512+
}
513+
break;
514+
case 4: {
515+
pval *yyhost,*yyuser,*yypasswd,*yycharset;
516+
517+
if (getParameters(ht, 4, &yyhost, &yyuser, &yypasswd, &yycharset) == FAILURE) {
518+
RETURN_FALSE;
519+
}
520+
convert_to_string(yyhost);
521+
convert_to_string(yyuser);
522+
convert_to_string(yypasswd);
523+
convert_to_string(yycharset);
524+
host = Z_STRVAL_P(yyhost);
525+
user = Z_STRVAL_P(yyuser);
526+
passwd = Z_STRVAL_P(yypasswd);
527+
charset = Z_STRVAL_P(yycharset);
528+
hashed_details_length = Z_STRLEN_P(yyhost)+Z_STRLEN_P(yyuser)+Z_STRLEN_P(yypasswd)+Z_STRLEN_P(yycharset)+6+4;
489529
hashed_details = (char *) emalloc(hashed_details_length+1);
490-
sprintf(hashed_details, "sybase_%s_%s_%s", yyhost->value.str.val, yyuser->value.str.val, yypasswd->value.str.val); /* SAFE */
530+
sprintf(hashed_details, "sybase_%s_%s_%s_%s", Z_STRVAL_P(yyhost), Z_STRVAL_P(yyuser), Z_STRVAL_P(yypasswd), Z_STRVAL_P(yycharset));
491531
}
492532
break;
493533
default:
@@ -518,7 +558,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
518558
}
519559

520560
sybase_ptr = (sybase_link *) malloc(sizeof(sybase_link));
521-
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
561+
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
522562
free(sybase_ptr);
523563
efree(hashed_details);
524564
RETURN_FALSE;
@@ -572,7 +612,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
572612
* NULL before trying to use it elsewhere . . .)
573613
*/
574614
memcpy(&sybase, sybase_ptr, sizeof(sybase_link));
575-
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
615+
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
576616
memcpy(sybase_ptr, &sybase, sizeof(sybase_link));
577617
efree(hashed_details);
578618
RETURN_FALSE;
@@ -615,7 +655,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
615655
}
616656

617657
sybase_ptr = (sybase_link *) emalloc(sizeof(sybase_link));
618-
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd)) {
658+
if (!php_sybase_do_connect_internal(sybase_ptr, host, user, passwd, charset)) {
619659
efree(sybase_ptr);
620660
efree(hashed_details);
621661
RETURN_FALSE;

0 commit comments

Comments
 (0)