mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Let initdb detect the date order of the lc_time locale and initialize the
datestyle parameter of the new cluster accordingly.
This commit is contained in:
2
doc/TODO
2
doc/TODO
@ -566,7 +566,7 @@ SQL Commands
|
|||||||
Clients
|
Clients
|
||||||
=======
|
=======
|
||||||
|
|
||||||
* Have initdb set the input DateStyle (MDY or DMY) based on locale?
|
* -Have initdb set the input DateStyle (MDY or DMY) based on locale
|
||||||
* Have pg_ctl look at PGHOST in case it is a socket directory?
|
* Have pg_ctl look at PGHOST in case it is a socket directory?
|
||||||
* Allow pg_ctl to work properly with configuration files located outside
|
* Allow pg_ctl to work properly with configuration files located outside
|
||||||
the PGDATA directory
|
the PGDATA directory
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.37 2005/11/17 22:14:50 tgl Exp $
|
$PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.38 2005/12/09 15:51:13 petere Exp $
|
||||||
-->
|
-->
|
||||||
<chapter Id="runtime-config">
|
<chapter Id="runtime-config">
|
||||||
<title>Server Configuration</title>
|
<title>Server Configuration</title>
|
||||||
@ -32,7 +32,7 @@ $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.37 2005/11/17 22:14:50 tgl Exp $
|
|||||||
<para>
|
<para>
|
||||||
One way to set these parameters is to edit the file
|
One way to set these parameters is to edit the file
|
||||||
<filename>postgresql.conf</><indexterm><primary>postgresql.conf</></>,
|
<filename>postgresql.conf</><indexterm><primary>postgresql.conf</></>,
|
||||||
which is normally kept in the data directory. (<command>initdb</>
|
which is normally kept in the data directory. (<application>initdb</>
|
||||||
installs a default copy there.) An example of what this file might look
|
installs a default copy there.) An example of what this file might look
|
||||||
like is:
|
like is:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
@ -3300,7 +3300,10 @@ SELECT * FROM parent WHERE key = 2400;
|
|||||||
keywords <literal>US</>, <literal>NonEuro</>, and
|
keywords <literal>US</>, <literal>NonEuro</>, and
|
||||||
<literal>NonEuropean</> are synonyms for <literal>MDY</>. See
|
<literal>NonEuropean</> are synonyms for <literal>MDY</>. See
|
||||||
<xref linkend="datatype-datetime"> for more information. The
|
<xref linkend="datatype-datetime"> for more information. The
|
||||||
default is <literal>ISO, MDY</>.
|
built-in default is <literal>ISO, MDY</>, but
|
||||||
|
<application>initdb</application> will initialize the
|
||||||
|
configuration file with a setting that corresponds to the
|
||||||
|
behavior of the chosen <varname>lc_time</varname> locale.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
* Portions taken from FreeBSD.
|
* Portions taken from FreeBSD.
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.100 2005/11/22 18:17:28 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.101 2005/12/09 15:51:14 petere Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -57,11 +57,13 @@
|
|||||||
#ifdef HAVE_LANGINFO_H
|
#ifdef HAVE_LANGINFO_H
|
||||||
#include <langinfo.h>
|
#include <langinfo.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "libpq/pqsignal.h"
|
#include "libpq/pqsignal.h"
|
||||||
#include "mb/pg_wchar.h"
|
#include "mb/pg_wchar.h"
|
||||||
#include "getaddrinfo.h"
|
#include "getaddrinfo.h"
|
||||||
#include "getopt_long.h"
|
#include "getopt_long.h"
|
||||||
|
#include "miscadmin.h"
|
||||||
|
|
||||||
#ifndef HAVE_INT_OPTRESET
|
#ifndef HAVE_INT_OPTRESET
|
||||||
int optreset;
|
int optreset;
|
||||||
@ -186,6 +188,7 @@ static void make_postgres(void);
|
|||||||
static void trapsig(int signum);
|
static void trapsig(int signum);
|
||||||
static void check_ok(void);
|
static void check_ok(void);
|
||||||
static char *escape_quotes(const char *src);
|
static char *escape_quotes(const char *src);
|
||||||
|
static int locale_date_order(const char *locale);
|
||||||
static bool chklocale(const char *locale);
|
static bool chklocale(const char *locale);
|
||||||
static void setlocales(void);
|
static void setlocales(void);
|
||||||
static void usage(const char *progname);
|
static void usage(const char *progname);
|
||||||
@ -1195,6 +1198,20 @@ setup_config(void)
|
|||||||
snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
|
snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time);
|
||||||
conflines = replace_token(conflines, "#lc_time = 'C'", repltok);
|
conflines = replace_token(conflines, "#lc_time = 'C'", repltok);
|
||||||
|
|
||||||
|
switch (locale_date_order(lc_time)) {
|
||||||
|
case DATEORDER_YMD:
|
||||||
|
strcpy(repltok, "datestyle = 'iso, ymd'");
|
||||||
|
break;
|
||||||
|
case DATEORDER_DMY:
|
||||||
|
strcpy(repltok, "datestyle = 'iso, dmy'");
|
||||||
|
break;
|
||||||
|
case DATEORDER_MDY:
|
||||||
|
default:
|
||||||
|
strcpy(repltok, "datestyle = 'iso, mdy'");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
conflines = replace_token(conflines, "#datestyle = 'iso, mdy'", repltok);
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
|
snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
|
||||||
|
|
||||||
writefile(path, conflines);
|
writefile(path, conflines);
|
||||||
@ -2052,6 +2069,60 @@ escape_quotes(const char *src)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine likely date order from locale
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
locale_date_order(const char *locale)
|
||||||
|
{
|
||||||
|
struct tm testtime;
|
||||||
|
char buf[128];
|
||||||
|
char *posD;
|
||||||
|
char *posM;
|
||||||
|
char *posY;
|
||||||
|
char *save;
|
||||||
|
size_t res;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = DATEORDER_MDY; /* default */
|
||||||
|
|
||||||
|
save = setlocale(LC_TIME, NULL);
|
||||||
|
if (!save)
|
||||||
|
return result;
|
||||||
|
save = xstrdup(save);
|
||||||
|
|
||||||
|
setlocale(LC_TIME, locale);
|
||||||
|
|
||||||
|
memset(&testtime, 0, sizeof(testtime));
|
||||||
|
testtime.tm_mday = 22;
|
||||||
|
testtime.tm_mon = 10; /* November, should come out as "11" */
|
||||||
|
testtime.tm_year = 133; /* 2033 */
|
||||||
|
|
||||||
|
res = strftime(buf, sizeof(buf), "%x", &testtime);
|
||||||
|
|
||||||
|
setlocale(LC_TIME, save);
|
||||||
|
free(save);
|
||||||
|
|
||||||
|
if (res == 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
posM = strstr(buf, "11");
|
||||||
|
posD = strstr(buf, "22");
|
||||||
|
posY = strstr(buf, "33");
|
||||||
|
|
||||||
|
if (!posM || !posD || !posY)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
if (posY < posM && posM < posD)
|
||||||
|
result = DATEORDER_YMD;
|
||||||
|
else if (posD < posM)
|
||||||
|
result = DATEORDER_DMY;
|
||||||
|
else
|
||||||
|
result = DATEORDER_MDY;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check if given string is a valid locale specifier
|
* check if given string is a valid locale specifier
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user