3 #define POSTGRES_ECPG_INTERNAL
17 #ifdef ENABLE_THREAD_SAFETY
20 static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT;
25 #ifdef ENABLE_THREAD_SAFETY
27 ecpg_actual_connection_init(
void)
29 pthread_key_create(&actual_connection_key, NULL);
33 ecpg_pthreads_init(
void)
35 pthread_once(&actual_connection_key_once, ecpg_actual_connection_init);
44 if ((connection_name == NULL) || (strcmp(connection_name,
"CURRENT") == 0))
46 #ifdef ENABLE_THREAD_SAFETY
69 if (strcmp(connection_name, con->
name) == 0)
83 if ((connection_name == NULL) || (strcmp(connection_name,
"CURRENT") == 0))
85 #ifdef ENABLE_THREAD_SAFETY
104 #ifdef ENABLE_THREAD_SAFETY
110 #ifdef ENABLE_THREAD_SAFETY
146 #ifdef ENABLE_THREAD_SAFETY
153 ecpg_log(
"ecpg_finish: connection %s closed\n", act->
name ? act->
name :
"(null)");
167 ecpg_log(
"ecpg_finish: called an extra time\n");
176 if (!
ecpg_init(con, connection_name, lineno))
179 ecpg_log(
"ECPGsetcommit on line %d: action \"%s\"; connection \"%s\"\n", lineno,
mode, con->
name);
192 else if (!con->
autocommit && strncmp(
mode,
"on", strlen(
"on")) == 0)
212 if (!
ecpg_init(con, connection_name, lineno))
215 #ifdef ENABLE_THREAD_SAFETY
246 if (strncmp(
sqlstate,
"00", 2) == 0)
249 ecpg_log(
"ECPGnoticeReceiver: %s\n", message);
265 sqlca->sqlwarn[2] =
'W';
266 sqlca->sqlwarn[0] =
'W';
268 strncpy(
sqlca->sqlerrm.sqlerrmc, message,
sizeof(
sqlca->sqlerrm.sqlerrmc));
269 sqlca->sqlerrm.sqlerrmc[
sizeof(
sqlca->sqlerrm.sqlerrmc) - 1] = 0;
270 sqlca->sqlerrm.sqlerrml = strlen(
sqlca->sqlerrm.sqlerrmc);
290 const char **conn_keywords;
291 const char **conn_values;
318 envname = getenv(
"PG_DBPATH");
326 if (
dbname == NULL && connection_name == NULL)
327 connection_name =
"DEFAULT";
329 #if ENABLE_THREAD_SAFETY
330 ecpg_pthreads_init();
337 ecpg_log(
"ECPGconnect: connection identifier %s is already in use\n",
351 if (strncmp(
dbname,
"tcp:", 4) == 0 || strncmp(
dbname,
"unix:", 5) == 0)
358 if (strncmp(
dbname,
"tcp:", 4) == 0)
360 else if (strncmp(
dbname,
"unix:", 5) == 0)
363 if (strncmp(
dbname + offset,
"postgresql://", strlen(
"postgresql://")) == 0)
371 offset += strlen(
"postgresql://");
373 tmp = strrchr(
dbname + offset,
'?');
391 tmp = strrchr(
dbname + offset,
':');
399 if (strncmp(
dbname,
"unix:", 5) == 0)
406 if (strcmp(
dbname + offset,
"localhost") != 0 &&
407 strcmp(
dbname + offset,
"127.0.0.1") != 0)
409 ecpg_log(
"ECPGconnect: non-localhost access via sockets on line %d\n", lineno);
427 if (*(
dbname + offset) !=
'\0')
438 tmp = strrchr(
dbname,
':');
446 tmp = strrchr(
dbname,
'@');
477 if (passwd && strlen(passwd) > 0)
485 conn_keywords = (
const char **)
ecpg_alloc((connect_params + 1) *
sizeof(
char *), lineno);
486 conn_values = (
const char **)
ecpg_alloc(connect_params *
sizeof(
char *), lineno);
487 if (conn_keywords == NULL || conn_values == NULL)
508 #ifdef ENABLE_THREAD_SAFETY
516 #ifdef HAVE_USELOCALE
519 ecpg_clocale = newlocale(LC_NUMERIC_MASK,
"C", (
locale_t) 0);
522 #ifdef ENABLE_THREAD_SAFETY
547 if (connection_name != NULL)
560 all_connections =
this;
561 #ifdef ENABLE_THREAD_SAFETY
566 ecpg_log(
"ECPGconnect: opening database %s on %s port %s %s%s %s%s\n",
567 realname ? realname :
"<DEFAULT>",
568 host ? host :
"<DEFAULT>",
576 conn_keywords[
i] =
"dbname";
577 conn_values[
i] = realname;
582 conn_keywords[
i] =
"host";
583 conn_values[
i] = host;
588 conn_keywords[
i] =
"port";
589 conn_values[
i] =
port;
594 conn_keywords[
i] =
"user";
595 conn_values[
i] =
user;
598 if (passwd && strlen(passwd) > 0)
600 conn_keywords[
i] =
"password";
601 conn_values[
i] = passwd;
622 for (token1 =
str; *token1 ==
' '; token1++)
625 for (
e = 0; token1[
e] && token1[
e] !=
'=';
e++)
631 for (token2 = token1 +
e + 1; *token2 ==
' '; token2++)
634 for (
a = 0; token2[
a] && token2[
a] !=
'&';
a++)
639 str = token2 +
a + 1;
644 conn_keywords[
i] = token1;
645 conn_values[
i] = token2;
657 conn_keywords[
i] = NULL;
675 const char *db = realname ? realname :
ecpg_gettext(
"<DEFAULT>");
681 #ifdef ENABLE_THREAD_SAFETY
695 #ifdef ENABLE_THREAD_SAFETY
719 #ifdef ENABLE_THREAD_SAFETY
723 if (strcmp(connection_name,
"ALL") == 0)
738 if (!
ecpg_init(con, connection_name, lineno))
740 #ifdef ENABLE_THREAD_SAFETY
749 #ifdef ENABLE_THREAD_SAFETY
static void ecpg_finish(struct connection *act)
static struct connection * ecpg_get_connection_nr(const char *connection_name)
static struct connection * all_connections
bool ECPGsetconn(int lineno, const char *connection_name)
PGconn * ECPGget_PGconn(const char *connection_name)
bool ECPGsetcommit(int lineno, const char *mode, const char *connection_name)
struct connection * ecpg_get_connection(const char *connection_name)
bool ECPGdisconnect(int lineno, const char *connection_name)
static void ECPGnoticeReceiver(void *arg, const PGresult *result)
static struct connection * actual_connection
bool ECPGconnect(int lineno, int c, const char *name, const char *user, const char *passwd, const char *connection_name, int autocommit)
#define ECPG_WARNING_IN_TRANSACTION
#define ECPG_WARNING_UNKNOWN_PORTAL
#define ECPG_WARNING_PORTAL_EXISTS
#define ECPG_WARNING_NO_TRANSACTION
#define ECPG_OUT_OF_MEMORY
#define ECPG_SQLSTATE_NO_ACTIVE_SQL_TRANSACTION
bool ecpg_check_PQresult(PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
bool ecpg_deallocate_all_conn(int lineno, enum COMPAT_MODE c, struct connection *con)
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR
#define ECPG_SQLSTATE_INVALID_CURSOR_NAME
void ecpg_log(const char *format,...) pg_attribute_printf(1
void ecpg_clear_auto_mem(void)
bool ecpg_init(const struct connection *con, const char *connection_name, const int lineno)
#define ECPG_SQLSTATE_ACTIVE_SQL_TRANSACTION
char * ecpg_alloc(long size, int lineno)
char * ecpg_strdup(const char *string, int lineno)
#define ECPG_SQLSTATE_DUPLICATE_CURSOR
void ecpg_init_sqlca(struct sqlca_t *sqlca)
#define ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION
void ecpg_raise(int line, int code, const char *sqlstate, const char *str)
bool ecpg_internal_regression_mode
void ecpg_free(void *ptr)
int errmsg(const char *fmt,...)
PGconn * PQconnectdbParams(const char *const *keywords, const char *const *values, int expand_dbname)
PGTransactionStatusType PQtransactionStatus(const PGconn *conn)
char * PQerrorMessage(const PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
void PQfinish(PGconn *conn)
PQnoticeReceiver PQsetNoticeReceiver(PGconn *conn, PQnoticeReceiver proc, void *arg)
PGresult * PQexec(PGconn *conn, const char *query)
char * PQresultErrorField(const PGresult *res, int fieldcode)
struct sqlca_t * ECPGget_sqlca(void)
Assert(fmt[strlen(fmt) - 1] !='\n')
static PgChecksumMode mode
char * last_dir_separator(const char *filename)
#define PG_DIAG_MESSAGE_PRIMARY
int pthread_mutex_unlock(pthread_mutex_t *mp)
void * pthread_getspecific(pthread_key_t key)
int pthread_mutex_lock(pthread_mutex_t *mp)
void pthread_setspecific(pthread_key_t key, void *val)
CRITICAL_SECTION * pthread_mutex_t
struct ECPGtype_information_cache * cache_head
struct prepared_statement * prep_stmts