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