diff options
Diffstat (limited to 'src/interfaces/ecpg/lib/connect.c')
-rw-r--r-- | src/interfaces/ecpg/lib/connect.c | 495 |
1 files changed, 0 insertions, 495 deletions
diff --git a/src/interfaces/ecpg/lib/connect.c b/src/interfaces/ecpg/lib/connect.c deleted file mode 100644 index 197f9f1cafd..00000000000 --- a/src/interfaces/ecpg/lib/connect.c +++ /dev/null @@ -1,495 +0,0 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.20 2003/02/13 13:11:52 meskes Exp $ */ - -#include "postgres_fe.h" - -#include "ecpgtype.h" -#include "ecpglib.h" -#include "ecpgerrno.h" -#include "extern.h" -#include "sqlca.h" - -static struct connection *all_connections = NULL, - *actual_connection = NULL; - -struct connection * -ECPGget_connection(const char *connection_name) -{ - struct connection *con = all_connections; - - if (connection_name == NULL || strcmp(connection_name, "CURRENT") == 0) - return actual_connection; - - for (; con && strcmp(connection_name, con->name) != 0; con = con->next); - if (con) - return con; - else - return NULL; -} - -static void -ecpg_finish(struct connection * act) -{ - if (act != NULL) - { - struct ECPGtype_information_cache *cache, - *ptr; - - ECPGlog("ecpg_finish: finishing %s.\n", act->name); - PQfinish(act->connection); - - /* remove act from the list */ - if (act == all_connections) - all_connections = act->next; - else - { - struct connection *con; - - for (con = all_connections; con->next && con->next != act; con = con->next); - if (con->next) - con->next = act->next; - } - - if (actual_connection == act) - actual_connection = all_connections; - - for (cache = act->cache_head; cache; ptr = cache, cache = cache->next, ECPGfree(ptr)); - ECPGfree(act->name); - ECPGfree(act); - } - else - ECPGlog("ecpg_finish: called an extra time.\n"); -} - -bool -ECPGsetcommit(int lineno, const char *mode, const char *connection_name) -{ - struct connection *con = ECPGget_connection(connection_name); - PGresult *results; - - if (!ECPGinit(con, connection_name, lineno)) - return (false); - - ECPGlog("ECPGsetcommit line %d action = %s connection = %s\n", lineno, mode, con->name); - - if (con->autocommit == true && strncmp(mode, "off", strlen("off")) == 0) - { - if (con->committed) - { - if ((results = PQexec(con->connection, "begin transaction")) == NULL) - { - ECPGraise(lineno, ECPG_TRANS, NULL); - return false; - } - PQclear(results); - con->committed = false; - } - con->autocommit = false; - } - else if (con->autocommit == false && strncmp(mode, "on", strlen("on")) == 0) - { - if (!con->committed) - { - if ((results = PQexec(con->connection, "commit")) == NULL) - { - ECPGraise(lineno, ECPG_TRANS, NULL); - return false; - } - PQclear(results); - con->committed = true; - } - con->autocommit = true; - } - - return true; -} - -bool -ECPGsetconn(int lineno, const char *connection_name) -{ - struct connection *con = ECPGget_connection(connection_name); - - if (!ECPGinit(con, connection_name, lineno)) - return (false); - - actual_connection = con; - return true; -} - -static void -ECPGnoticeProcessor_raise(int code, const char *message) -{ - sqlca.sqlcode = code; - strncpy(sqlca.sqlerrm.sqlerrmc, message, sizeof(sqlca.sqlerrm.sqlerrmc)); - sqlca.sqlerrm.sqlerrmc[sizeof(sqlca.sqlerrm.sqlerrmc) - 1] = 0; - sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc); - - /* remove trailing newline */ - if (sqlca.sqlerrm.sqlerrml - && sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml - 1] == '\n') - { - sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml - 1] = 0; - sqlca.sqlerrm.sqlerrml--; - } - - ECPGlog("raising sqlcode %d\n", code); -} - -/* - * I know this is a mess, but we can't redesign the backend - */ - -static void -ECPGnoticeProcessor(void *arg, const char *message) -{ - /* these notices raise an error */ - if (strncmp(message, "WARNING: ", 9)) - { - ECPGlog("ECPGnoticeProcessor: strange warning '%s'\n", message); - ECPGnoticeProcessor_raise(ECPG_WARNING_UNRECOGNIZED, message); - return; - } - - message += 8; - while (*message == ' ') - message++; - ECPGlog("WARNING: %s", message); - - /* WARNING: (transaction aborted): queries ignored until END */ - - /* - * WARNING: current transaction is aborted, queries ignored until end - * of transaction block - */ - if (strstr(message, "queries ignored") && strstr(message, "transaction") - && strstr(message, "aborted")) - { - ECPGnoticeProcessor_raise(ECPG_WARNING_QUERY_IGNORED, message); - return; - } - - /* WARNING: PerformPortalClose: portal "*" not found */ - if ((!strncmp(message, "PerformPortalClose: portal", 26) - || !strncmp(message, "PerformPortalFetch: portal", 26)) - && strstr(message + 26, "not found")) - { - ECPGnoticeProcessor_raise(ECPG_WARNING_UNKNOWN_PORTAL, message); - return; - } - - /* WARNING: BEGIN: already a transaction in progress */ - if (!strncmp(message, "BEGIN: already a transaction in progress", 40)) - { - ECPGnoticeProcessor_raise(ECPG_WARNING_IN_TRANSACTION, message); - return; - } - - /* WARNING: AbortTransaction and not in in-progress state */ - /* WARNING: COMMIT: no transaction in progress */ - /* WARNING: ROLLBACK: no transaction in progress */ - if (!strncmp(message, "AbortTransaction and not in in-progress state", 45) - || !strncmp(message, "COMMIT: no transaction in progress", 34) - || !strncmp(message, "ROLLBACK: no transaction in progress", 36)) - { - ECPGnoticeProcessor_raise(ECPG_WARNING_NO_TRANSACTION, message); - return; - } - - /* WARNING: BlankPortalAssignName: portal * already exists */ - if (!strncmp(message, "BlankPortalAssignName: portal", 29) - && strstr(message + 29, "already exists")) - { - ECPGnoticeProcessor_raise(ECPG_WARNING_PORTAL_EXISTS, message); - return; - } - - /* these are harmless - do nothing */ - - /* - * WARNING: CREATE TABLE / PRIMARY KEY will create implicit index '*' - * for table '*' - */ - - /* - * WARNING: ALTER TABLE ... ADD CONSTRAINT will create implicit - * trigger(s) for FOREIGN KEY check(s) - */ - - /* - * WARNING: CREATE TABLE will create implicit sequence '*' for SERIAL - * column '*.*' - */ - - /* - * WARNING: CREATE TABLE will create implicit trigger(s) for FOREIGN - * KEY check(s) - */ - if ((!strncmp(message, "CREATE TABLE", 12) || !strncmp(message, "ALTER TABLE", 11)) - && strstr(message + 11, "will create implicit")) - return; - - /* WARNING: QUERY PLAN: */ - if (!strncmp(message, "QUERY PLAN:", 11)) /* do we really see these? */ - return; - - /* - * WARNING: DROP TABLE implicitly drops referential integrity trigger - * from table "*" - */ - if (!strncmp(message, "DROP TABLE implicitly drops", 27)) - return; - - /* - * WARNING: Caution: DROP INDEX cannot be rolled back, so don't abort - * now - */ - if (strstr(message, "cannot be rolled back")) - return; - - /* these and other unmentioned should set sqlca.sqlwarn[2] */ - /* WARNING: The ':' operator is deprecated. Use exp(x) instead. */ - /* WARNING: Rel *: Uninitialized page 0 - fixing */ - /* WARNING: PortalHeapMemoryFree: * not in alloc set! */ - /* WARNING: Too old parent tuple found - can't continue vc_repair_frag */ - /* WARNING: identifier "*" will be truncated to "*" */ - /* WARNING: InvalidateSharedInvalid: cache state reset */ - /* WARNING: RegisterSharedInvalid: SI buffer overflow */ - sqlca.sqlwarn[2] = 'W'; - sqlca.sqlwarn[0] = 'W'; -} - -/* this contains some quick hacks, needs to be cleaned up, but it works */ -bool -ECPGconnect(int lineno, const char *name, const char *user, const char *passwd, const char *connection_name, int autocommit) -{ - struct connection *this; - char *dbname = strdup(name), - *host = NULL, - *tmp, - *port = NULL, - *realname = NULL, - *options = NULL; - - ECPGinit_sqlca(); - - if ((this = (struct connection *) ECPGalloc(sizeof(struct connection), lineno)) == NULL) - return false; - - if (dbname == NULL && connection_name == NULL) - connection_name = "DEFAULT"; - - /* get the detail information out of dbname */ - if (strchr(dbname, '@') != NULL) - { - /* old style: dbname[@server][:port] */ - tmp = strrchr(dbname, ':'); - if (tmp != NULL) /* port number given */ - { - port = strdup(tmp + 1); - *tmp = '\0'; - } - - tmp = strrchr(dbname, '@'); - if (tmp != NULL) /* host name given */ - { - host = strdup(tmp + 1); - *tmp = '\0'; - } - realname = strdup(dbname); - } - else if (strncmp(dbname, "tcp:", 4) == 0 || strncmp(dbname, "unix:", 5) == 0) - { - int offset = 0; - - /* - * only allow protocols tcp and unix - */ - if (strncmp(dbname, "tcp:", 4) == 0) - offset = 4; - else if (strncmp(dbname, "unix:", 5) == 0) - offset = 5; - - if (strncmp(dbname + offset, "postgresql://", strlen("postgresql://")) == 0) - { - - /*------ - * new style: - * <tcp|unix>:postgresql://server[:port|:/unixsocket/path:] - * [/db name][?options] - *------ - */ - offset += strlen("postgresql://"); - - tmp = strrchr(dbname + offset, '?'); - if (tmp != NULL) /* options given */ - { - options = strdup(tmp + 1); - *tmp = '\0'; - } - - tmp = strrchr(dbname + offset, '/'); - if (tmp != NULL) /* database name given */ - { - realname = strdup(tmp + 1); - *tmp = '\0'; - } - - tmp = strrchr(dbname + offset, ':'); - if (tmp != NULL) /* port number or Unix socket path given */ - { - char *tmp2; - - *tmp = '\0'; - if ((tmp2 = strchr(tmp + 1, ':')) != NULL) - { - *tmp2 = '\0'; - host = strdup(tmp + 1); - if (strncmp(dbname, "unix:", 5) != 0) - { - ECPGlog("connect: socketname %s given for TCP connection in line %d\n", host, lineno); - ECPGraise(lineno, ECPG_CONNECT, realname ? realname : "<DEFAULT>"); - if (host) - ECPGfree(host); - if (port) - ECPGfree(port); - if (options) - ECPGfree(options); - if (realname) - ECPGfree(realname); - if (dbname) - ECPGfree(dbname); - return false; - } - } - else - port = strdup(tmp + 1); - } - - if (strncmp(dbname, "unix:", 5) == 0) - { - if (strcmp(dbname + offset, "localhost") != 0 && strcmp(dbname + offset, "127.0.0.1") != 0) - { - ECPGlog("connect: non-localhost access via sockets in line %d\n", lineno); - ECPGraise(lineno, ECPG_CONNECT, realname ? realname : "<DEFAULT>"); - if (host) - ECPGfree(host); - if (port) - ECPGfree(port); - if (options) - ECPGfree(options); - if (realname) - ECPGfree(realname); - if (dbname) - ECPGfree(dbname); - return false; - } - } - else - host = strdup(dbname + offset); - - } - else - realname = strdup(dbname); - } - else - realname = strdup(dbname); - - /* add connection to our list */ - if (connection_name != NULL) - this->name = ECPGstrdup(connection_name, lineno); - else - this->name = ECPGstrdup(realname, lineno); - - this->cache_head = NULL; - - if (all_connections == NULL) - this->next = NULL; - else - this->next = all_connections; - - actual_connection = all_connections = this; - - ECPGlog("ECPGconnect: opening database %s on %s port %s %s%s%s%s\n", - realname ? realname : "<DEFAULT>", - host ? host : "<DEFAULT>", - port ? port : "<DEFAULT>", - options ? "with options " : "", options ? options : "", - user ? "for user " : "", user ? user : ""); - - this->connection = PQsetdbLogin(host, port, options, NULL, realname, user, passwd); - - if (PQstatus(this->connection) == CONNECTION_BAD) - { - const char *errmsg = PQerrorMessage(this->connection); - char *db = realname ? realname : "<DEFAULT>"; - - set_backend_err(errmsg, lineno); - ecpg_finish(this); - ECPGlog("connect: could not open database %s on %s port %s %s%s%s%s in line %d\n\t%s\n", - db, - host ? host : "<DEFAULT>", - port ? port : "<DEFAULT>", - options ? "with options " : "", options ? options : "", - user ? "for user " : "", user ? user : "", - lineno, errmsg); - - ECPGraise(lineno, ECPG_CONNECT, db); - if (host) - ECPGfree(host); - if (port) - ECPGfree(port); - if (options) - ECPGfree(options); - if (realname) - ECPGfree(realname); - if (dbname) - ECPGfree(dbname); - return false; - } - - if (host) - ECPGfree(host); - if (port) - ECPGfree(port); - if (options) - ECPGfree(options); - if (realname) - ECPGfree(realname); - if (dbname) - ECPGfree(dbname); - - this->committed = true; - this->autocommit = autocommit; - - PQsetNoticeProcessor(this->connection, &ECPGnoticeProcessor, (void *) this); - - return true; -} - -bool -ECPGdisconnect(int lineno, const char *connection_name) -{ - struct connection *con; - - if (strcmp(connection_name, "ALL") == 0) - { - ECPGinit_sqlca(); - for (con = all_connections; con;) - { - struct connection *f = con; - - con = con->next; - ecpg_finish(f); - } - } - else - { - con = ECPGget_connection(connection_name); - - if (!ECPGinit(con, connection_name, lineno)) - return (false); - else - ecpg_finish(con); - } - - return true; -} |