Skip to content

Commit 158bc71

Browse files
author
Daniel Shelepanov
committed
[PBCKP-216] Setting C locale globally, env locale is only set while doing pg_probackup show
...in order to impose dot-based floating point representation for the results (including JSON-packed ones) of other commands
1 parent 8bb0a61 commit 158bc71

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

src/pg_probackup.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,9 @@ main(int argc, char *argv[])
311311
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_probackup"));
312312
PROGRAM_FULL_PATH = palloc0(MAXPGPATH);
313313

314+
// Setting C locale for numeric values in order to impose dot-based floating-point representation
315+
setlocale(LC_NUMERIC, "C");
316+
314317
/* Get current time */
315318
current_time = time(NULL);
316319

src/show.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* show.c: show backup information.
44
*
55
* Portions Copyright (c) 2009-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
6-
* Portions Copyright (c) 2015-2019, Postgres Professional
6+
* Portions Copyright (c) 2015-2022, Postgres Professional
77
*
88
*-------------------------------------------------------------------------
99
*/
@@ -12,6 +12,7 @@
1212

1313
#include <time.h>
1414
#include <dirent.h>
15+
#include <locale.h>
1516
#include <sys/stat.h>
1617

1718
#include "utils/json.h"
@@ -71,6 +72,24 @@ static PQExpBufferData show_buf;
7172
static bool first_instance = true;
7273
static int32 json_level = 0;
7374

75+
typedef enum {
76+
LOCALE_PROBACKUP,
77+
LOCALE_ENV
78+
} output_numeric_locale;
79+
80+
static void set_output_numeric_locale(output_numeric_locale loc) {
81+
const char *l = loc == LOCALE_PROBACKUP ? "C" : (const char*)getenv("LC_NUMERIC");
82+
// Setting environment-specified locale
83+
#ifdef HAVE_USELOCALE
84+
uselocale(newlocale(LC_NUMERIC_MASK, l, (locale_t) 0));
85+
#else
86+
#ifdef HAVE__CONFIGTHREADLOCALE
87+
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
88+
#endif
89+
setlocale(LC_NUMERIC, l);
90+
#endif
91+
}
92+
7493
/*
7594
* Entry point of pg_probackup SHOW subcommand.
7695
*/
@@ -88,6 +107,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
88107
requested_backup_id != INVALID_BACKUP_ID)
89108
elog(ERROR, "You cannot specify --archive and (-i, --backup-id) options together");
90109

110+
set_output_numeric_locale(LOCALE_ENV);
91111
/*
92112
* if instance is not specified,
93113
* show information about all instances in this backup catalog
@@ -110,6 +130,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
110130
show_instance(instanceState, INVALID_BACKUP_ID, true);
111131
}
112132
show_instance_end();
133+
set_output_numeric_locale(LOCALE_PROBACKUP);
113134

114135
return 0;
115136
}
@@ -128,6 +149,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
128149
show_instance(instanceState, requested_backup_id, false);
129150

130151
show_instance_end();
152+
set_output_numeric_locale(LOCALE_PROBACKUP);
131153

132154
return 0;
133155
}
@@ -141,6 +163,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
141163
else
142164
show_backup(instanceState, requested_backup_id);
143165

166+
set_output_numeric_locale(LOCALE_PROBACKUP);
144167
return 0;
145168
}
146169
}
@@ -1045,8 +1068,9 @@ show_archive_json(const char *instance_name, uint32 xlog_seg_size,
10451068
appendPQExpBuffer(buf, "%lu", tlinfo->size);
10461069

10471070
json_add_key(buf, "zratio", json_level);
1071+
10481072
if (tlinfo->size != 0)
1049-
zratio = ((float)xlog_seg_size*tlinfo->n_xlog_files) / tlinfo->size;
1073+
zratio = ((float) xlog_seg_size * tlinfo->n_xlog_files) / tlinfo->size;
10501074
appendPQExpBuffer(buf, "%.2f", zratio);
10511075

10521076
if (tlinfo->closest_backup != NULL)

src/utils/configuration.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
#include "getopt_long.h"
2020

21+
#ifndef WIN32
22+
#include <pwd.h>
23+
#endif
2124
#include <time.h>
2225

2326
#define MAXPG_LSNCOMPONENT 8

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy