1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * pgtime.h |
4 | * PostgreSQL internal timezone library |
5 | * |
6 | * Portions Copyright (c) 1996-2017, PostgreSQL Global Development PGGroup |
7 | * |
8 | * IDENTIFICATION |
9 | * src/include/pgtime.h |
10 | * |
11 | *------------------------------------------------------------------------- |
12 | */ |
13 | #pragma once |
14 | |
15 | #include <cstdint> |
16 | |
17 | /* |
18 | * The API of this library is generally similar to the corresponding |
19 | * C library functions, except that we use pg_time_t which (we hope) is |
20 | * 64 bits wide, and which is most definitely signed not unsigned. |
21 | */ |
22 | |
23 | typedef int64_t pg_time_t; |
24 | |
25 | struct pg_tm |
26 | { |
27 | int tm_sec; |
28 | int tm_min; |
29 | int tm_hour; |
30 | int tm_mday; |
31 | int tm_mon; /* origin 1, not 0! */ |
32 | int tm_year; /* relative to 1900 */ |
33 | int tm_wday; |
34 | int tm_yday; |
35 | int tm_isdst; |
36 | long int tm_gmtoff; |
37 | const char *tm_zone; |
38 | }; |
39 | |
40 | typedef struct pg_tz pg_tz; |
41 | typedef struct pg_tzenum pg_tzenum; |
42 | |
43 | /* Maximum length of a timezone name (not including trailing null) */ |
44 | #define TZ_STRLEN_MAX 255 |
45 | |
46 | /* these functions are in localtime.c */ |
47 | |
48 | struct pg_tm *pg_localtime(const pg_time_t *timep, const pg_tz *tz); |
49 | struct pg_tm *pg_gmtime(const pg_time_t *timep); |
50 | int pg_next_dst_boundary(const pg_time_t *timep, |
51 | long int *before_gmtoff, |
52 | int *before_isdst, |
53 | pg_time_t *boundary, |
54 | long int *after_gmtoff, |
55 | int *after_isdst, |
56 | const pg_tz *tz); |
57 | bool pg_interpret_timezone_abbrev(const char *abbrev, |
58 | const pg_time_t *timep, |
59 | long int *gmtoff, |
60 | int *isdst, |
61 | const pg_tz *tz); |
62 | bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff); |
63 | const char *pg_get_timezone_name(pg_tz *tz); |
64 | bool pg_tz_acceptable(pg_tz *tz); |
65 | |
66 | /* these functions and variables are in pgtz.c */ |
67 | |
68 | pg_tz *session_timezone; |
69 | pg_tz *log_timezone; |
70 | |
71 | void pg_timezone_initialize(void); |
72 | pg_tz *pg_tzset(const char *tzname); |
73 | pg_tz *pg_tzset_offset(long gmtoffset); |
74 | |
75 | pg_tzenum *pg_tzenumerate_start(void); |
76 | pg_tz *pg_tzenumerate_next(pg_tzenum *dir); |
77 | void pg_tzenumerate_end(pg_tzenum *dir); |
78 | |