@@ -72,22 +72,39 @@ static PQExpBufferData show_buf;
72
72
static bool first_instance = true;
73
73
static int32 json_level = 0 ;
74
74
75
+ static const char * lc_env_locale ;
75
76
typedef enum {
76
- LOCALE_PROBACKUP ,
77
+ LOCALE_OUTPUT ,
77
78
LOCALE_ENV
78
79
} output_numeric_locale ;
79
80
81
+ #ifdef HAVE_USELOCALE
82
+ static locale_t env_locale , out_locale ;
83
+ #endif
84
+ void memorize_environment_locale () {
85
+ lc_env_locale = (const char * )getenv ("LC_NUMERIC" );
86
+ lc_env_locale = lc_env_locale != NULL ? lc_env_locale : "C" ;
87
+ #ifdef HAVE_USELOCALE
88
+ env_locale = newlocale (LC_NUMERIC_MASK , lc_env_locale , (locale_t )0 );
89
+ out_locale = newlocale (LC_NUMERIC_MASK , "C" , (locale_t )0 );
90
+ #endif
91
+ }
92
+
93
+ void free_environment_locale () {
94
+ #ifdef HAVE_USELOCALE
95
+ freelocale (env_locale );
96
+ freelocale (out_locale );
97
+ #endif
98
+ }
99
+
80
100
static void set_output_numeric_locale (output_numeric_locale loc ) {
81
- const char * l = loc == LOCALE_PROBACKUP ? "C" :
82
- getenv ("LC_NUMERIC" ) != NULL ? (const char * )getenv ("LC_NUMERIC" ) : "C" ;
83
- // Setting environment-specified locale
84
101
#ifdef HAVE_USELOCALE
85
- uselocale (newlocale ( LC_NUMERIC_MASK , l , ( locale_t ) 0 ) );
102
+ uselocale (loc == LOCALE_OUTPUT ? out_locale : env_locale );
86
103
#else
87
104
#ifdef HAVE__CONFIGTHREADLOCALE
88
105
_configthreadlocale (_ENABLE_PER_THREAD_LOCALE );
89
106
#endif
90
- setlocale (LC_NUMERIC , l );
107
+ setlocale (LC_NUMERIC , loc == LOCALE_OUTPUT ? lc_env_locale : "C" );
91
108
#endif
92
109
}
93
110
@@ -131,7 +148,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
131
148
show_instance (instanceState , INVALID_BACKUP_ID , true);
132
149
}
133
150
show_instance_end ();
134
- set_output_numeric_locale (LOCALE_PROBACKUP );
151
+ set_output_numeric_locale (LOCALE_OUTPUT );
135
152
136
153
return 0 ;
137
154
}
@@ -150,7 +167,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
150
167
show_instance (instanceState , requested_backup_id , false);
151
168
152
169
show_instance_end ();
153
- set_output_numeric_locale (LOCALE_PROBACKUP );
170
+ set_output_numeric_locale (LOCALE_OUTPUT );
154
171
155
172
return 0 ;
156
173
}
@@ -164,7 +181,7 @@ do_show(CatalogState *catalogState, InstanceState *instanceState,
164
181
else
165
182
show_backup (instanceState , requested_backup_id );
166
183
167
- set_output_numeric_locale (LOCALE_PROBACKUP );
184
+ set_output_numeric_locale (LOCALE_OUTPUT );
168
185
return 0 ;
169
186
}
170
187
}
0 commit comments