aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/ecpglib/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/misc.c')
-rw-r--r--src/interfaces/ecpg/ecpglib/misc.c110
1 files changed, 98 insertions, 12 deletions
diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c
index 48223d05689..5c5128dcef4 100644
--- a/src/interfaces/ecpg/ecpglib/misc.c
+++ b/src/interfaces/ecpg/ecpglib/misc.c
@@ -1,20 +1,24 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.2 2003/03/21 15:31:04 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.3 2003/06/15 04:07:58 momjian Exp $ */
+#define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h"
#include <unistd.h>
+#ifdef USE_THREADS
+#include <pthread.h>
+#endif
#include "ecpgtype.h"
#include "ecpglib.h"
#include "ecpgerrno.h"
#include "extern.h"
#include "sqlca.h"
-static struct sqlca sqlca_init =
+static struct sqlca_t sqlca_init =
{
{
'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '
},
- sizeof(struct sqlca),
+ sizeof(struct sqlca_t),
0,
{
0,
@@ -36,19 +40,54 @@ static struct sqlca sqlca_init =
}
};
-static int simple_debug = 0;
+#ifdef USE_THREADS
+static pthread_key_t sqlca_key;
+static pthread_once_t sqlca_key_once = PTHREAD_ONCE_INIT;
+#else
+static struct sqlca_t sqlca =
+{
+ {
+ 'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '
+ },
+ sizeof(struct sqlca_t),
+ 0,
+ {
+ 0,
+ {
+ 0
+ }
+ },
+ {
+ 'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '
+ },
+ {
+ 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
+#endif
+
+#ifdef USE_THREADS
+static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+static int simple_debug = 0;
static FILE *debugstream = NULL;
-void
-ECPGinit_sqlca(void)
+void ECPGinit_sqlca(struct sqlca_t *sqlca)
{
- memcpy((char *) &sqlca, (char *) &sqlca_init, sizeof(sqlca));
+ memcpy((char *)sqlca, (char *)&sqlca_init, sizeof(struct sqlca_t));
}
bool
ECPGinit(const struct connection * con, const char *connection_name, const int lineno)
{
- ECPGinit_sqlca();
+ struct sqlca_t *sqlca = ECPGget_sqlca();
+ ECPGinit_sqlca(sqlca);
if (con == NULL)
{
ECPGraise(lineno, ECPG_NO_CONN, connection_name ? connection_name : "NULL");
@@ -58,6 +97,33 @@ ECPGinit(const struct connection * con, const char *connection_name, const int l
return (true);
}
+#ifdef USE_THREADS
+static void ecpg_sqlca_key_init(void)
+{
+ pthread_key_create(&sqlca_key, NULL);
+}
+#endif
+
+struct sqlca_t *ECPGget_sqlca(void)
+{
+#ifdef USE_THREADS
+ struct sqlca_t *sqlca;
+
+ pthread_once(&sqlca_key_once, ecpg_sqlca_key_init);
+
+ sqlca = pthread_getspecific(&sqlca_key);
+ if( sqlca == NULL )
+ {
+ sqlca = malloc(sizeof(struct sqlca_t));
+ ECPGinit_sqlca(sqlca);
+ pthread_setspecific(&sqlca_key, sqlca);
+ }
+ return( sqlca );
+#else
+ return( &sqlca );
+#endif
+}
+
bool
ECPGstatus(int lineno, const char *connection_name)
{
@@ -123,9 +189,17 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
void
ECPGdebug(int n, FILE *dbgs)
{
+#ifdef USE_THREADS
+ pthread_mutex_lock(&debug_mutex);
+#endif
+
simple_debug = n;
debugstream = dbgs;
ECPGlog("ECPGdebug: set to %d\n", simple_debug);
+
+#ifdef USE_THREADS
+ pthread_mutex_unlock(&debug_mutex);
+#endif
}
void
@@ -133,12 +207,20 @@ ECPGlog(const char *format,...)
{
va_list ap;
- if (simple_debug)
- {
- char *f = (char *) malloc(strlen(format) + 100);
+#ifdef USE_THREADS
+ pthread_mutex_lock(&debug_mutex);
+#endif
- if (!f)
+ if( simple_debug )
+ {
+ char *f = (char *)malloc(strlen(format) + 100);
+ if( f == NULL )
+ {
+#ifdef USE_THREADS
+ pthread_mutex_unlock(&debug_mutex);
+#endif
return;
+ }
sprintf(f, "[%d]: %s", (int) getpid(), format);
@@ -148,4 +230,8 @@ ECPGlog(const char *format,...)
ECPGfree(f);
}
+
+#ifdef USE_THREADS
+ pthread_mutex_unlock(&debug_mutex);
+#endif
}