diff options
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/execute.c')
-rw-r--r-- | src/interfaces/ecpg/ecpglib/execute.c | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 930b6adbe4f..e8e8fb2b2c3 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -101,10 +101,7 @@ free_statement(struct statement *stmt) free_variable(stmt->outlist); ecpg_free(stmt->command); ecpg_free(stmt->name); -#ifdef HAVE_USELOCALE - if (stmt->clocale) - freelocale(stmt->clocale); -#else +#ifndef HAVE_USELOCALE ecpg_free(stmt->oldlocale); #endif ecpg_free(stmt); @@ -1966,6 +1963,15 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, return false; } +#ifdef ENABLE_THREAD_SAFETY + ecpg_pthreads_init(); +#endif + + con = ecpg_get_connection(connection_name); + + if (!ecpg_init(con, connection_name, lineno)) + return false; + stmt = (struct statement *) ecpg_alloc(sizeof(struct statement), lineno); if (stmt == NULL) @@ -1980,13 +1986,13 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, * treat that situation as if the function doesn't exist. */ #ifdef HAVE_USELOCALE - stmt->clocale = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0); - if (stmt->clocale == (locale_t) 0) - { - ecpg_do_epilogue(stmt); - return false; - } - stmt->oldlocale = uselocale(stmt->clocale); + + /* + * Since ecpg_init() succeeded, we have a connection. Any successful + * connection initializes ecpg_clocale. + */ + Assert(ecpg_clocale); + stmt->oldlocale = uselocale(ecpg_clocale); if (stmt->oldlocale == (locale_t) 0) { ecpg_do_epilogue(stmt); @@ -2005,18 +2011,6 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, setlocale(LC_NUMERIC, "C"); #endif -#ifdef ENABLE_THREAD_SAFETY - ecpg_pthreads_init(); -#endif - - con = ecpg_get_connection(connection_name); - - if (!ecpg_init(con, connection_name, lineno)) - { - ecpg_do_epilogue(stmt); - return false; - } - /* * If statement type is ECPGst_prepnormal we are supposed to prepare the * statement before executing them |