From a1f229b19e95ceab78bbd06f7ef1bec92acbe8b4 Mon Sep 17 00:00:00 2001
From: "Marc G. Fournier" <scrappy@hub.org>
Date: Thu, 17 Apr 1997 13:50:57 +0000
Subject: [PATCH] From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at> 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      | 140 ++++++++++++++++++++++++++++++-
 src/backend/utils/adt/datetime.c |   3 +-
 src/include/tcop/variable.h      |  46 ++++++++++
 3 files changed, 187 insertions(+), 2 deletions(-)

diff --git a/src/backend/tcop/variable.c b/src/backend/tcop/variable.c
index e3041361394..424e3d08fbd 100644
--- a/src/backend/tcop/variable.c
+++ b/src/backend/tcop/variable.c
@@ -1,14 +1,152 @@
+/*
+ * 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" <mjl@CSlab.tuwien.ac.at>
+ * 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 <string.h>
 #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;
 	}
+/*-----------------------------------------------------------------------*/
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 2adedf88987..07113bd7cf2 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -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 <stdio.h>		/* for sprintf() */
 #include <string.h>
+#include <limits.h>
 
 #include "postgres.h"
 #ifdef HAVE_FLOAT_H
diff --git a/src/include/tcop/variable.h b/src/include/tcop/variable.h
index f0df5f9de4b..888a432ccec 100644
--- a/src/include/tcop/variable.h
+++ b/src/include/tcop/variable.h
@@ -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" <mjl@CSlab.tuwien.ac.at>
+ * 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 *);
-- 
GitLab