@@ -84,7 +84,7 @@ zend_module_entry sybase_module_entry = {
84
84
};
85
85
86
86
ZEND_DECLARE_MODULE_GLOBALS (sybase )
87
- static CS_CONTEXT * context ;
87
+ /* static CS_CONTEXT *context; */
88
88
89
89
#ifdef COMPILE_DL_SYBASE_CT
90
90
ZEND_GET_MODULE (sybase )
@@ -378,8 +378,10 @@ PHP_RSHUTDOWN_FUNCTION(sybase)
378
378
}
379
379
380
380
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 )
382
382
{
383
+ CS_LOCALE * tmp_locale ;
384
+
383
385
SybCtLS_FETCH ();
384
386
385
387
/* set a CS_CONNECTION record */
@@ -407,6 +409,24 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
407
409
ct_con_props (sybase -> connection , CS_SET , CS_HOSTNAME , SybCtG (hostname ), CS_NULLTERM , NULL );
408
410
}
409
411
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
+
410
430
sybase -> valid = 1 ;
411
431
sybase -> dead = 0 ;
412
432
@@ -430,15 +450,15 @@ static int php_sybase_do_connect_internal(sybase_link *sybase, char *host, char
430
450
431
451
static void php_sybase_do_connect (INTERNAL_FUNCTION_PARAMETERS , int persistent )
432
452
{
433
- char * user ,* passwd ,* host ;
453
+ char * user ,* passwd ,* host , * charset ;
434
454
char * hashed_details ;
435
455
int hashed_details_length ;
436
456
sybase_link * sybase_ptr ;
437
457
SybCtLS_FETCH ();
438
458
439
459
switch (ZEND_NUM_ARGS ()) {
440
460
case 0 : /* defaults */
441
- host = user = passwd = NULL ;
461
+ host = user = passwd = charset = NULL ;
442
462
hashed_details_length = 6 + 3 ;
443
463
hashed_details = (char * ) emalloc (hashed_details_length + 1 );
444
464
strcpy (hashed_details , "sybase___" );
@@ -451,10 +471,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
451
471
}
452
472
convert_to_string (yyhost );
453
473
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 ;
456
476
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 );
458
478
}
459
479
break ;
460
480
case 2 : {
@@ -467,10 +487,10 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
467
487
convert_to_string (yyuser );
468
488
host = yyhost -> value .str .val ;
469
489
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 ;
472
492
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 );
474
494
}
475
495
break ;
476
496
case 3 : {
@@ -485,9 +505,29 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
485
505
host = yyhost -> value .str .val ;
486
506
user = yyuser -> value .str .val ;
487
507
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 ;
489
529
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 ));
491
531
}
492
532
break ;
493
533
default :
@@ -518,7 +558,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
518
558
}
519
559
520
560
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 )) {
522
562
free (sybase_ptr );
523
563
efree (hashed_details );
524
564
RETURN_FALSE ;
@@ -572,7 +612,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
572
612
* NULL before trying to use it elsewhere . . .)
573
613
*/
574
614
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 )) {
576
616
memcpy (sybase_ptr , & sybase , sizeof (sybase_link ));
577
617
efree (hashed_details );
578
618
RETURN_FALSE ;
@@ -615,7 +655,7 @@ static void php_sybase_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
615
655
}
616
656
617
657
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 )) {
619
659
efree (sybase_ptr );
620
660
efree (hashed_details );
621
661
RETURN_FALSE ;
0 commit comments