]> granicus.if.org Git - postgresql/commitdiff
From: "Denis V. Dmitrienko" <denis@null.net>
authorMarc G. Fournier <scrappy@hub.org>
Tue, 24 Feb 1998 15:27:04 +0000 (15:27 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Tue, 24 Feb 1998 15:27:04 +0000 (15:27 +0000)
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

21 files changed:
src/backend/libpq/hba.c
src/backend/postmaster/postmaster.c
src/backend/tcop/postgres.c
src/backend/utils/adt/varchar.c
src/backend/utils/adt/varlena.c
src/backend/utils/init/miscinit.c
src/configure.in
src/data/charset.conf [new file with mode: 0644]
src/data/charset.conf.orig [new file with mode: 0644]
src/data/koi-alt.tab [new file with mode: 0644]
src/data/koi-alt.tab.orig [new file with mode: 0644]
src/data/koi-iso.tab [new file with mode: 0644]
src/data/koi-iso.tab.orig [new file with mode: 0644]
src/data/koi-koi.tab [new file with mode: 0644]
src/data/koi-koi.tab.orig [new file with mode: 0644]
src/data/koi-mac.tab [new file with mode: 0644]
src/data/koi-mac.tab.orig [new file with mode: 0644]
src/data/koi-win.tab [new file with mode: 0644]
src/data/koi-win.tab.orig [new file with mode: 0644]
src/include/config.h.in
src/include/postgres.h

index 857f324a0e71919cb6ddc33013ab928f549380f5..872601293c77463bd8df1c543cd1b1acb284d734 100644 (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,
index 5f966532c42be0de5ff78cd19e977fc6384440de..255fe2df35241d68cf8d1e8cb2a4990502c10064 100644 (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;
index 3575d69d4f50dae912546f9cb82c91158516268c..b981dcb125a8681d3537304ab1eb3630d7bcae63 100644 (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 $");
        }
 
        /* ----------------
index a7b6abdaeb1a964054d5a73325b1f98b21238131..f3a2df7b94d32af8092c7d591fa24903416d2447 100644 (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 $
  *
  *-------------------------------------------------------------------------
  */
 #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);
 }
 
index 1fc611286c5ee2c18fffced5809ea61bc2c2186a..8d334a2ffd90a691109cabafd8c37d7ab0464c97 100644 (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);
 }
 
index fe26cdde864c64ffdd2064efe4f4f73a15419285..9bc13907dc2e2f237def8b841e3f1b29171e6494 100644 (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
  *
index 5553f7710163cdbfd4c765c56557f5c015d110a8..a0fd5f3598094dfb790fe378c090fd69fb560b53 100644 (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)
diff --git a/src/data/charset.conf b/src/data/charset.conf
new file mode 100644 (file)
index 0000000..f1be4c5
--- /dev/null
@@ -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
diff --git a/src/data/charset.conf.orig b/src/data/charset.conf.orig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/data/koi-alt.tab b/src/data/koi-alt.tab
new file mode 100644 (file)
index 0000000..2f70efd
--- /dev/null
@@ -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
diff --git a/src/data/koi-alt.tab.orig b/src/data/koi-alt.tab.orig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/data/koi-iso.tab b/src/data/koi-iso.tab
new file mode 100644 (file)
index 0000000..98dd1d9
--- /dev/null
@@ -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
diff --git a/src/data/koi-iso.tab.orig b/src/data/koi-iso.tab.orig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/data/koi-koi.tab b/src/data/koi-koi.tab
new file mode 100644 (file)
index 0000000..91a9389
--- /dev/null
@@ -0,0 +1,2 @@
+# Hmm ...
+#
diff --git a/src/data/koi-koi.tab.orig b/src/data/koi-koi.tab.orig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/data/koi-mac.tab b/src/data/koi-mac.tab
new file mode 100644 (file)
index 0000000..c697c0c
--- /dev/null
@@ -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
diff --git a/src/data/koi-mac.tab.orig b/src/data/koi-mac.tab.orig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/data/koi-win.tab b/src/data/koi-win.tab
new file mode 100644 (file)
index 0000000..4c390bc
--- /dev/null
@@ -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
diff --git a/src/data/koi-win.tab.orig b/src/data/koi-win.tab.orig
new file mode 100644 (file)
index 0000000..e69de29
index f1f1dc1a8e69174626926b5a8f10c2ef2cc580a8..c211c7234832d7e68b69e2279a9ae31d6ef80b10 100644 (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
 
index fde7c6c6bb8588df802a05c473d092b472178abb..f1d4704e46bbd1ea5d8c4908ee593edeb37c6ef0 100644 (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 */