Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc0c07ac

Browse files
author
Daniel Shelepanov
committed
[PBCKP-216] Setting C locale globally, env locale is only set while doing while printing big tables
...in order to impose dot-based floating point representation on logging and JSON-representationtags: pg_probackup
1 parent8bb0a61 commitc0c07ac

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed

‎src/pg_probackup.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,10 @@ 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+
memorize_environment_locale();
316+
setlocale(LC_NUMERIC,"C");
317+
314318
/* Get current time */
315319
current_time=time(NULL);
316320

@@ -1024,6 +1028,8 @@ main(int argc, char *argv[])
10241028
break;
10251029
}
10261030

1031+
free_environment_locale();
1032+
10271033
return0;
10281034
}
10291035

‎src/pg_probackup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,8 @@ extern InstanceConfig *readInstanceConfigFile(InstanceState *instanceState);
905905
/* in show.c */
906906
externintdo_show(CatalogState*catalogState,InstanceState*instanceState,
907907
time_trequested_backup_id,boolshow_archive);
908+
externvoidmemorize_environment_locale(void);
909+
externvoidfree_environment_locale(void);
908910

909911
/* in delete.c */
910912
externvoiddo_delete(InstanceState*instanceState,time_tbackup_id);

‎src/show.c

Lines changed: 51 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,43 @@ static PQExpBufferData show_buf;
7172
staticboolfirst_instance= true;
7273
staticint32json_level=0;
7374

75+
staticconstchar*lc_env_locale;
76+
typedefenum {
77+
LOCALE_C,// Used for formatting output to unify the dot-based floating point representation
78+
LOCALE_ENV// Default environment locale
79+
}output_numeric_locale;
80+
81+
#ifdefHAVE_USELOCALE
82+
staticlocale_tenv_locale,c_locale;
83+
#endif
84+
voidmemorize_environment_locale() {
85+
lc_env_locale= (constchar*)getenv("LC_NUMERIC");
86+
lc_env_locale=lc_env_locale!=NULL ?lc_env_locale :"C";
87+
#ifdefHAVE_USELOCALE
88+
env_locale=newlocale(LC_NUMERIC_MASK,lc_env_locale, (locale_t)0);
89+
c_locale=newlocale(LC_NUMERIC_MASK,"C", (locale_t)0);
90+
#else
91+
#ifdefHAVE__CONFIGTHREADLOCALE
92+
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
93+
#endif
94+
#endif
95+
}
96+
97+
voidfree_environment_locale() {
98+
#ifdefHAVE_USELOCALE
99+
freelocale(env_locale);
100+
freelocale(c_locale);
101+
#endif
102+
}
103+
104+
staticvoidset_output_numeric_locale(output_numeric_localeloc) {
105+
#ifdefHAVE_USELOCALE
106+
uselocale(loc==LOCALE_C ?c_locale :env_locale);
107+
#else
108+
setlocale(LC_NUMERIC,loc==LOCALE_C ?"C" :lc_env_locale);
109+
#endif
110+
}
111+
74112
/*
75113
* Entry point of pg_probackup SHOW subcommand.
76114
*/
@@ -513,6 +551,9 @@ show_instance_plain(const char *instance_name, parray *backup_list, bool show_na
513551
ShowBackendRow*rows;
514552
TimeLineIDparent_tli=0;
515553

554+
// Since we've been printing a table, set LC_NUMERIC to its default environment value
555+
set_output_numeric_locale(LOCALE_ENV);
556+
516557
for (i=0;i<SHOW_FIELDS_COUNT;i++)
517558
widths[i]=strlen(names[i]);
518559

@@ -726,6 +767,8 @@ show_instance_plain(const char *instance_name, parray *backup_list, bool show_na
726767
}
727768

728769
pfree(rows);
770+
// Restore the C locale
771+
set_output_numeric_locale(LOCALE_C);
729772
}
730773

731774
/*
@@ -806,6 +849,9 @@ show_archive_plain(const char *instance_name, uint32 xlog_seg_size,
806849
uint32widths_sum=0;
807850
ShowArchiveRow*rows;
808851

852+
// Since we've been printing a table, set LC_NUMERIC to its default environment value
853+
set_output_numeric_locale(LOCALE_ENV);
854+
809855
for (i=0;i<SHOW_ARCHIVE_FIELDS_COUNT;i++)
810856
widths[i]=strlen(names[i]);
811857

@@ -973,6 +1019,8 @@ show_archive_plain(const char *instance_name, uint32 xlog_seg_size,
9731019
}
9741020

9751021
pfree(rows);
1022+
// Restore the C locale
1023+
set_output_numeric_locale(LOCALE_C);
9761024
//TODO: free timelines
9771025
}
9781026

@@ -1045,8 +1093,9 @@ show_archive_json(const char *instance_name, uint32 xlog_seg_size,
10451093
appendPQExpBuffer(buf,"%lu",tlinfo->size);
10461094

10471095
json_add_key(buf,"zratio",json_level);
1096+
10481097
if (tlinfo->size!=0)
1049-
zratio= ((float)xlog_seg_size*tlinfo->n_xlog_files) /tlinfo->size;
1098+
zratio= ((float)xlog_seg_size*tlinfo->n_xlog_files) /tlinfo->size;
10501099
appendPQExpBuffer(buf,"%.2f",zratio);
10511100

10521101
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+
#ifndefWIN32
22+
#include<pwd.h>
23+
#endif
2124
#include<time.h>
2225

2326
#defineMAXPG_LSNCOMPONENT8

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp