1414 */
1515/* Multibyte supportEiji Tokuya 2001-03-15 */
1616
17+ #include <stdio.h>
18+ #include <string.h>
19+ #include <ctype.h>
20+
1721#include "connection.h"
1822
1923#include "environ.h"
2731#include "multibyte.h"
2832#endif
2933
30- #include <stdio.h>
31- #include <string.h>
32-
3334#ifdef WIN32
3435#include <odbcinst.h>
3536#endif
@@ -277,6 +278,10 @@ memcpy(&(rv->connInfo.drivers), &globals, sizeof(globals));
277278rv -> pg_version_number = .0 ;
278279rv -> pg_version_major = 0 ;
279280rv -> pg_version_minor = 0 ;
281+ #ifdef MULTIBYTE
282+ rv -> client_encoding = NULL ;
283+ rv -> server_encoding = NULL ;
284+ #endif /* MULTIBYTE */
280285
281286
282287/* Initialize statement options to defaults */
@@ -302,6 +307,12 @@ CC_Destructor(ConnectionClass *self)
302307
303308mylog ("after CC_Cleanup\n" );
304309
310+ #ifdef MULTIBYTE
311+ if (self -> client_encoding )
312+ free (self -> client_encoding );
313+ if (self -> server_encoding )
314+ free (self -> server_encoding );
315+ #endif /* MULTIBYTE */
305316/* Free up statement holders */
306317if (self -> stmts )
307318{
@@ -510,6 +521,9 @@ CC_connect(ConnectionClass *self, char do_password)
510521char msgbuffer [ERROR_MSG_LENGTH ];
511522char salt [5 ];
512523static char * func = "CC_connect" ;
524+ #ifdef MULTIBYTE
525+ char * encoding ;
526+ #endif /* MULTIBYTE */
513527
514528mylog ("%s: entering...\n" ,func );
515529
@@ -537,7 +551,9 @@ CC_connect(ConnectionClass *self, char do_password)
537551ci -> drivers .bools_as_char );
538552
539553#ifdef MULTIBYTE
540- check_client_encoding (ci -> drivers .conn_settings );
554+ encoding = check_client_encoding (ci -> drivers .conn_settings );
555+ if (encoding && strcmp (encoding ,"OTHER" ))
556+ self -> client_encoding = strdup (encoding );
541557qlog (" extra_systable_prefixes='%s', conn_settings='%s' conn_encoding='%s'\n" ,
542558ci -> drivers .extra_systable_prefixes ,
543559ci -> drivers .conn_settings ,
@@ -1041,7 +1057,6 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10411057CC_set_no_trans (self );
10421058ReadyToReturn = TRUE;
10431059retres = NULL ;
1044- break ;
10451060}
10461061else
10471062{
@@ -1059,6 +1074,7 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10591074QR_set_status (res ,PGRES_COMMAND_OK );
10601075QR_set_command (res ,cmdbuffer );
10611076query_completed = TRUE;
1077+ mylog ("send_query: returning res = %u\n" ,res );
10621078if (!before_64 )
10631079break ;
10641080/*
@@ -1069,71 +1085,14 @@ CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi)
10691085 * an 'I' is received
10701086 */
10711087
1072-
10731088if (empty_reqs == 0 )
10741089{
10751090SOCK_put_string (sock ,"Q " );
10761091SOCK_flush_output (sock );
10771092empty_reqs ++ ;
10781093}
1079- break ;
1080-
1081- while (!clear )
1082- {
1083- id = SOCK_get_char (sock );
1084- mylog ("got clear id = '%c'\n" ,id );
1085- switch (id )
1086- {
1087- case 'I' :
1088- (void )SOCK_get_char (sock );
1089- clear = TRUE;
1090- break ;
1091- case 'Z' :
1092- break ;
1093- case 'C' :
1094- SOCK_get_string (sock ,cmdbuffer ,ERROR_MSG_LENGTH );
1095- qlog ("Command response: '%s'\n" ,cmdbuffer );
1096- break ;
1097- case 'N' :
1098- msg_truncated = SOCK_get_string (sock ,cmdbuffer ,ERROR_MSG_LENGTH );
1099- if (QR_command_successful (res ))
1100- QR_set_status (res ,PGRES_NONFATAL_ERROR );
1101- QR_set_notice (res ,cmdbuffer );/* will dup this string */
1102- qlog ("NOTICE from backend during clear: '%s'\n" ,cmdbuffer );
1103- while (msg_truncated )
1104- msg_truncated = SOCK_get_string (sock ,cmdbuffer ,ERROR_MSG_LENGTH );
1105- break ;
1106- case 'E' :
1107- msg_truncated = SOCK_get_string (sock ,msgbuffer ,ERROR_MSG_LENGTH );
1108- mylog ("ERROR from backend during clear: '%s'\n" ,msgbuffer );
1109- qlog ("ERROR from backend during clear: '%s'\n" ,msgbuffer );
1110-
1111- /*
1112- * We must report this type of error as
1113- * well (practically for reference
1114- * integrity violation error reporting,
1115- * from PostgreSQL 7.0). (Zoltan Kovacs,
1116- * 04/26/2000)
1117- */
1118- self -> errormsg = msgbuffer ;
1119- if (!strncmp (self -> errormsg ,"FATAL" ,5 ))
1120- {
1121- self -> errornumber = CONNECTION_SERVER_REPORTED_ERROR ;
1122- CC_set_no_trans (self );
1123- }
1124- else
1125- self -> errornumber = CONNECTION_SERVER_REPORTED_WARNING ;
1126- QR_set_status (res ,PGRES_FATAL_ERROR );
1127- QR_set_aborted (res , TRUE);
1128- while (msg_truncated )
1129- msg_truncated = SOCK_get_string (sock ,cmdbuffer ,ERROR_MSG_LENGTH );
1130- break ;
1131- }
1132- }
1133-
1134- mylog ("send_query: returning res = %u\n" ,res );
1135- break ;
11361094}
1095+ break ;
11371096case 'Z' :/* Backend is ready for new query (6.4) */
11381097if (empty_reqs == 0 )
11391098{