From: "Martin J. Laubach"
authorMarc G. Fournier
Thu, 17 Apr 1997 13:50:57 +0000 (13:50 +0000)
committerMarc G. Fournier
Thu, 17 Apr 1997 13:50:57 +0000 (13:50 +0000)
Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql

  Here a patch that implements a SET date for use by the datetime
stuff. The syntax is

        SET date TO 'val[,val,...]'

  where val is us (us dates), euro (european dates), postgres,
iso or sql.

  Thomas is working on the integration in his datetime module.
I just needed to get the patch out before it went stale :)

src/backend/tcop/variable.c
src/backend/utils/adt/datetime.c
src/include/tcop/variable.h

index e3041361394d87614a16aa04d568b04c0063e9fb..424e3d08fbd06a151a1458b6051827388edca350 100644 (file)
+/*
+ * Routines for handling of SET var TO statements
+ *
+ * $Id: variable.c,v 1.3 1997/04/17 13:50:30 scrappy Exp $
+ *
+ * $Log: variable.c,v $
+ * Revision 1.3  1997/04/17 13:50:30  scrappy
+ * From: "Martin J. Laubach" 
+ * Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
+ *
+ *   Here a patch that implements a SET date for use by the datetime
+ * stuff. The syntax is
+ *
+ *         SET date TO 'val[,val,...]'
+ *
+ *   where val is us (us dates), euro (european dates), postgres,
+ * iso or sql.
+ *
+ *   Thomas is working on the integration in his datetime module.
+ * I just needed to get the patch out before it went stale :)
+ *
+ * Revision 1.1  1997/04/10 16:52:07  mjl
+ * Initial revision
+ */
+/*-----------------------------------------------------------------------*/
+
+#include 
 #include "postgres.h"
 #include "tcop/variable.h"
 
+/*-----------------------------------------------------------------------*/
+#if USE_EURODATES
+#define DATE_EURO  TRUE
+#else
+#define DATE_EURO FALSE
+#endif
+
+/*-----------------------------------------------------------------------*/
+struct PGVariables PGVariables =
+   {
+       { DATE_EURO, Date_Postgres }
+   };
+
+/*-----------------------------------------------------------------------*/
+static const char *get_token(char *buf, int size, const char *str)
+   {
+   if(!*str)
+       return NULL;
+       
+   /* skip white space */
+   while(*str && (*str == ' ' || *str == '\t'))
+       str++;
+   
+   /* copy until we hit white space or comma or end of string */
+   while(*str && *str != ' ' && *str != '\t' && *str != ',' && size-- > 1)
+       *buf++ = *str++;
+   
+   *buf = '\0';
+   
+   /* skip white space and comma*/
+   while(*str && (*str == ' ' || *str == '\t' || *str == ','))
+       str++;
+   
+   return str;
+   }
+   
+/*-----------------------------------------------------------------------*/
+static bool parse_null(const char *value)
+   {
+   return TRUE;
+   }
+   
+static bool parse_date(const char *value)
+   {
+   char tok[32];
+   int dcnt = 0, ecnt = 0;
+   
+   while(value = get_token(tok, sizeof(tok), value))
+       {
+       /* Ugh. Somebody ought to write a table driven version -- mjl */
+       
+       if(!strcasecmp(tok, "iso"))
+           {
+           PGVariables.date.format = Date_ISO;
+           dcnt++;
+           }
+       else if(!strcasecmp(tok, "sql"))
+           {
+           PGVariables.date.format = Date_SQL;
+           dcnt++;
+           }
+       else if(!strcasecmp(tok, "postgres"))
+           {
+           PGVariables.date.format = Date_Postgres;
+           dcnt++;
+           }
+       else if(!strcasecmp(tok, "euro"))
+           {
+           PGVariables.date.euro = TRUE;
+           ecnt++;
+           }
+       else if(!strcasecmp(tok, "us"))
+           {
+           PGVariables.date.euro = FALSE;
+           ecnt++;
+           }
+       else
+           {
+           elog(WARN, "Bad value for date (%s)", tok);
+           }
+       }
+   
+   if(dcnt > 1 || ecnt > 1)
+       elog(NOTICE, "Conflicting settings for date");
+       
+   return TRUE;
+   }
+   
+/*-----------------------------------------------------------------------*/
+struct VariableParsers
+   {
+   const char *name;
+   bool (*parser)(const char *);
+   } VariableParsers[] =
+   {
+       { "date",       parse_date },
+       { "timezone",   parse_null },
+       { NULL }
+   };
+
+/*-----------------------------------------------------------------------*/
 bool SetPGVariable(const char *name, const char *value)
    {
-   elog(NOTICE, "Variable %s set to \"%s\"", name, value);
+   struct VariableParsers *vp;
+   
+   for(vp = VariableParsers; vp->name; vp++)
+       {
+       if(!strcasecmp(vp->name, name))
+           return (vp->parser)(value);
+       }
+       
+   elog(NOTICE, "No such variable %s", name);
 
    return TRUE;
    }
 
+/*-----------------------------------------------------------------------*/
 const char *GetPGVariable(const char *varName)
    {
    return NULL;
    }
+/*-----------------------------------------------------------------------*/
index 2adedf88987a36a0e5aa2d46226a9b9be946265a..07113bd7cf2114553c4e9616eac785940cc626cc 100644 (file)
@@ -7,12 +7,13 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.3 1997/04/04 08:55:29 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.4 1997/04/17 13:50:34 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include      /* for sprintf() */
 #include 
+#include 
 
 #include "postgres.h"
 #ifdef HAVE_FLOAT_H
index f0df5f9de4bafa1009b4418d78c8d55e349a4f7a..888a432ccecf9af034046ac4f4385d26de5f1bdb 100644 (file)
@@ -1,2 +1,48 @@
+/*
+ * Headers for handling of SET var TO statements
+ *
+ * $Id: variable.h,v 1.2 1997/04/17 13:50:57 scrappy Exp $
+ *
+ * $Log: variable.h,v $
+ * Revision 1.2  1997/04/17 13:50:57  scrappy
+ * From: "Martin J. Laubach" 
+ * Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
+ *
+ *   Here a patch that implements a SET date for use by the datetime
+ * stuff. The syntax is
+ *
+ *         SET date TO 'val[,val,...]'
+ *
+ *   where val is us (us dates), euro (european dates), postgres,
+ * iso or sql.
+ *
+ *   Thomas is working on the integration in his datetime module.
+ * I just needed to get the patch out before it went stale :)
+ *
+ * Revision 1.1  1997/04/10 16:53:30  mjl
+ * Initial revision
+ *
+ */
+/*-----------------------------------------------------------------------*/
+
+enum DateFormat { Date_Postgres, Date_SQL, Date_ISO };
+
+/*-----------------------------------------------------------------------*/
+struct PGVariables
+   {
+   struct
+       {
+       bool euro;
+       enum DateFormat format;
+       } date;
+   };
+
+extern struct PGVariables PGVariables;
+
+/*-----------------------------------------------------------------------*/
+bool SetPGVariable(const char *, const char *);
+const char *GetPGVariable(const char *);
+
+/*-----------------------------------------------------------------------*/
 bool SetPGVariable(const char *, const char *);
 const char *GetPGVariable(const char *);