aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/sysfunc.c
blob: 02d6d6b21a773e23b71ff8a7f60bdce33c94f381 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*-------------------------------------------------------------------------
 *
 * sysfunc.c--
 *	  process system functions and return a string result
 *
 * Notes:
 * 1) I return a string result because most of the functions cannot return any
 *	  normal type anyway (e.g. SYS_DATE, SYS_TIME, etc...), and the few that
 *	  might (SYS_UID or whatever) can just return it as a string - no problem.
 *	  This keeps the function flexible enough to be of good use.
 *
 * Written by Chad Robinson, chadr@brttech.com
 * Last modified: 04/27/1996
 * -------------------------------------------------------------------------
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <config.h>
#include <postgres.h>
#include <miscadmin.h>
#include <parser/sysfunc.h>

/*
 * Can't get much more obvious than this.  Might need to replace localtime()
 * on older systems...
 */
static char    *
Sysfunc_system_date(void)
{
	time_t			cur_time_secs;
	struct tm	   *cur_time_expanded;
	static char		buf[12];	/* Just for safety, y'understand... */

	time(&cur_time_secs);
	cur_time_expanded = localtime(&cur_time_secs);
	if (EuroDates == 1)
		sprintf(buf, "%2.2d-%2.2d-%4.4d", cur_time_expanded->tm_mday,
		cur_time_expanded->tm_mon + 1, cur_time_expanded->tm_year + 1900);
	else
		sprintf(buf, "%2.2d-%2.2d-%4.4d", cur_time_expanded->tm_mon + 1,
		  cur_time_expanded->tm_mday, cur_time_expanded->tm_year + 1900);

	return &buf[0];
}

static char    *
Sysfunc_system_time(void)
{
	time_t			cur_time_secs;
	struct tm	   *cur_time_expanded;
	static char		buf[10];	/* Just for safety, y'understand... */

	time(&cur_time_secs);
	cur_time_expanded = localtime(&cur_time_secs);
	sprintf(buf, "%2.2d:%2.2d:%2.2d", cur_time_expanded->tm_hour,
			cur_time_expanded->tm_min, cur_time_expanded->tm_sec);

	return &buf[0];
}

char		   *
SystemFunctionHandler(char *funct)
{
	if (!strcmp(funct, "SYS_DATE"))
		return Sysfunc_system_date();
	if (!strcmp(funct, "SYS_TIME"))
		return Sysfunc_system_time();
	return "*unknown function*";
}

#ifdef SYSFUNC_TEST
/*
 * Chad's rule of coding #4 - never delete a test function, even a stupid
 * one - you always need it 10 minutes after you delete it.
 */
void
main(void)
{
	printf("Current system date: %s\n", SystemFunctionHandler("SYS_DATE"));
	return;
}

#endif