Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * compat.c 4 : * Reimplementations of various backend functions. 5 : * 6 : * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group 7 : * 8 : * IDENTIFICATION 9 : * src/bin/pg_waldump/compat.c 10 : * 11 : * This file contains client-side implementations for various backend 12 : * functions that the rm_desc functions in *desc.c files rely on. 13 : * 14 : *------------------------------------------------------------------------- 15 : */ 16 : 17 : /* ugly hack, same as in e.g pg_controldata */ 18 : #define FRONTEND 1 19 : #include "postgres.h" 20 : 21 : #include <time.h> 22 : 23 : #include "utils/datetime.h" 24 : 25 : /* copied from timestamp.c */ 26 : pg_time_t 27 3292 : timestamptz_to_time_t(TimestampTz t) 28 : { 29 : pg_time_t result; 30 : 31 3292 : result = (pg_time_t) (t / USECS_PER_SEC + 32 : ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY)); 33 3292 : return result; 34 : } 35 : 36 : /* 37 : * Stopgap implementation of timestamptz_to_str that doesn't depend on backend 38 : * infrastructure. This will work for timestamps that are within the range 39 : * of the platform time_t type. (pg_time_t is compatible except for possibly 40 : * being wider.) 41 : * 42 : * XXX the return value points to a static buffer, so beware of using more 43 : * than one result value concurrently. 44 : * 45 : * XXX: The backend timestamp infrastructure should instead be split out and 46 : * moved into src/common. That's a large project though. 47 : */ 48 : const char * 49 3292 : timestamptz_to_str(TimestampTz t) 50 : { 51 : static char buf[MAXDATELEN + 1]; 52 : char ts[MAXDATELEN + 1]; 53 : char zone[MAXDATELEN + 1]; 54 3292 : time_t result = (time_t) timestamptz_to_time_t(t); 55 3292 : struct tm *ltime = localtime(&result); 56 : 57 3292 : strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S", ltime); 58 3292 : strftime(zone, sizeof(zone), "%Z", ltime); 59 : 60 3292 : snprintf(buf, sizeof(buf), "%s.%06d %s", 61 3292 : ts, (int) (t % USECS_PER_SEC), zone); 62 : 63 3292 : return buf; 64 : }