From: "Denis V. Dmitrienko" <denis@null.net>

What it does:
It solves stupid problem with cyrillic charsets IP-based on-fly recoding.
take a look at /data/charset.conf for details.
You can use any tables for any charset.
Tables are from Russian Apache project.
Tables in this patch contains also Ukrainian characters.

Then run ./configure --enable-recode
This commit is contained in:
Marc G. Fournier 1998-02-24 15:27:04 +00:00
parent 96316211c3
commit 0227a4e114
21 changed files with 844 additions and 8 deletions

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.27 1998/01/27 03:24:56 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.28 1998/02/24 15:18:41 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -846,6 +846,192 @@ authident(struct sockaddr_in *raddr, struct sockaddr_in *laddr,
}
#ifdef CYR_RECODE
#define CHARSET_FILE "charset.conf"
#define MAX_CHARSETS 10
#define KEY_HOST 1
#define KEY_BASE 2
#define KEY_TABLE 3
struct CharsetItem
{
char Orig[MAX_TOKEN];
char Dest[MAX_TOKEN];
char Table[MAX_TOKEN];
};
int InRange(char *buf,int host)
{
int valid,i,FromAddr,ToAddr,tmp;
struct in_addr file_ip_addr;
char *p;
unsigned int one=0x80000000,NetMask=0;
unsigned char mask;
p = strchr(buf,'/');
if(p)
{
*p++ = '\0';
valid = inet_aton(buf, &file_ip_addr);
if(valid)
{
mask = strtoul(p,0,0);
FromAddr = ntohl(file_ip_addr.s_addr);
ToAddr = ntohl(file_ip_addr.s_addr);
for(i=0;i<mask;i++)
{
NetMask |= one;
one >>= 1;
}
FromAddr &= NetMask;
ToAddr = ToAddr | ~NetMask;
tmp = ntohl(host);
return ((unsigned)tmp>=(unsigned)FromAddr &&
(unsigned)tmp<=(unsigned)ToAddr);
}
}
else
{
p = strchr(buf,'-');
if(p)
{
*p++ = '\0';
valid = inet_aton(buf, &file_ip_addr);
if(valid)
{
FromAddr = ntohl(file_ip_addr.s_addr);
valid = inet_aton(p, &file_ip_addr);
if(valid)
{
ToAddr = ntohl(file_ip_addr.s_addr);
tmp = ntohl(host);
return ((unsigned)tmp>=(unsigned)FromAddr &&
(unsigned)tmp<=(unsigned)ToAddr);
}
}
}
else
{
valid = inet_aton(buf, &file_ip_addr);
if(valid)
{
FromAddr = file_ip_addr.s_addr;
return ((unsigned)FromAddr == (unsigned)host);
}
}
}
return false;
}
void GetCharSetByHost(char TableName[],int host, const char DataDir[])
{
FILE *file;
char buf[MAX_TOKEN],BaseCharset[MAX_TOKEN],
OrigCharset[MAX_TOKEN],DestCharset[MAX_TOKEN],HostCharset[MAX_TOKEN];
char c,eof=false;
char *map_file;
int key=0,i;
struct CharsetItem* ChArray[MAX_CHARSETS];
int ChIndex=0;
*TableName = '\0';
map_file = (char *) malloc((strlen(DataDir) +
strlen(CHARSET_FILE)+2)*sizeof(char));
sprintf(map_file, "%s/%s", DataDir, CHARSET_FILE);
file = fopen(map_file, "r");
if (file == NULL)
return;
while (!eof)
{
c = getc(file);
ungetc(c, file);
if (c == EOF)
eof = true;
else
{
if (c == '#')
read_through_eol(file);
else
{
/* Read the key */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
if (strcasecmp(buf, "HostCharset") == 0)
key = KEY_HOST;
if (strcasecmp(buf, "BaseCharset") == 0)
key = KEY_BASE;
if (strcasecmp(buf, "RecodeTable") == 0)
key = KEY_TABLE;
switch(key)
{
case KEY_HOST:
/* Read the host */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
if (InRange(buf,host))
{
/* Read the charset */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
strcpy(HostCharset,buf);
}
}
}
break;
case KEY_BASE:
/* Read the base charset */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
strcpy(BaseCharset,buf);
}
break;
case KEY_TABLE:
/* Read the original charset */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
strcpy(OrigCharset,buf);
/* Read the destination charset */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
strcpy(DestCharset,buf);
/* Read the table filename */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
ChArray[ChIndex] = (struct CharsetItem *) malloc(sizeof(struct CharsetItem));
strcpy(ChArray[ChIndex]->Orig,OrigCharset);
strcpy(ChArray[ChIndex]->Dest,DestCharset);
strcpy(ChArray[ChIndex]->Table,buf);
ChIndex++;
}
}
}
break;
}
read_through_eol(file);
}
}
}
}
fclose(file);
free(map_file);
for(i=0; i<ChIndex; i++)
{
if(!strcasecmp(BaseCharset,ChArray[i]->Orig) &&
!strcasecmp(HostCharset,ChArray[i]->Dest))
{
strncpy(TableName,ChArray[i]->Table,79);
}
free((struct CharsetItem *) ChArray[i]);
}
}
#endif
extern int
hba_getauthmethod(SockAddr *raddr, char *database, char *auth_arg,

View File

@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.73 1998/01/31 20:14:15 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.74 1998/02/24 15:19:00 scrappy Exp $
*
* NOTES
*
@ -203,6 +203,10 @@ static void readStartupPacket(char *arg, PacketLen len, char *pkt);
static int initMasks(fd_set *rmask, fd_set *wmask);
static void RandomSalt(char* salt);
#ifdef CYR_RECODE
void GetCharSetByHost(char *,int,char *);
#endif
extern char *optarg;
extern int optind,
opterr;
@ -974,7 +978,14 @@ BackendStartup(Port *port)
Backend *bn; /* for backend cleanup */
int pid,
i;
#ifdef CYR_RECODE
#define NR_ENVIRONMENT_VBL 6
char ChTable[80];
#else
#define NR_ENVIRONMENT_VBL 5
#endif
static char envEntry[NR_ENVIRONMENT_VBL][2 * ARGV_SIZE];
for (i = 0; i < NR_ENVIRONMENT_VBL; ++i)
@ -1000,6 +1011,15 @@ BackendStartup(Port *port)
sprintf(envEntry[4], "IPC_KEY=%d", ipc_key);
putenv(envEntry[4]);
#ifdef CYR_RECODE
GetCharSetByHost(ChTable,port->raddr.in.sin_addr.s_addr,DataDir);
if(*ChTable != '\0')
{
sprintf(envEntry[5], "PG_RECODETABLE=%s", ChTable);
putenv(envEntry[5]);
}
#endif
if (DebugLvl > 2)
{
char **p;

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.65 1998/02/02 00:05:03 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.66 1998/02/24 15:19:23 scrappy Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@ -1168,6 +1168,10 @@ PostgresMain(int argc, char *argv[])
SetPgUserName();
userName = GetPgUserName();
#ifdef CYR_RECODE
SetCharSet();
#endif
if (FindBackend(pg_pathname, argv[0]) < 0)
elog(FATAL, "%s: could not locate executable, bailing out...",
argv[0]);
@ -1293,7 +1297,7 @@ PostgresMain(int argc, char *argv[])
if (IsUnderPostmaster == false)
{
puts("\nPOSTGRES backend interactive interface");
puts("$Revision: 1.65 $ $Date: 1998/02/02 00:05:03 $");
puts("$Revision: 1.66 $ $Date: 1998/02/24 15:19:23 $");
}
/* ----------------

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.27 1998/02/10 16:03:46 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.28 1998/02/24 15:19:44 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -16,6 +16,10 @@
#include "postgres.h"
#include "utils/builtins.h"
#ifdef CYR_RECODE
char *convertstr(char *,int,int);
#endif
/*
* CHAR() and VARCHAR() types are part of the ANSI SQL standard. CHAR()
* is for blank-padded string whose length is specified in CREATE TABLE.
@ -84,6 +88,11 @@ bpcharin(char *s, int dummy, int16 atttypmod)
if (*r == '\0')
break;
}
#ifdef CYR_RECODE
convertstr(result + VARHDRSZ,len,0);
#endif
/* blank pad the string if necessary */
for (; i < len; i++)
{
@ -110,6 +119,11 @@ bpcharout(char *s)
result = (char *) palloc(len + 1);
StrNCpy(result, VARDATA(s), len+1); /* these are blank-padded */
}
#ifdef CYR_RECODE
convertstr(result,len,1);
#endif
return (result);
}
@ -143,6 +157,10 @@ varcharin(char *s, int dummy, int16 atttypmod)
VARSIZE(result) = len;
strncpy(VARDATA(result), s, len - VARHDRSZ);
#ifdef CYR_RECODE
convertstr(result + VARHDRSZ,len,0);
#endif
return (result);
}
@ -164,6 +182,11 @@ varcharout(char *s)
result = (char *) palloc(len + 1);
StrNCpy(result, VARDATA(s), len+1);
}
#ifdef CYR_RECODE
convertstr(result,len,1);
#endif
return (result);
}

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.29 1998/01/07 18:46:54 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.30 1998/02/24 15:19:45 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -157,6 +157,11 @@ textin(char *inputText)
VARSIZE(result) = len;
memmove(VARDATA(result), inputText, len - VARHDRSZ);
#ifdef CYR_RECODE
convertstr(VARDATA(result),len-VARHDRSZ,0);
#endif
return (result);
}
@ -180,6 +185,11 @@ textout(text *vlena)
result = (char *) palloc(len + 1);
memmove(result, VARDATA(vlena), len);
result[len] = '\0';
#ifdef CYR_RECODE
convertstr(result,len,1);
#endif
return (result);
}

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.9 1998/01/25 04:07:00 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.10 1998/02/24 15:20:16 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -51,6 +51,11 @@ extern char *DatabaseName;
extern char *UserName;
extern char *DatabasePath;
#ifdef CYR_RECODE
unsigned char RecodeForwTable[128];
unsigned char RecodeBackTable[128];
#endif
/*
* Define USE_ENVIRONMENT to get PGDATA, etc. from environment variables.
@ -258,6 +263,145 @@ SetDatabaseName(char *name)
strcpy(DatabaseName, name);
}
#ifdef CYR_RECODE
#define MAX_TOKEN 80
/* Some standard C libraries, including GNU, have an isblank() function.
Others, including Solaris, do not. So we have our own.
*/
static bool
isblank(const char c)
{
return (c == ' ' || c == 9 /* tab */ );
}
static void
next_token(FILE *fp, char *buf, const int bufsz)
{
/*--------------------------------------------------------------------------
Grab one token out of fp. Tokens are strings of non-blank
characters bounded by blank characters, beginning of line, and end
of line. Blank means space or tab. Return the token as *buf.
Leave file positioned to character immediately after the token or
EOF, whichever comes first. If no more tokens on line, return null
string as *buf and position file to beginning of next line or EOF,
whichever comes first.
--------------------------------------------------------------------------*/
int c;
char *eb = buf + (bufsz - 1);
/* Move over inital token-delimiting blanks */
while (isblank(c = getc(fp)));
if (c != '\n')
{
/*
* build a token in buf of next characters up to EOF, eol, or
* blank.
*/
while (c != EOF && c != '\n' && !isblank(c))
{
if (buf < eb)
*buf++ = c;
c = getc(fp);
/*
* Put back the char right after the token (putting back EOF
* is ok)
*/
}
ungetc(c, fp);
}
*buf = '\0';
}
static void
read_through_eol(FILE *file)
{
int c;
do
c = getc(file);
while (c != '\n' && c != EOF);
}
void SetCharSet()
{
FILE *file;
char *p,c,eof=false;
char *map_file;
char buf[MAX_TOKEN];
int i;
unsigned char FromChar,ToChar;
for(i=0; i<128; i++)
{
RecodeForwTable[i] = i+128;
RecodeBackTable[i] = i+128;
}
p = getenv("PG_RECODETABLE");
if (p && *p != '\0')
{
map_file = (char *) malloc((strlen(DataDir) +
strlen(p)+2)*sizeof(char));
sprintf(map_file, "%s/%s", DataDir, p);
file = fopen(map_file, "r");
if (file == NULL)
return;
eof=false;
while (!eof)
{
c = getc(file);
ungetc(c, file);
if (c == EOF)
eof = true;
else
{
if (c == '#')
read_through_eol(file);
else
{
/* Read the FromChar */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
FromChar = strtoul(buf,0,0);
/* Read the ToChar */
next_token(file, buf, sizeof(buf));
if (buf[0] != '\0')
{
ToChar = strtoul(buf,0,0);
RecodeForwTable[FromChar-128] = ToChar;
RecodeBackTable[ToChar-128] = FromChar;
}
read_through_eol(file);
}
}
}
}
fclose(file);
free(map_file);
}
}
char* convertstr(unsigned char *buff,int len,int dest)
{
int i;
char *ch=buff;
for (i = 0; i < len; i++,buff++)
{
if (*buff >127)
if (dest)
*buff = RecodeForwTable[*buff-128];
else
*buff = RecodeBackTable[*buff-128];
}
return ch;
}
#endif
/* ----------------
* GetPgUserName and SetPgUserName
*

View File

@ -211,6 +211,19 @@ else
fi
export USE_LOCALE
dnl We exclude cyrillic recode support unless we override it with
dnl --enable-recode
dnl --disable-recode to explicitly disable it
dnl --enable-recode to explicitly enable it
dnl It defaults to disabled
if test "$enable_recode" = "yes" -o "$enable_recode" = "no"
then
CYR_RECODE=$enable_recode
else
CYR_RECODE=no
fi
export CYR_RECODE
dnl We use the default value of 5432 for the DEF_PGPORT value. If
dnl we over-ride it with --with-pgport=port then we bypass this piece
if test "X$with_pgport" != "X"
@ -518,6 +531,14 @@ then
else
AC_MSG_RESULT(disabled)
fi
AC_MSG_CHECKING(setting CYR_RECODE)
if test "$CYR_RECODE" = "yes"
then
AC_MSG_RESULT(enabled)
AC_DEFINE(CYR_RECODE)
else
AC_MSG_RESULT(disabled)
fi
AC_MSG_CHECKING(setting DEF_PGPORT)
AC_DEFINE_UNQUOTED(DEF_PGPORT, "${DEF_PGPORT}")
AC_MSG_RESULT($DEF_PGPORT)

40
src/data/charset.conf Normal file
View File

@ -0,0 +1,40 @@
#
# Example PostgreSQL charsets control file.
#
# Should be placed in $PG_DATA directory.
#
# On the fly recoding charsets, based on client's IP address.
# For example: koi8-u (koi) <-> cp1251 (win) <-> cp866 (alt)
#
# Base charset for backend
# Most Unices use koi8-r(u) as base charset. But Solaris
# use iso8859-5 and some networkless workstations use cp866.
BaseCharset koi
# There are recode table definitions from base charset to
# other. Table names are relative to $PG_DATA directory.
# Tables are taken from Russian Apache <http://apache.lexa.ru>.
RecodeTable koi alt koi-alt.tab
RecodeTable koi win koi-win.tab
RecodeTable koi iso koi-iso.tab
RecodeTable koi koi koi-koi.tab
RecodeTable alt win othertabs/alt-win.tab
RecodeTable alt koi othertabs/alt-koi.tab
RecodeTable iso koi othertabs/iso-koi.tab
# Local loopback
HostCharset 127.0.0.1 koi
# Yet another Unix (maybe ;)
HostCharset 192.168.0.1 koi
# There are Windows on 192.168.1.64 through 192.168.1.95
HostCharset 192.168.1.64/27 win
# There are cp866 (alt) systems on 192.168.2.3 through
# 192.168.2.7 (exept 192.168.2.4 - see below)
HostCharset 192.168.2.3-192.168.2.7 alt
# This is exeption from previous rule!
HostCharset 192.168.2.4 win

View File

85
src/data/koi-alt.tab Normal file
View File

@ -0,0 +1,85 @@
# Line with '#' at the begin is comment
# table file may contain number of line as you wana
# first - code of symbol, second translate code of symbol
# codes may be in two forms: decimal and hex
# examples:
# 192 225
# 0x81 226
# 226 0x81
# 0x90 0xfe
# patch for Russia by Dm.Kryukov (dvk@stack.serpukhov.su)
#
163 241
164 243
166 249
167 245
173 173
179 240
180 242
182 248
183 244
189 189
192 238
193 160
194 161
195 230
196 164
197 165
198 228
199 163
200 229
201 168
202 169
203 170
204 171
205 172
206 173
207 174
208 175
209 239
210 224
211 225
212 226
213 227
214 166
215 162
216 236
217 235
218 167
219 232
220 237
221 233
222 231
223 234
224 158
225 128
226 129
227 150
228 132
229 133
230 148
231 131
232 149
233 136
234 137
235 138
236 139
237 140
238 141
239 142
240 143
241 159
242 144
243 145
244 146
245 147
246 134
247 130
248 156
249 155
250 135
251 152
252 157
253 153
254 151
255 154

View File

75
src/data/koi-iso.tab Normal file
View File

@ -0,0 +1,75 @@
# Line with '#' at the begin is comment
# table file may contain number of line as you wana
# first - code of symbol, second translate code of symbol
# codes may be in two forms: decimal and hex
# examples:
# 192 225
# 0x81 226
# 226 0x81
# 0x90 0xfe
# patch for Russia by Dm.Kryukov (dvk@stack.serpukhov.su)
#
192 0xee
193 0xd0
194 0xd1
195 0xe6
196 0xd4
197 0xd5
198 0xe4
199 0xd3
200 0xe5
201 0xd8
202 0xd9
203 0xda
204 0xdb
205 0xdc
206 0xdd
207 0xde
208 0xdf
209 0xef
210 0xe0
211 0xe1
212 0xe2
213 0xe3
214 0xd6
215 0xd2
216 0xec
217 0xeb
218 0xd7
219 0xe8
220 0xed
221 0xe9
222 0xe7
223 0xea
224 0xce
225 0xb0
226 0xb1
227 0xc6
228 0xb4
229 0xb5
230 0xc4
231 0xb3
232 0xc5
233 0xb8
234 0xb9
235 0xba
236 0xbb
237 0xbc
238 0xbd
239 0xbe
240 0xbf
241 0xcf
242 0xc0
243 0xc1
244 0xc2
245 0xc3
246 0xb6
247 0xb2
248 0xcc
249 0xcb
250 0xb7
251 0xc8
252 0xcd
253 0xc9
254 0xc7
255 0xca

View File

2
src/data/koi-koi.tab Normal file
View File

@ -0,0 +1,2 @@
# Hmm ...
#

View File

130
src/data/koi-mac.tab Normal file
View File

@ -0,0 +1,130 @@
# Hmm ...
#
128 0xc0
129 0xc1
130 0xc2
131 0xc3
132 0xc4
133 0xc5
134 0xc6
135 0xc7
136 0xc8
137 0xc9
138 0xca
139 0xcb
140 0xcc
141 0xcd
142 0xce
143 0xcf
144 0xd0
145 0xd1
146 0xd2
147 0xd3
148 0xd4
149 0xd5
150 0xd6
151 0xd7
152 0xd8
153 0xd9
154 0xda
155 0xdb
156 0xdc
157 0xdd
158 0xde
159 0xdf
160 0xa0
161 0xa1
162 0xa2
163 0xa3
164 0xa4
165 0xa5
166 0xa6
167 0xa7
168 0xa8
169 0xa9
170 0xaa
171 0xab
172 0xac
173 0xad
174 0xae
175 0xaf
176 0xb0
177 0xb1
178 0xb2
179 0xb3
180 0xb4
181 0xb5
182 0xb6
183 0xb7
184 0xb8
185 0xb9
186 0xba
187 0xbb
188 0xbc
189 0xbd
190 0xbe
191 0xbf
192 0xfe
193 0xe0
194 0xe1
195 0xf6
196 0xe4
197 0xe5
198 0xf4
199 0xe3
200 0xf5
201 0xe8
202 0xe9
203 0xea
204 0xeb
205 0xec
206 0xed
207 0xee
208 0xef
209 0xdf
210 0xf0
211 0xf1
212 0xf2
213 0xf3
214 0xe6
215 0xe2
216 0xfc
217 0xfb
218 0xe7
219 0xf8
220 0xfd
221 0xf9
222 0xf7
223 0xfa
224 0x9e
225 0x80
226 0x81
227 0x96
228 0x84
229 0x85
230 0x94
231 0x83
232 0x95
233 0x88
234 0x89
235 0x8a
236 0x8b
237 0x8c
238 0x8d
239 0x8e
240 0x8f
241 0x9f
242 0x90
243 0x91
244 0x92
245 0x93
246 0x86
247 0x82
248 0x9c
249 0x9b
250 0x87
251 0x98
252 0x9d
253 0x99
254 0x97
255 0x9a

View File

85
src/data/koi-win.tab Normal file
View File

@ -0,0 +1,85 @@
# Line with '#' at the begin is comment
# table file may contain number of line as you wana
# first - code of symbol, second translate code of symbol
# codes may be in two forms: decimal and hex
# examples:
# 192 225
# 0x81 226
# 226 0x81
# 0x90 0xfe
# patch for Russia by Dm.Kryukov (dvk@stack.serpukhov.su)
#
163 184
164 186
166 179
167 191
173 180
179 168
180 170
182 178
183 175
189 165
192 254
193 224
194 225
195 246
196 228
197 229
198 244
199 227
200 245
201 232
202 233
203 234
204 235
205 236
206 237
207 238
208 239
209 255
210 240
211 241
212 242
213 243
214 230
215 226
216 252
217 251
218 231
219 248
220 253
221 249
222 247
223 250
224 222
225 192
226 193
227 214
228 196
229 197
230 212
231 195
232 213
233 200
234 201
235 202
236 203
237 204
238 205
239 206
240 207
241 223
242 208
243 209
244 210
245 211
246 198
247 194
248 220
249 219
250 199
251 216
252 221
253 217
254 215
255 218

View File

View File

@ -195,6 +195,9 @@ extern void srandom(int seed);
/* Set to 1 if you want to USE_LOCALE */
#undef USE_LOCALE
/* Set to 1 if you want CYR_RECODE (cyrillic recode) */
#undef CYR_RECODE
/* Set to 1 if you want to Disable ASSERT CHECKING */
#undef NO_ASSERT_CHECKING

View File

@ -6,7 +6,7 @@
*
* Copyright (c) 1995, Regents of the University of California
*
* $Id: postgres.h,v 1.11 1997/11/13 03:22:46 momjian Exp $
* $Id: postgres.h,v 1.12 1998/02/24 15:27:04 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@ -214,4 +214,12 @@ typedef uint32 CommandId;
#define STATUS_BAD_PACKET (-7)
#define STATUS_FOUND (1)
/* ---------------
* Cyrillic on the fly charsets recode
* ---------------
*/
#ifdef CYR_RECODE
void SetCharSet();
#endif /* CYR_RECODE */
#endif /* POSTGRES_H */