diff options
Diffstat (limited to 'src/interfaces/libpq/fe-connect.c')
-rw-r--r-- | src/interfaces/libpq/fe-connect.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index f899aaff624..92d32917ef2 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.116 2000/01/26 05:58:45 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.117 2000/02/05 12:33:22 ishii Exp $ * *------------------------------------------------------------------------- */ @@ -41,6 +41,7 @@ #endif #ifdef MULTIBYTE +#include "miscadmin.h" #include "mb/pg_wchar.h" #endif @@ -2381,13 +2382,54 @@ PQbackendPID(const PGconn *conn) } int -PQclientencoding(const PGconn *conn) +PQclientEncoding(const PGconn *conn) { if (!conn || conn->status != CONNECTION_OK) return -1; return conn->client_encoding; } +#ifdef MULTIBYTE +int +PQsetClientEncoding(PGconn *conn, const char *encoding) +{ + char qbuf[128]; + static char query[] = "set client_encoding to '%s'"; + PGresult *res; + int status; + + if (!conn || conn->status != CONNECTION_OK) + return -1; + + /* check query buffer overflow */ + if (sizeof(qbuf) < (sizeof(query) + strlen(encoding))) + return -1; + + /* ok, now send a query */ + sprintf(qbuf, query, encoding); + res = PQexec(conn, qbuf); + + if (res == (PGresult *)NULL) + return -1; + if (res->resultStatus != PGRES_COMMAND_OK) + status = -1; + else + { + /* change libpq internal encoding */ + conn->client_encoding = pg_char_to_encoding(encoding); + status = 0; /* everything is ok */ + } + PQclear(res); + return(status); +} +#else +int +PQsetClientEncoding(PGconn *conn, const char *encoding) +{ + return -1; +} +#endif + void PQtrace(PGconn *conn, FILE *debug_port) { |