mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Forgot some files...
This commit is contained in:
		
							parent
							
								
									a4f25b6a9c
								
							
						
					
					
						commit
						bb3730893b
					
				
							
								
								
									
										3
									
								
								src/interfaces/ecpg/include/pgtypes_error.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/interfaces/ecpg/include/pgtypes_error.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| #define	PGTYPES_OVERFLOW	201 | ||||
| #define PGTYPES_BAD_NUMERIC	202 | ||||
| #define PGTYPES_DIVIDE_ZERO	203 | ||||
							
								
								
									
										48
									
								
								src/interfaces/ecpg/include/pgtypes_numeric.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/interfaces/ecpg/include/pgtypes_numeric.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| #ifndef PGTYPES_NUMERIC | ||||
| #define PGTYPES_NUMERIC | ||||
| 
 | ||||
| typedef unsigned char NumericDigit; | ||||
| typedef struct NumericVar | ||||
| { | ||||
| 		int ndigits;		/* number of digits in digits[] - can be 0! */ | ||||
| 		int weight;		/* weight of first digit */ | ||||
| 		int rscale;		/* result scale */ | ||||
| 		int dscale;		/* display scale */ | ||||
| 		int sign;		/* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */ | ||||
| 		NumericDigit *buf;	/* start of alloc'd space for digits[] */ | ||||
| 		NumericDigit *digits;	/* decimal digits */ | ||||
| } NumericVar; | ||||
| 
 | ||||
| NumericVar *PGTYPESnew(void); | ||||
| void PGTYPESnumeric_free(NumericVar *); | ||||
| NumericVar *PGTYPESnumeric_aton(char *, char **); | ||||
| char *PGTYPESnumeric_ntoa(NumericVar *); | ||||
| int PGTYPESnumeric_add(NumericVar *, NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_sub(NumericVar *, NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_mul(NumericVar *, NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_div(NumericVar *, NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_cmp(NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_iton(signed int, NumericVar *); | ||||
| int PGTYPESnumeric_lton(signed long int, NumericVar *); | ||||
| int PGTYPESnumeric_copy(NumericVar *, NumericVar *); | ||||
| int PGTYPESnumeric_dton(double, NumericVar *); | ||||
| int PGTYPESnumeric_ntod(NumericVar *, double *); | ||||
| int PGTYPESnumeric_ntoi(NumericVar *, int *); | ||||
| int PGTYPESnumeric_ntol(NumericVar *, long *); | ||||
| 
 | ||||
| int decadd(NumericVar *, NumericVar *, NumericVar *); | ||||
| int deccmp(NumericVar *, NumericVar *); | ||||
| void deccopy(NumericVar *, NumericVar *); | ||||
| int deccvasc(char *, int, NumericVar *); | ||||
| int deccvdbl(double, NumericVar *); | ||||
| int deccvint(int, NumericVar *); | ||||
| int deccvlong(long, NumericVar *); | ||||
| int decdiv(NumericVar *, NumericVar *, NumericVar *); | ||||
| int decmul(NumericVar *, NumericVar *, NumericVar *); | ||||
| int decsub(NumericVar *, NumericVar *, NumericVar *); | ||||
| int dectoasc(NumericVar *, char *, int, int); | ||||
| int dectodbl(NumericVar *, double *); | ||||
| int dectoint(NumericVar *, int *); | ||||
| int dectolong(NumericVar *, long *); | ||||
| 
 | ||||
| #endif /* PGTYPES_NUMERIC */ | ||||
| @ -1,47 +0,0 @@ | ||||
| #-------------------------------------------------------------------------
 | ||||
| #
 | ||||
| # Makefile for ecpg library
 | ||||
| #
 | ||||
| # Copyright (c) 1994, Regents of the University of California
 | ||||
| #
 | ||||
| # $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile,v 1.19 2003/02/13 13:11:52 meskes Exp $
 | ||||
| #
 | ||||
| #-------------------------------------------------------------------------
 | ||||
| 
 | ||||
| subdir = src/interfaces/ecpg/lib | ||||
| top_builddir = ../../../.. | ||||
| include $(top_builddir)/src/Makefile.global | ||||
| 
 | ||||
| NAME= ecpg | ||||
| SO_MAJOR_VERSION= 3 | ||||
| SO_MINOR_VERSION= 4.2 | ||||
| 
 | ||||
| override CPPFLAGS := -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(libpq_srcdir) $(CPPFLAGS) | ||||
| 
 | ||||
| 
 | ||||
| OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
 | ||||
| 	connect.o misc.o | ||||
| 
 | ||||
| SHLIB_LINK= $(libpq) | ||||
| 
 | ||||
| all: all-lib | ||||
| 
 | ||||
| # Shared library stuff
 | ||||
| include $(top_srcdir)/src/Makefile.shlib | ||||
| 
 | ||||
| install: all installdirs install-lib | ||||
| 
 | ||||
| installdirs: | ||||
| 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||
| 
 | ||||
| uninstall: uninstall-lib | ||||
| 
 | ||||
| clean distclean maintainer-clean: clean-lib | ||||
| 	rm -f $(OBJS) | ||||
| 
 | ||||
| depend dep: | ||||
| 	$(CC) -MM $(CFLAGS) *.c >depend | ||||
| 
 | ||||
| ifeq (depend,$(wildcard depend)) | ||||
| include depend | ||||
| endif | ||||
| @ -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; | ||||
| } | ||||
| @ -1,398 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.24 2002/09/04 20:31:46 momjian Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "ecpgerrno.h" | ||||
| #include "extern.h" | ||||
| #include "sqlca.h" | ||||
| 
 | ||||
| bool | ||||
| ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, | ||||
| 			 enum ECPGttype type, enum ECPGttype ind_type, | ||||
| 			 char *var, char *ind, long varcharsize, long offset, | ||||
| 			 long ind_offset, bool isarray) | ||||
| { | ||||
| 	char	   *pval = (char *) PQgetvalue(results, act_tuple, act_field); | ||||
| 
 | ||||
| 	ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld\n", lineno, pval ? pval : "", offset); | ||||
| 
 | ||||
| 	/* pval is a pointer to the value */ | ||||
| 	/* let's check is it really is an array if it should be one */ | ||||
| 	if (isarray) | ||||
| 	{ | ||||
| 		if (*pval != '{') | ||||
| 		{ | ||||
| 			ECPGraise(lineno, ECPG_DATA_NOT_ARRAY, NULL); | ||||
| 			return (false); | ||||
| 		} | ||||
| 
 | ||||
| 		switch (type) | ||||
| 		{ | ||||
| 			case ECPGt_char: | ||||
| 			case ECPGt_unsigned_char: | ||||
| 			case ECPGt_varchar: | ||||
| 				break; | ||||
| 
 | ||||
| 			default: | ||||
| 				pval++; | ||||
| 				break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* We will have to decode the value */ | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * check for null value and set indicator accordingly | ||||
| 	 */ | ||||
| 	switch (ind_type) | ||||
| 	{ | ||||
| 		case ECPGt_short: | ||||
| 		case ECPGt_unsigned_short: | ||||
| /*			((short *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/ | ||||
| 			*((short *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field); | ||||
| 			break; | ||||
| 		case ECPGt_int: | ||||
| 		case ECPGt_unsigned_int: | ||||
| /*			((int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/ | ||||
| 			*((int *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field); | ||||
| 			break; | ||||
| 		case ECPGt_long: | ||||
| 		case ECPGt_unsigned_long: | ||||
| /*			((long *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/ | ||||
| 			*((long *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field); | ||||
| 			break; | ||||
| #ifdef HAVE_LONG_LONG_INT_64 | ||||
| 		case ECPGt_long_long: | ||||
| 		case ECPGt_unsigned_long_long: | ||||
| /*			((long long int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field);*/ | ||||
| 			*((long long int *) (ind + ind_offset * act_tuple)) = -PQgetisnull(results, act_tuple, act_field); | ||||
| 			break; | ||||
| /*		case ECPGt_unsigned_long_long:
 | ||||
| 			((unsigned long long int *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field); | ||||
| 			break;*/ | ||||
| #endif   /* HAVE_LONG_LONG_INT_64 */ | ||||
| 		case ECPGt_NO_INDICATOR: | ||||
| 			if (PQgetisnull(results, act_tuple, act_field)) | ||||
| 			{ | ||||
| 				ECPGraise(lineno, ECPG_MISSING_INDICATOR, NULL); | ||||
| 				return (false); | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			ECPGraise(lineno, ECPG_UNSUPPORTED, ECPGtype_name(ind_type)); | ||||
| 			return (false); | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	do | ||||
| 	{ | ||||
| 		switch (type) | ||||
| 		{ | ||||
| 				long		res; | ||||
| 				unsigned long ures; | ||||
| 				double		dres; | ||||
| 				char	   *scan_length; | ||||
| 
 | ||||
| 			case ECPGt_short: | ||||
| 			case ECPGt_int: | ||||
| 			case ECPGt_long: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| 					res = strtol(pval, &scan_length, 10); | ||||
| 					if ((isarray && *scan_length != ',' && *scan_length != '}') | ||||
| 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */ | ||||
| 					{ | ||||
| 						ECPGraise(lineno, ECPG_INT_FORMAT, pval); | ||||
| 						return (false); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 					res = 0L; | ||||
| 
 | ||||
| 				switch (type) | ||||
| 				{ | ||||
| 					case ECPGt_short: | ||||
| /*						((short *) var)[act_tuple] = (short) res;*/ | ||||
| 						*((short *) (var + offset * act_tuple)) = (short) res; | ||||
| 						break; | ||||
| 					case ECPGt_int: | ||||
| /*						((int *) var)[act_tuple] = (int) res;*/ | ||||
| 						*((int *) (var + offset * act_tuple)) = (int) res; | ||||
| 						break; | ||||
| 					case ECPGt_long: | ||||
| /*						((long *) var)[act_tuple] = res;*/ | ||||
| 						*((long *) (var + offset * act_tuple)) = (long) res; | ||||
| 						break; | ||||
| 					default: | ||||
| 						/* Cannot happen */ | ||||
| 						break; | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGt_unsigned_short: | ||||
| 			case ECPGt_unsigned_int: | ||||
| 			case ECPGt_unsigned_long: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| 					ures = strtoul(pval, &scan_length, 10); | ||||
| 					if ((isarray && *scan_length != ',' && *scan_length != '}') | ||||
| 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */ | ||||
| 					{ | ||||
| 						ECPGraise(lineno, ECPG_UINT_FORMAT, pval); | ||||
| 						return (false); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 					ures = 0L; | ||||
| 
 | ||||
| 				switch (type) | ||||
| 				{ | ||||
| 					case ECPGt_unsigned_short: | ||||
| /*						((unsigned short *) var)[act_tuple] = (unsigned short) ures;*/ | ||||
| 						*((unsigned short *) (var + offset * act_tuple)) = (unsigned short) ures; | ||||
| 						break; | ||||
| 					case ECPGt_unsigned_int: | ||||
| /*						((unsigned int *) var)[act_tuple] = (unsigned int) ures;*/ | ||||
| 						*((unsigned int *) (var + offset * act_tuple)) = (unsigned int) ures; | ||||
| 						break; | ||||
| 					case ECPGt_unsigned_long: | ||||
| /*						((unsigned long *) var)[act_tuple] = ures;*/ | ||||
| 						*((unsigned long *) (var + offset * act_tuple)) = (unsigned long) ures; | ||||
| 						break; | ||||
| 					default: | ||||
| 						/* Cannot happen */ | ||||
| 						break; | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| #ifdef HAVE_LONG_LONG_INT_64 | ||||
| #ifdef HAVE_STRTOLL | ||||
| 			case ECPGt_long_long: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| /*					((long long int *) var)[act_tuple] = strtoll(pval, &scan_length, 10);*/ | ||||
| 					*((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10); | ||||
| 					if ((isarray && *scan_length != ',' && *scan_length != '}') | ||||
| 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */ | ||||
| 					{ | ||||
| 						ECPGraise(lineno, ECPG_INT_FORMAT, pval); | ||||
| 						return (false); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| /*					((long long int *) var)[act_tuple] = (long long) 0;*/ | ||||
| 					*((long long int *) (var + offset * act_tuple)) = (long long) 0; | ||||
| 
 | ||||
| 				break; | ||||
| #endif   /* HAVE_STRTOLL */ | ||||
| #ifdef HAVE_STRTOULL | ||||
| 			case ECPGt_unsigned_long_long: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| /*					((unsigned long long int *) var)[act_tuple] = strtoull(pval, &scan_length, 10);*/ | ||||
| 					*((unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10); | ||||
| 					if ((isarray && *scan_length != ',' && *scan_length != '}') | ||||
| 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */ | ||||
| 					{ | ||||
| 						ECPGraise(lineno, ECPG_UINT_FORMAT, pval); | ||||
| 						return (false); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| /*					((unsigned long long int *) var)[act_tuple] = (long long) 0;*/ | ||||
| 					*((unsigned long long int *) (var + offset * act_tuple)) = (long long) 0; | ||||
| 
 | ||||
| 				break; | ||||
| #endif   /* HAVE_STRTOULL */ | ||||
| #endif   /* HAVE_LONG_LONG_INT_64 */ | ||||
| 
 | ||||
| 			case ECPGt_float: | ||||
| 			case ECPGt_double: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| 					if (isarray && *pval == '"') | ||||
| 						dres = strtod(pval + 1, &scan_length); | ||||
| 					else | ||||
| 						dres = strtod(pval, &scan_length); | ||||
| 
 | ||||
| 					if (isarray && *scan_length == '"') | ||||
| 						scan_length++; | ||||
| 
 | ||||
| 					if ((isarray && *scan_length != ',' && *scan_length != '}') | ||||
| 						|| (!isarray && *scan_length != '\0'))	/* Garbage left */ | ||||
| 					{ | ||||
| 						ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval); | ||||
| 						return (false); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 					dres = 0.0; | ||||
| 
 | ||||
| 				switch (type) | ||||
| 				{ | ||||
| 					case ECPGt_float: | ||||
| /*						((float *) var)[act_tuple] = dres;*/ | ||||
| 						*((float *) (var + offset * act_tuple)) = dres; | ||||
| 						break; | ||||
| 					case ECPGt_double: | ||||
| /*						((double *) var)[act_tuple] = dres;*/ | ||||
| 						*((double *) (var + offset * act_tuple)) = dres; | ||||
| 						break; | ||||
| 					default: | ||||
| 						/* Cannot happen */ | ||||
| 						break; | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGt_bool: | ||||
| 				if (pval) | ||||
| 				{ | ||||
| 					if (pval[0] == 'f' && pval[1] == '\0') | ||||
| 					{ | ||||
| 						if (offset == sizeof(char)) | ||||
| /*							((char *) var)[act_tuple] = false;*/ | ||||
| 							*((char *) (var + offset * act_tuple)) = false; | ||||
| 						else if (offset == sizeof(int)) | ||||
| /*							((int *) var)[act_tuple] = false;*/ | ||||
| 							*((int *) (var + offset * act_tuple)) = false; | ||||
| 						else | ||||
| 							ECPGraise(lineno, ECPG_CONVERT_BOOL, "different size"); | ||||
| 						break; | ||||
| 					} | ||||
| 					else if (pval[0] == 't' && pval[1] == '\0') | ||||
| 					{ | ||||
| 						if (offset == sizeof(char)) | ||||
| /*							((char *) var)[act_tuple] = true;*/ | ||||
| 							*((char *) (var + offset * act_tuple)) = true; | ||||
| 						else if (offset == sizeof(int)) | ||||
| /*							((int *) var)[act_tuple] = true;*/ | ||||
| 							*((int *) (var + offset * act_tuple)) = true; | ||||
| 						else | ||||
| 							ECPGraise(lineno, ECPG_CONVERT_BOOL, "different size"); | ||||
| 						break; | ||||
| 					} | ||||
| 					else if (pval[0] == '\0' && PQgetisnull(results, act_tuple, act_field)) | ||||
| 					{ | ||||
| 						/* NULL is valid */ | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				ECPGraise(lineno, ECPG_CONVERT_BOOL, pval); | ||||
| 				return (false); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGt_char: | ||||
| 			case ECPGt_unsigned_char: | ||||
| 				{ | ||||
| 					strncpy((char *) ((long) var + offset * act_tuple), pval, varcharsize); | ||||
| 					if (varcharsize && varcharsize < strlen(pval)) | ||||
| 					{ | ||||
| 						/* truncation */ | ||||
| 						switch (ind_type) | ||||
| 						{ | ||||
| 							case ECPGt_short: | ||||
| 							case ECPGt_unsigned_short: | ||||
| /*								((short *) ind)[act_tuple] = strlen(pval);*/ | ||||
| 								*((short *) (ind + ind_offset * act_tuple)) = strlen(pval); | ||||
| 								break; | ||||
| 							case ECPGt_int: | ||||
| 							case ECPGt_unsigned_int: | ||||
| /*								((int *) ind)[act_tuple] = strlen(pval);*/ | ||||
| 								*((int *) (ind + ind_offset * act_tuple)) = strlen(pval); | ||||
| 								break; | ||||
| 							case ECPGt_long: | ||||
| 							case ECPGt_unsigned_long: | ||||
| /*								((long *) ind)[act_tuple] = strlen(pval);*/ | ||||
| 								*((long *) (ind + ind_offset * act_tuple)) = strlen(pval); | ||||
| 								break; | ||||
| #ifdef HAVE_LONG_LONG_INT_64 | ||||
| 							case ECPGt_long_long: | ||||
| 							case ECPGt_unsigned_long_long: | ||||
| 								*((long long int *) (ind + ind_offset * act_tuple)) = strlen(pval); | ||||
| 								break; | ||||
| #endif   /* HAVE_LONG_LONG_INT_64 */ | ||||
| 							default: | ||||
| 								break; | ||||
| 						} | ||||
| 						sqlca.sqlwarn[0] = sqlca.sqlwarn[1] = 'W'; | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGt_varchar: | ||||
| 				{ | ||||
| 					struct ECPGgeneric_varchar *variable = | ||||
| 					(struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple); | ||||
| 
 | ||||
| 					variable->len = strlen(pval); | ||||
| 					if (varcharsize == 0) | ||||
| 						strncpy(variable->arr, pval, variable->len); | ||||
| 					else | ||||
| 						strncpy(variable->arr, pval, varcharsize); | ||||
| 
 | ||||
| 					if (varcharsize > 0 && variable->len > varcharsize) | ||||
| 					{ | ||||
| 						/* truncation */ | ||||
| 						switch (ind_type) | ||||
| 						{ | ||||
| 							case ECPGt_short: | ||||
| 							case ECPGt_unsigned_short: | ||||
| /*								((short *) ind)[act_tuple] = variable->len;*/ | ||||
| 								*((short *) (ind + offset * act_tuple)) = variable->len; | ||||
| 								break; | ||||
| 							case ECPGt_int: | ||||
| 							case ECPGt_unsigned_int: | ||||
| /*								((int *) ind)[act_tuple] = variable->len;*/ | ||||
| 								*((int *) (ind + offset * act_tuple)) = variable->len; | ||||
| 								break; | ||||
| 							case ECPGt_long: | ||||
| 							case ECPGt_unsigned_long: | ||||
| /*								((long *) ind)[act_tuple] = variable->len;*/ | ||||
| 								*((long *) (ind + offset * act_tuple)) = variable->len; | ||||
| 								break; | ||||
| #ifdef HAVE_LONG_LONG_INT_64 | ||||
| 							case ECPGt_long_long: | ||||
| 							case ECPGt_unsigned_long_long: | ||||
| 								*((long long int *) (ind + ind_offset * act_tuple)) = variable->len; | ||||
| 								break; | ||||
| #endif   /* HAVE_LONG_LONG_INT_64 */ | ||||
| 							default: | ||||
| 								break; | ||||
| 						} | ||||
| 						sqlca.sqlwarn[0] = sqlca.sqlwarn[1] = 'W'; | ||||
| 
 | ||||
| 						variable->len = varcharsize; | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 			default: | ||||
| 				ECPGraise(lineno, ECPG_UNSUPPORTED, ECPGtype_name(type)); | ||||
| 				return (false); | ||||
| 				break; | ||||
| 		} | ||||
| 		if (isarray) | ||||
| 		{ | ||||
| 			bool		string = false; | ||||
| 
 | ||||
| 			/* set array to next entry */ | ||||
| 			++act_tuple; | ||||
| 
 | ||||
| 			/* set pval to the next entry */ | ||||
| 			for (; string || (*pval != ',' && *pval != '}'); ++pval) | ||||
| 				if (*pval == '"') | ||||
| 					string = string ? false : true; | ||||
| 
 | ||||
| 			if (*pval == ',') | ||||
| 				++pval; | ||||
| 		} | ||||
| 	} while (isarray && *pval != '}'); | ||||
| 
 | ||||
| 	return (true); | ||||
| } | ||||
| @ -1,449 +0,0 @@ | ||||
| /* dynamic SQL support routines
 | ||||
|  * | ||||
|  * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.23 2002/09/04 20:31:46 momjian Exp $ | ||||
|  */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| #include "pg_type.h" | ||||
| 
 | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "ecpgerrno.h" | ||||
| #include "extern.h" | ||||
| #include "sqlca.h" | ||||
| #include "sql3types.h" | ||||
| 
 | ||||
| struct descriptor *all_descriptors = NULL; | ||||
| 
 | ||||
| /* old internal convenience function that might go away later */ | ||||
| static PGresult | ||||
| 		   * | ||||
| ECPGresultByDescriptor(int line, const char *name) | ||||
| { | ||||
| 	PGresult  **resultpp = ECPGdescriptor_lvalue(line, name); | ||||
| 
 | ||||
| 	if (resultpp) | ||||
| 		return *resultpp; | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static unsigned int | ||||
| ECPGDynamicType_DDT(Oid type) | ||||
| { | ||||
| 	switch (type) | ||||
| 	{ | ||||
| 		case DATEOID: | ||||
| 			return SQL3_DDT_DATE; | ||||
| 		case TIMEOID: | ||||
| 			return SQL3_DDT_TIME; | ||||
| 		case TIMESTAMPOID: | ||||
| 			return SQL3_DDT_TIMESTAMP; | ||||
| 		case TIMESTAMPTZOID: | ||||
| 			return SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE; | ||||
| 		case TIMETZOID: | ||||
| 			return SQL3_DDT_TIME_WITH_TIME_ZONE; | ||||
| 		default: | ||||
| 			return SQL3_DDT_ILLEGAL; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGget_desc_header(int lineno, char *desc_name, int *count) | ||||
| { | ||||
| 	PGresult   *ECPGresult; | ||||
| 
 | ||||
| 	ECPGinit_sqlca(); | ||||
| 	ECPGresult = ECPGresultByDescriptor(lineno, desc_name); | ||||
| 	if (!ECPGresult) | ||||
| 		return false; | ||||
| 
 | ||||
| 	*count = PQnfields(ECPGresult); | ||||
| 	sqlca.sqlerrd[2] = 1; | ||||
| 	ECPGlog("ECPGget_desc_header: found %d attributes.\n", *count); | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| get_int_item(int lineno, void *var, enum ECPGttype vartype, int value) | ||||
| { | ||||
| 	switch (vartype) | ||||
| 	{ | ||||
| 		case ECPGt_short: | ||||
| 			*(short *) var = (short) value; | ||||
| 			break; | ||||
| 		case ECPGt_int: | ||||
| 			*(int *) var = (int) value; | ||||
| 			break; | ||||
| 		case ECPGt_long: | ||||
| 			*(long *) var = (long) value; | ||||
| 			break; | ||||
| 		case ECPGt_unsigned_short: | ||||
| 			*(unsigned short *) var = (unsigned short) value; | ||||
| 			break; | ||||
| 		case ECPGt_unsigned_int: | ||||
| 			*(unsigned int *) var = (unsigned int) value; | ||||
| 			break; | ||||
| 		case ECPGt_unsigned_long: | ||||
| 			*(unsigned long *) var = (unsigned long) value; | ||||
| 			break; | ||||
| #ifdef HAVE_LONG_LONG_INT_64 | ||||
| 		case ECPGt_long_long: | ||||
| 			*(long long int *) var = (long long int) value; | ||||
| 			break; | ||||
| 		case ECPGt_unsigned_long_long: | ||||
| 			*(unsigned long long int *) var = (unsigned long long int) value; | ||||
| 			break; | ||||
| #endif   /* HAVE_LONG_LONG_INT_64 */ | ||||
| 		case ECPGt_float: | ||||
| 			*(float *) var = (float) value; | ||||
| 			break; | ||||
| 		case ECPGt_double: | ||||
| 			*(double *) var = (double) value; | ||||
| 			break; | ||||
| 		default: | ||||
| 			ECPGraise(lineno, ECPG_VAR_NOT_NUMERIC, NULL); | ||||
| 			return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int varcharsize) | ||||
| { | ||||
| 	switch (vartype) | ||||
| 	{ | ||||
| 		case ECPGt_char: | ||||
| 		case ECPGt_unsigned_char: | ||||
| 			strncpy((char *) var, value, varcharsize); | ||||
| 			break; | ||||
| 		case ECPGt_varchar: | ||||
| 			{ | ||||
| 				struct ECPGgeneric_varchar *variable = | ||||
| 				(struct ECPGgeneric_varchar *) var; | ||||
| 
 | ||||
| 				if (varcharsize == 0) | ||||
| 					strncpy(variable->arr, value, strlen(value)); | ||||
| 				else | ||||
| 					strncpy(variable->arr, value, varcharsize); | ||||
| 
 | ||||
| 				variable->len = strlen(value); | ||||
| 				if (varcharsize > 0 && variable->len > varcharsize) | ||||
| 					variable->len = varcharsize; | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			ECPGraise(lineno, ECPG_VAR_NOT_CHAR, NULL); | ||||
| 			return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGget_desc(int lineno, char *desc_name, int index,...) | ||||
| { | ||||
| 	va_list		args; | ||||
| 	PGresult   *ECPGresult; | ||||
| 	enum ECPGdtype type; | ||||
| 	int			ntuples, | ||||
| 				act_tuple; | ||||
| 	struct variable data_var; | ||||
| 
 | ||||
| 	va_start(args, index); | ||||
| 	ECPGinit_sqlca(); | ||||
| 	ECPGresult = ECPGresultByDescriptor(lineno, desc_name); | ||||
| 	if (!ECPGresult) | ||||
| 		return (false); | ||||
| 
 | ||||
| 	ntuples = PQntuples(ECPGresult); | ||||
| 	if (ntuples < 1) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_NOT_FOUND, NULL); | ||||
| 		return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	if (index < 1 || index > PQnfields(ECPGresult)) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_INVALID_DESCRIPTOR_INDEX, NULL); | ||||
| 		return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	ECPGlog("ECPGget_desc: reading items for tuple %d\n", index); | ||||
| 	--index; | ||||
| 
 | ||||
| 	type = va_arg(args, enum ECPGdtype); | ||||
| 
 | ||||
| 	memset(&data_var, 0, sizeof data_var); | ||||
| 	data_var.type = ECPGt_EORT; | ||||
| 	data_var.ind_type = ECPGt_NO_INDICATOR; | ||||
| 
 | ||||
| 	while (type != ECPGd_EODT) | ||||
| 	{ | ||||
| 		char		type_str[20]; | ||||
| 		long		varcharsize; | ||||
| 		long		offset; | ||||
| 		long		arrsize; | ||||
| 		enum ECPGttype vartype; | ||||
| 		void	   *var; | ||||
| 
 | ||||
| 		vartype = va_arg(args, enum ECPGttype); | ||||
| 		var = va_arg(args, void *); | ||||
| 		varcharsize = va_arg(args, long); | ||||
| 		arrsize = va_arg(args, long); | ||||
| 		offset = va_arg(args, long); | ||||
| 
 | ||||
| 		switch (type) | ||||
| 		{ | ||||
| 			case (ECPGd_indicator): | ||||
| 				data_var.ind_type = vartype; | ||||
| 				data_var.ind_pointer = var; | ||||
| 				data_var.ind_varcharsize = varcharsize; | ||||
| 				data_var.ind_arrsize = arrsize; | ||||
| 				data_var.ind_offset = offset; | ||||
| 				if (data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0) | ||||
| 					data_var.ind_value = *((void **) (data_var.ind_pointer)); | ||||
| 				else | ||||
| 					data_var.ind_value = data_var.ind_pointer; | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_data: | ||||
| 				data_var.type = vartype; | ||||
| 				data_var.pointer = var; | ||||
| 				data_var.varcharsize = varcharsize; | ||||
| 				data_var.arrsize = arrsize; | ||||
| 				data_var.offset = offset; | ||||
| 				if (data_var.arrsize == 0 || data_var.varcharsize == 0) | ||||
| 					data_var.value = *((void **) (data_var.pointer)); | ||||
| 				else | ||||
| 					data_var.value = data_var.pointer; | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_name: | ||||
| 				if (!get_char_item(lineno, var, vartype, PQfname(ECPGresult, index), varcharsize)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: NAME = %s\n", PQfname(ECPGresult, index)); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_nullable: | ||||
| 				if (!get_int_item(lineno, var, vartype, 1)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_key_member: | ||||
| 				if (!get_int_item(lineno, var, vartype, 0)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_scale: | ||||
| 				if (!get_int_item(lineno, var, vartype, (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: SCALE = %d\n", (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_precision: | ||||
| 				if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) >> 16)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: PRECISION = %d\n", PQfmod(ECPGresult, index) >> 16); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_octet: | ||||
| 				if (!get_int_item(lineno, var, vartype, PQfsize(ECPGresult, index))) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: OCTET_LENGTH = %d\n", PQfsize(ECPGresult, index)); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_length: | ||||
| 				if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) - VARHDRSZ)) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: LENGTH = %d\n", PQfmod(ECPGresult, index) - VARHDRSZ); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_type: | ||||
| 				if (!get_int_item(lineno, var, vartype, ECPGDynamicType(PQftype(ECPGresult, index)))) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: TYPE = %d\n", ECPGDynamicType(PQftype(ECPGresult, index))); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_di_code: | ||||
| 				if (!get_int_item(lineno, var, vartype, ECPGDynamicType_DDT(PQftype(ECPGresult, index)))) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: TYPE = %d\n", ECPGDynamicType_DDT(PQftype(ECPGresult, index))); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_cardinality: | ||||
| 				if (!get_int_item(lineno, var, vartype, PQntuples(ECPGresult))) | ||||
| 					return (false); | ||||
| 
 | ||||
| 				ECPGlog("ECPGget_desc: CARDINALITY = %d\n", PQntuples(ECPGresult)); | ||||
| 				break; | ||||
| 
 | ||||
| 			case ECPGd_ret_length: | ||||
| 			case ECPGd_ret_octet: | ||||
| 
 | ||||
| 				/*
 | ||||
| 				 * this is like ECPGstore_result | ||||
| 				 */ | ||||
| 				if (arrsize > 0 && ntuples > arrsize) | ||||
| 				{ | ||||
| 					ECPGlog("ECPGget_desc line %d: Incorrect number of matches: %d don't fit into array of %d\n", | ||||
| 							lineno, ntuples, arrsize); | ||||
| 					ECPGraise(lineno, ECPG_TOO_MANY_MATCHES, NULL); | ||||
| 					return false; | ||||
| 				} | ||||
| 				/* allocate storage if needed */ | ||||
| 				if (arrsize == 0 && var != NULL && *(void **) var == NULL) | ||||
| 				{ | ||||
| 					void	   *mem = (void *) ECPGalloc(offset * ntuples, lineno); | ||||
| 
 | ||||
| 					*(void **) var = mem; | ||||
| 					ECPGadd_mem(mem, lineno); | ||||
| 					var = mem; | ||||
| 				} | ||||
| 
 | ||||
| 				for (act_tuple = 0; act_tuple < ntuples; act_tuple++) | ||||
| 				{ | ||||
| 					if (!get_int_item(lineno, var, vartype, PQgetlength(ECPGresult, act_tuple, index))) | ||||
| 						return (false); | ||||
| 					var = (char *) var + offset; | ||||
| 					ECPGlog("ECPGget_desc: RETURNED[%d] = %d\n", act_tuple, PQgetlength(ECPGresult, act_tuple, index)); | ||||
| 				} | ||||
| 				break; | ||||
| 
 | ||||
| 			default: | ||||
| 				snprintf(type_str, sizeof(type_str), "%d", type); | ||||
| 				ECPGraise(lineno, ECPG_UNKNOWN_DESCRIPTOR_ITEM, type_str); | ||||
| 				return (false); | ||||
| 		} | ||||
| 
 | ||||
| 		type = va_arg(args, enum ECPGdtype); | ||||
| 	} | ||||
| 
 | ||||
| 	if (data_var.type != ECPGt_EORT) | ||||
| 	{ | ||||
| 		struct statement stmt; | ||||
| 		char	   *oldlocale; | ||||
| 
 | ||||
| 		/* Make sure we do NOT honor the locale for numeric input */ | ||||
| 		/* since the database gives the standard decimal point */ | ||||
| 		oldlocale = strdup(setlocale(LC_NUMERIC, NULL)); | ||||
| 		setlocale(LC_NUMERIC, "C"); | ||||
| 
 | ||||
| 		memset(&stmt, 0, sizeof stmt); | ||||
| 		stmt.lineno = lineno; | ||||
| 
 | ||||
| 		/* desparate try to guess something sensible */ | ||||
| 		stmt.connection = ECPGget_connection(NULL); | ||||
| 		ECPGstore_result(ECPGresult, index, &stmt, &data_var); | ||||
| 
 | ||||
| 		setlocale(LC_NUMERIC, oldlocale); | ||||
| 		ECPGfree(oldlocale); | ||||
| 	} | ||||
| 	else if (data_var.ind_type != ECPGt_NO_INDICATOR) | ||||
| 	{ | ||||
| 		/*
 | ||||
| 		 * this is like ECPGstore_result but since we don't have a data | ||||
| 		 * variable at hand, we can't call it | ||||
| 		 */ | ||||
| 		if (data_var.ind_arrsize > 0 && ntuples > data_var.ind_arrsize) | ||||
| 		{ | ||||
| 			ECPGlog("ECPGget_desc line %d: Incorrect number of matches (indicator): %d don't fit into array of %d\n", | ||||
| 					lineno, ntuples, data_var.ind_arrsize); | ||||
| 			ECPGraise(lineno, ECPG_TOO_MANY_MATCHES, NULL); | ||||
| 			return false; | ||||
| 		} | ||||
| 		/* allocate storage if needed */ | ||||
| 		if (data_var.ind_arrsize == 0 && data_var.ind_pointer != NULL && data_var.ind_value == NULL) | ||||
| 		{ | ||||
| 			void	   *mem = (void *) ECPGalloc(data_var.ind_offset * ntuples, lineno); | ||||
| 
 | ||||
| 			*(void **) data_var.ind_pointer = mem; | ||||
| 			ECPGadd_mem(mem, lineno); | ||||
| 			data_var.ind_value = mem; | ||||
| 		} | ||||
| 		for (act_tuple = 0; act_tuple < ntuples; act_tuple++) | ||||
| 		{ | ||||
| 			if (!get_int_item(lineno, data_var.ind_value, data_var.ind_type, -PQgetisnull(ECPGresult, act_tuple, index))) | ||||
| 				return (false); | ||||
| 			data_var.ind_value = (char *) data_var.ind_value + data_var.ind_offset; | ||||
| 			ECPGlog("ECPGget_desc: INDICATOR[%d] = %d\n", act_tuple, -PQgetisnull(ECPGresult, act_tuple, index)); | ||||
| 		} | ||||
| 	} | ||||
| 	sqlca.sqlerrd[2] = ntuples; | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGdeallocate_desc(int line, const char *name) | ||||
| { | ||||
| 	struct descriptor *i; | ||||
| 	struct descriptor **lastptr = &all_descriptors; | ||||
| 
 | ||||
| 	ECPGinit_sqlca(); | ||||
| 	for (i = all_descriptors; i; lastptr = &i->next, i = i->next) | ||||
| 	{ | ||||
| 		if (!strcmp(name, i->name)) | ||||
| 		{ | ||||
| 			*lastptr = i->next; | ||||
| 			ECPGfree(i->name); | ||||
| 			PQclear(i->result); | ||||
| 			ECPGfree(i); | ||||
| 			return true; | ||||
| 		} | ||||
| 	} | ||||
| 	ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, name); | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGallocate_desc(int line, const char *name) | ||||
| { | ||||
| 	struct descriptor *new; | ||||
| 
 | ||||
| 	ECPGinit_sqlca(); | ||||
| 	new = (struct descriptor *) ECPGalloc(sizeof(struct descriptor), line); | ||||
| 	if (!new) | ||||
| 		return false; | ||||
| 	new->next = all_descriptors; | ||||
| 	new->name = ECPGalloc(strlen(name) + 1, line); | ||||
| 	if (!new->name) | ||||
| 	{ | ||||
| 		ECPGfree(new); | ||||
| 		return false; | ||||
| 	} | ||||
| 	new->result = PQmakeEmptyPGresult(NULL, 0); | ||||
| 	if (!new->result) | ||||
| 	{ | ||||
| 		ECPGfree(new->name); | ||||
| 		ECPGfree(new); | ||||
| 		ECPGraise(line, ECPG_OUT_OF_MEMORY, NULL); | ||||
| 		return false; | ||||
| 	} | ||||
| 	strcpy(new->name, name); | ||||
| 	all_descriptors = new; | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| PGresult  ** | ||||
| ECPGdescriptor_lvalue(int line, const char *descriptor) | ||||
| { | ||||
| 	struct descriptor *i; | ||||
| 
 | ||||
| 	for (i = all_descriptors; i != NULL; i = i->next) | ||||
| 	{ | ||||
| 		if (!strcmp(descriptor, i->name)) | ||||
| 			return &i->result; | ||||
| 	} | ||||
| 
 | ||||
| 	ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, (char *) descriptor); | ||||
| 	return NULL; | ||||
| } | ||||
| @ -1,198 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/error.c,v 1.19 2003/02/14 13:17:13 meskes Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| 
 | ||||
| #include "ecpgerrno.h" | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "extern.h" | ||||
| #include "sqlca.h" | ||||
| 
 | ||||
| /* This should hold the back-end error message from 
 | ||||
|  * the last back-end operation. */ | ||||
| static char *ECPGerr; | ||||
| 
 | ||||
| void | ||||
| ECPGraise(int line, int code, const char *str) | ||||
| { | ||||
| 	sqlca.sqlcode = code; | ||||
| 
 | ||||
| 	switch (code) | ||||
| 	{ | ||||
| 		case ECPG_NOT_FOUND: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "No data found in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_OUT_OF_MEMORY: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Out of memory in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_UNSUPPORTED: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Unsupported type %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_TOO_MANY_ARGUMENTS: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Too many arguments in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_TOO_FEW_ARGUMENTS: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Too few arguments in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_INT_FORMAT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 			 "Not correctly formatted int type: %s line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_UINT_FORMAT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Not correctly formatted unsigned type: %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_FLOAT_FORMAT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Not correctly formatted floating-point type: %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_CONVERT_BOOL: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 				  "Unable to convert %s to bool on line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_EMPTY: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Empty query in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_MISSING_INDICATOR: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "NULL value without indicator in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_NO_ARRAY: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Variable is not an array in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_DATA_NOT_ARRAY: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 			 "Data read from backend is not an array in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_ARRAY_INSERT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 			 "Trying to insert an array of variables in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_NO_CONN: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "No such connection %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_NOT_CONN: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Not connected to '%s' in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_INVALID_STMT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Invalid statement name %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_UNKNOWN_DESCRIPTOR: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Descriptor %s not found in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_INVALID_DESCRIPTOR_INDEX: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Descriptor index out of range in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_UNKNOWN_DESCRIPTOR_ITEM: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Unknown descriptor item %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_VAR_NOT_NUMERIC: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Variable is not a numeric type in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_VAR_NOT_CHAR: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 				   "Variable is not a character type in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_PGSQL: | ||||
| 			{ | ||||
| 				int			slen = strlen(str); | ||||
| 
 | ||||
| 				/* strip trailing newline */ | ||||
| 				if (slen > 0 && str[slen - 1] == '\n') | ||||
| 					slen--; | ||||
| 				snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 						 "'%.*s' in line %d.", slen, str, line); | ||||
| 				break; | ||||
| 			} | ||||
| 
 | ||||
| 		case ECPG_TRANS: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "Error in transaction processing in line %d.", line); | ||||
| 			break; | ||||
| 
 | ||||
| 		case ECPG_CONNECT: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 			  "Could not connect to database %s in line %d.", str, line); | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc), | ||||
| 					 "SQL error #%d in line %d.", code, line); | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc); | ||||
| 	ECPGlog("raising sqlcode %d in line %d, '%s'.\n", code, line, sqlca.sqlerrm.sqlerrmc); | ||||
| 
 | ||||
| 	/* free all memory we have allocated for the user */ | ||||
| 	ECPGfree_auto_mem(); | ||||
| } | ||||
| 
 | ||||
| /* Set the error message string from the backend */ | ||||
| void | ||||
| set_backend_err(const char *err, int lineno) | ||||
| { | ||||
| 	if (ECPGerr) | ||||
| 		ECPGfree(ECPGerr); | ||||
| 
 | ||||
| 	if (!err) | ||||
| 	{ | ||||
| 		ECPGerr = NULL; | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	ECPGerr = ECPGstrdup(err, lineno); | ||||
| } | ||||
| 
 | ||||
| /* Retrieve the error message from the backend. */ | ||||
| char * | ||||
| ECPGerrmsg(void) | ||||
| { | ||||
| 	return ECPGerr; | ||||
| } | ||||
| 	 | ||||
| /* print out an error message */ | ||||
| void | ||||
| sqlprint(void) | ||||
| { | ||||
| 	sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0'; | ||||
| 	fprintf(stderr, "sql error %s\n", sqlca.sqlerrm.sqlerrmc); | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,102 +0,0 @@ | ||||
| #ifndef _ECPG_LIB_EXTERN_H | ||||
| #define _ECPG_LIB_EXTERN_H | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| #include "libpq-fe.h" | ||||
| 
 | ||||
| /* Here are some methods used by the lib. */ | ||||
| 
 | ||||
| /* Stores the backend error message for client access */ | ||||
| void set_backend_err(const char *err, int lineon); | ||||
| 
 | ||||
| /* Store and retrieve the backend error message for client access */ | ||||
| void set_backend_err(const char *err, int lineon); | ||||
| char *ECPGerrmsg(void); | ||||
| 
 | ||||
| /* Returns a pointer to a string containing a simple type name. */ | ||||
| void		ECPGadd_mem(void *ptr, int lineno); | ||||
| 
 | ||||
| bool ECPGget_data(const PGresult *, int, int, int, enum ECPGttype type, | ||||
| 			 enum ECPGttype, char *, char *, long, long, long, bool); | ||||
| struct connection *ECPGget_connection(const char *); | ||||
| void		ECPGinit_sqlca(void); | ||||
| char	   *ECPGalloc(long, int); | ||||
| void		ECPGfree(void *); | ||||
| bool		ECPGinit(const struct connection *, const char *, const int); | ||||
| char	   *ECPGstrdup(const char *, int); | ||||
| const char *ECPGtype_name(enum ECPGttype); | ||||
| unsigned int ECPGDynamicType(Oid); | ||||
| void		ECPGfree_auto_mem(void); | ||||
| void		ECPGclear_auto_mem(void); | ||||
| 
 | ||||
| /* A generic varchar type. */ | ||||
| struct ECPGgeneric_varchar | ||||
| { | ||||
| 	int			len; | ||||
| 	char		arr[1]; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * type information cache | ||||
|  */ | ||||
| 
 | ||||
| struct ECPGtype_information_cache | ||||
| { | ||||
| 	struct ECPGtype_information_cache *next; | ||||
| 	int			oid; | ||||
| 	bool		isarray; | ||||
| }; | ||||
| 
 | ||||
| /* structure to store one statement */ | ||||
| struct statement | ||||
| { | ||||
| 	int			lineno; | ||||
| 	char	   *command; | ||||
| 	struct connection *connection; | ||||
| 	struct variable *inlist; | ||||
| 	struct variable *outlist; | ||||
| }; | ||||
| 
 | ||||
| /* structure to store connections */ | ||||
| struct connection | ||||
| { | ||||
| 	char	   *name; | ||||
| 	PGconn	   *connection; | ||||
| 	bool		committed; | ||||
| 	int			autocommit; | ||||
| 	struct ECPGtype_information_cache *cache_head; | ||||
| 	struct connection *next; | ||||
| }; | ||||
| 
 | ||||
| /* structure to store descriptors */ | ||||
| struct descriptor | ||||
| { | ||||
| 	char	   *name; | ||||
| 	PGresult   *result; | ||||
| 	struct descriptor *next; | ||||
| }; | ||||
| 
 | ||||
| struct variable | ||||
| { | ||||
| 	enum ECPGttype type; | ||||
| 	void	   *value; | ||||
| 	void	   *pointer; | ||||
| 	long		varcharsize; | ||||
| 	long		arrsize; | ||||
| 	long		offset; | ||||
| 	enum ECPGttype ind_type; | ||||
| 	void	   *ind_value; | ||||
| 	void	   *ind_pointer; | ||||
| 	long		ind_varcharsize; | ||||
| 	long		ind_arrsize; | ||||
| 	long		ind_offset; | ||||
| 	struct variable *next; | ||||
| }; | ||||
| 
 | ||||
| PGresult  ** | ||||
| 			ECPGdescriptor_lvalue(int line, const char *descriptor); | ||||
| 
 | ||||
| bool ECPGstore_result(const PGresult *results, int act_field, | ||||
| 				 const struct statement * stmt, struct variable * var); | ||||
| 
 | ||||
| #endif /* _ECPG_LIB_EXTERN_H */ | ||||
| @ -1,95 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/memory.c,v 1.9 2002/09/04 20:31:46 momjian Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "ecpgerrno.h" | ||||
| #include "extern.h" | ||||
| 
 | ||||
| void | ||||
| ECPGfree(void *ptr) | ||||
| { | ||||
| 	free(ptr); | ||||
| } | ||||
| 
 | ||||
| char * | ||||
| ECPGalloc(long size, int lineno) | ||||
| { | ||||
| 	char	   *new = (char *) calloc(1L, size); | ||||
| 
 | ||||
| 	if (!new) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_OUT_OF_MEMORY, NULL); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	memset(new, '\0', size); | ||||
| 	return (new); | ||||
| } | ||||
| 
 | ||||
| char * | ||||
| ECPGstrdup(const char *string, int lineno) | ||||
| { | ||||
| 	char	   *new = strdup(string); | ||||
| 
 | ||||
| 	if (!new) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_OUT_OF_MEMORY, NULL); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return (new); | ||||
| } | ||||
| 
 | ||||
| /* keep a list of memory we allocated for the user */ | ||||
| static struct auto_mem | ||||
| { | ||||
| 	void	   *pointer; | ||||
| 	struct auto_mem *next; | ||||
| }	*auto_allocs = NULL; | ||||
| 
 | ||||
| void | ||||
| ECPGadd_mem(void *ptr, int lineno) | ||||
| { | ||||
| 	struct auto_mem *am = (struct auto_mem *) ECPGalloc(sizeof(struct auto_mem), lineno); | ||||
| 
 | ||||
| 	am->pointer = ptr; | ||||
| 	am->next = auto_allocs; | ||||
| 	auto_allocs = am; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| ECPGfree_auto_mem(void) | ||||
| { | ||||
| 	struct auto_mem *am; | ||||
| 
 | ||||
| 	/* free all memory we have allocated for the user */ | ||||
| 	for (am = auto_allocs; am;) | ||||
| 	{ | ||||
| 		struct auto_mem *act = am; | ||||
| 
 | ||||
| 		am = am->next; | ||||
| 		ECPGfree(act->pointer); | ||||
| 		ECPGfree(act); | ||||
| 	} | ||||
| 
 | ||||
| 	auto_allocs = NULL; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| ECPGclear_auto_mem(void) | ||||
| { | ||||
| 	struct auto_mem *am; | ||||
| 
 | ||||
| 	/* free just our own structure */ | ||||
| 	for (am = auto_allocs; am;) | ||||
| 	{ | ||||
| 		struct auto_mem *act = am; | ||||
| 
 | ||||
| 		am = am->next; | ||||
| 		ECPGfree(act); | ||||
| 	} | ||||
| 
 | ||||
| 	auto_allocs = NULL; | ||||
| } | ||||
| @ -1,149 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/misc.c,v 1.13 2002/09/04 20:31:46 momjian Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include <unistd.h> | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "ecpgerrno.h" | ||||
| #include "extern.h" | ||||
| #include "sqlca.h" | ||||
| 
 | ||||
| static struct sqlca sqlca_init = | ||||
| { | ||||
| 	{ | ||||
| 		'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' ' | ||||
| 	}, | ||||
| 	sizeof(struct sqlca), | ||||
| 	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 | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| static int	simple_debug = 0; | ||||
| static FILE *debugstream = NULL; | ||||
| 
 | ||||
| void | ||||
| ECPGinit_sqlca(void) | ||||
| { | ||||
| 	memcpy((char *) &sqlca, (char *) &sqlca_init, sizeof(sqlca)); | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGinit(const struct connection * con, const char *connection_name, const int lineno) | ||||
| { | ||||
| 	ECPGinit_sqlca(); | ||||
| 	if (con == NULL) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_NO_CONN, connection_name ? connection_name : "NULL"); | ||||
| 		return (false); | ||||
| 	} | ||||
| 
 | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGstatus(int lineno, const char *connection_name) | ||||
| { | ||||
| 	struct connection *con = ECPGget_connection(connection_name); | ||||
| 
 | ||||
| 	if (!ECPGinit(con, connection_name, lineno)) | ||||
| 		return (false); | ||||
| 
 | ||||
| 	/* are we connected? */ | ||||
| 	if (con->connection == NULL) | ||||
| 	{ | ||||
| 		ECPGraise(lineno, ECPG_NOT_CONN, con->name); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return (true); | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGtrans(int lineno, const char *connection_name, const char *transaction) | ||||
| { | ||||
| 	PGresult   *res; | ||||
| 	struct connection *con = ECPGget_connection(connection_name); | ||||
| 
 | ||||
| 	if (!ECPGinit(con, connection_name, lineno)) | ||||
| 		return (false); | ||||
| 
 | ||||
| 	ECPGlog("ECPGtrans line %d action = %s connection = %s\n", lineno, transaction, con->name); | ||||
| 
 | ||||
| 	/* if we have no connection we just simulate the command */ | ||||
| 	if (con && con->connection) | ||||
| 	{ | ||||
| 		/*
 | ||||
| 		 * if we are not in autocommit mode, already have committed the | ||||
| 		 * transaction and get another commit, just ignore it | ||||
| 		 */ | ||||
| 		if (!con->committed || con->autocommit) | ||||
| 		{ | ||||
| 			if ((res = PQexec(con->connection, transaction)) == NULL) | ||||
| 			{ | ||||
| 				ECPGraise(lineno, ECPG_TRANS, NULL); | ||||
| 				return FALSE; | ||||
| 			} | ||||
| 			PQclear(res); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (strcmp(transaction, "commit") == 0 || strcmp(transaction, "rollback") == 0) | ||||
| 	{ | ||||
| 		con->committed = true; | ||||
| 
 | ||||
| 		/* deallocate all prepared statements */ | ||||
| 		if (!ECPGdeallocate_all(lineno)) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| ECPGdebug(int n, FILE *dbgs) | ||||
| { | ||||
| 	simple_debug = n; | ||||
| 	debugstream = dbgs; | ||||
| 	ECPGlog("ECPGdebug: set to %d\n", simple_debug); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| ECPGlog(const char *format,...) | ||||
| { | ||||
| 	va_list		ap; | ||||
| 
 | ||||
| 	if (simple_debug) | ||||
| 	{ | ||||
| 		char	   *f = (char *) malloc(strlen(format) + 100); | ||||
| 
 | ||||
| 		if (!f) | ||||
| 			return; | ||||
| 
 | ||||
| 		sprintf(f, "[%d]: %s", (int) getpid(), format); | ||||
| 
 | ||||
| 		va_start(ap, format); | ||||
| 		vfprintf(debugstream, f, ap); | ||||
| 		va_end(ap); | ||||
| 
 | ||||
| 		ECPGfree(f); | ||||
| 	} | ||||
| } | ||||
| @ -1,73 +0,0 @@ | ||||
| /*-------------------------------------------------------------------------
 | ||||
|  * | ||||
|  * pg_type.h | ||||
|  *	  definition of the system "type" relation (pg_type) | ||||
|  *	  along with the relation's initial contents. | ||||
|  * | ||||
|  * | ||||
|  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group | ||||
|  * Portions Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $Id: pg_type.h,v 1.7 2002/06/20 20:29:53 momjian Exp $ | ||||
|  * | ||||
|  * NOTES | ||||
|  *	  the genbki.sh script reads this file and generates .bki | ||||
|  *	  information from the DATA() statements. | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| #ifndef PG_TYPE_H | ||||
| #define PG_TYPE_H | ||||
| 
 | ||||
| /* ----------------
 | ||||
|  *		initial contents of pg_type | ||||
|  * ---------------- | ||||
|  */ | ||||
| 
 | ||||
| /* keep the following ordered by OID so that later changes can be made easier*/ | ||||
| 
 | ||||
| /* OIDS 1 - 99 */ | ||||
| #define BOOLOID			16 | ||||
| #define BYTEAOID		17 | ||||
| #define CHAROID			18 | ||||
| #define NAMEOID			19 | ||||
| #define INT8OID			20 | ||||
| #define INT2OID			21 | ||||
| #define INT2VECTOROID	22 | ||||
| #define INT4OID			23 | ||||
| #define REGPROCOID		24 | ||||
| #define TEXTOID			25 | ||||
| #define OIDOID			26 | ||||
| #define TIDOID		27 | ||||
| #define XIDOID 28 | ||||
| #define CIDOID 29 | ||||
| #define OIDVECTOROID	30 | ||||
| #define POINTOID		600 | ||||
| #define LSEGOID			601 | ||||
| #define PATHOID			602 | ||||
| #define BOXOID			603 | ||||
| #define POLYGONOID		604 | ||||
| #define LINEOID			628 | ||||
| #define FLOAT4OID 700 | ||||
| #define FLOAT8OID 701 | ||||
| #define ABSTIMEOID		702 | ||||
| #define RELTIMEOID		703 | ||||
| #define TINTERVALOID	704 | ||||
| #define UNKNOWNOID		705 | ||||
| #define CIRCLEOID		718 | ||||
| #define CASHOID 790 | ||||
| #define INETOID 869 | ||||
| #define CIDROID 650 | ||||
| #define BPCHAROID		1042 | ||||
| #define VARCHAROID		1043 | ||||
| #define DATEOID			1082 | ||||
| #define TIMEOID			1083 | ||||
| #define TIMESTAMPOID	1114 | ||||
| #define TIMESTAMPTZOID	1184 | ||||
| #define INTERVALOID		1186 | ||||
| #define TIMETZOID		1266 | ||||
| #define ZPBITOID	 1560 | ||||
| #define VARBITOID	  1562 | ||||
| #define NUMERICOID		1700 | ||||
| 
 | ||||
| #endif   /* PG_TYPE_H */ | ||||
| @ -1,155 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/prepare.c,v 1.12 2001/12/23 12:17:41 meskes Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include <ctype.h> | ||||
| 
 | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "ecpgerrno.h" | ||||
| #include "extern.h" | ||||
| #include "sqlca.h" | ||||
| 
 | ||||
| static struct prepared_statement | ||||
| { | ||||
| 	char	   *name; | ||||
| 	struct statement *stmt; | ||||
| 	struct prepared_statement *next; | ||||
| }	*prep_stmts = NULL; | ||||
| 
 | ||||
| static bool | ||||
| isvarchar(unsigned char c) | ||||
| { | ||||
| 	if (isalnum(c)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (c == '_' || c == '>' || c == '-' || c == '.') | ||||
| 		return true; | ||||
| 
 | ||||
| 	if (c >= 128) | ||||
| 		return true; | ||||
| 
 | ||||
| 	return (false); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| replace_variables(char *text) | ||||
| { | ||||
| 	char	   *ptr = text; | ||||
| 	bool		string = false; | ||||
| 
 | ||||
| 	for (; *ptr != '\0'; ptr++) | ||||
| 	{ | ||||
| 		if (*ptr == '\'') | ||||
| 			string = string ? false : true; | ||||
| 
 | ||||
| 		if (!string && *ptr == ':') | ||||
| 		{ | ||||
| 			*ptr = '?'; | ||||
| 			for (++ptr; *ptr && isvarchar(*ptr); ptr++) | ||||
| 				*ptr = ' '; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* handle the EXEC SQL PREPARE statement */ | ||||
| bool | ||||
| ECPGprepare(int lineno, char *name, char *variable) | ||||
| { | ||||
| 	struct statement *stmt; | ||||
| 	struct prepared_statement *this; | ||||
| 
 | ||||
| 	/* check if we already have prepared this statement */ | ||||
| 	for (this = prep_stmts; this != NULL && strcmp(this->name, name) != 0; this = this->next); | ||||
| 	if (this) | ||||
| 	{ | ||||
| 		bool		b = ECPGdeallocate(lineno, name); | ||||
| 
 | ||||
| 		if (!b) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| 	this = (struct prepared_statement *) ECPGalloc(sizeof(struct prepared_statement), lineno); | ||||
| 	if (!this) | ||||
| 		return false; | ||||
| 
 | ||||
| 	stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno); | ||||
| 	if (!stmt) | ||||
| 	{ | ||||
| 		ECPGfree(this); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	/* create statement */ | ||||
| 	stmt->lineno = lineno; | ||||
| 	stmt->connection = NULL; | ||||
| 	stmt->command = ECPGstrdup(variable, lineno); | ||||
| 	stmt->inlist = stmt->outlist = NULL; | ||||
| 
 | ||||
| 	/* if we have C variables in our statment replace them with '?' */ | ||||
| 	replace_variables(stmt->command); | ||||
| 
 | ||||
| 	/* add prepared statement to our list */ | ||||
| 	this->name = ECPGstrdup(name, lineno); | ||||
| 	this->stmt = stmt; | ||||
| 
 | ||||
| 	if (prep_stmts == NULL) | ||||
| 		this->next = NULL; | ||||
| 	else | ||||
| 		this->next = prep_stmts; | ||||
| 
 | ||||
| 	prep_stmts = this; | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| /* handle the EXEC SQL DEALLOCATE PREPARE statement */ | ||||
| bool | ||||
| ECPGdeallocate(int lineno, char *name) | ||||
| { | ||||
| 	struct prepared_statement *this, | ||||
| 			   *prev; | ||||
| 
 | ||||
| 	/* check if we really have prepared this statement */ | ||||
| 	for (this = prep_stmts, prev = NULL; this != NULL && strcmp(this->name, name) != 0; prev = this, this = this->next); | ||||
| 	if (this) | ||||
| 	{ | ||||
| 		/* okay, free all the resources */ | ||||
| 		ECPGfree(this->name); | ||||
| 		ECPGfree(this->stmt->command); | ||||
| 		ECPGfree(this->stmt); | ||||
| 		if (prev != NULL) | ||||
| 			prev->next = this->next; | ||||
| 		else | ||||
| 			prep_stmts = this->next; | ||||
| 
 | ||||
| 		ECPGfree(this); | ||||
| 		return true; | ||||
| 	} | ||||
| 	ECPGraise(lineno, ECPG_INVALID_STMT, name); | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| bool | ||||
| ECPGdeallocate_all(int lineno) | ||||
| { | ||||
| 	/* deallocate all prepared statements */ | ||||
| 	while (prep_stmts != NULL) | ||||
| 	{ | ||||
| 		bool		b = ECPGdeallocate(lineno, prep_stmts->name); | ||||
| 
 | ||||
| 		if (!b) | ||||
| 			return false; | ||||
| 	} | ||||
| 
 | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| /* return the prepared statement */ | ||||
| char * | ||||
| ECPGprepared_statement(char *name) | ||||
| { | ||||
| 	struct prepared_statement *this; | ||||
| 
 | ||||
| 	for (this = prep_stmts; this != NULL && strcmp(this->name, name) != 0; this = this->next); | ||||
| 	return (this) ? this->stmt->command : NULL; | ||||
| } | ||||
| @ -1,88 +0,0 @@ | ||||
| /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/typename.c,v 1.21 2001/10/28 06:26:11 momjian Exp $ */ | ||||
| 
 | ||||
| #include "postgres_fe.h" | ||||
| 
 | ||||
| #include <stdlib.h> | ||||
| #include "ecpgtype.h" | ||||
| #include "ecpglib.h" | ||||
| #include "extern.h" | ||||
| #include "sql3types.h" | ||||
| #include "pg_type.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * This function is used to generate the correct type names. | ||||
|  */ | ||||
| const char * | ||||
| ECPGtype_name(enum ECPGttype typ) | ||||
| { | ||||
| 	switch (typ) | ||||
| 	{ | ||||
| 		case ECPGt_char: | ||||
| 			return "char"; | ||||
| 		case ECPGt_unsigned_char: | ||||
| 			return "unsigned char"; | ||||
| 		case ECPGt_short: | ||||
| 			return "short"; | ||||
| 		case ECPGt_unsigned_short: | ||||
| 			return "unsigned short"; | ||||
| 		case ECPGt_int: | ||||
| 			return "int"; | ||||
| 		case ECPGt_unsigned_int: | ||||
| 			return "unsigned int"; | ||||
| 		case ECPGt_long: | ||||
| 			return "long"; | ||||
| 		case ECPGt_unsigned_long: | ||||
| 			return "unsigned long"; | ||||
| 		case ECPGt_long_long: | ||||
| 			return "long long"; | ||||
| 		case ECPGt_unsigned_long_long: | ||||
| 			return "unsigned long long"; | ||||
| 		case ECPGt_float: | ||||
| 			return "float"; | ||||
| 		case ECPGt_double: | ||||
| 			return "double"; | ||||
| 		case ECPGt_bool: | ||||
| 			return "bool"; | ||||
| 		case ECPGt_varchar: | ||||
| 			return "varchar"; | ||||
| 		case ECPGt_char_variable: | ||||
| 			return "char"; | ||||
| 		default: | ||||
| 			abort(); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| unsigned int | ||||
| ECPGDynamicType(Oid type) | ||||
| { | ||||
| 	switch (type) | ||||
| 	{ | ||||
| 		case BOOLOID: | ||||
| 			return SQL3_BOOLEAN;	/* bool */ | ||||
| 		case INT2OID: | ||||
| 			return SQL3_SMALLINT;		/* int2 */ | ||||
| 		case INT4OID: | ||||
| 			return SQL3_INTEGER;	/* int4 */ | ||||
| 		case TEXTOID: | ||||
| 			return SQL3_CHARACTER;		/* text */ | ||||
| 		case FLOAT4OID: | ||||
| 			return SQL3_REAL;	/* float4 */ | ||||
| 		case FLOAT8OID: | ||||
| 			return SQL3_DOUBLE_PRECISION;		/* float8 */ | ||||
| 		case BPCHAROID: | ||||
| 			return SQL3_CHARACTER;		/* bpchar */ | ||||
| 		case VARCHAROID: | ||||
| 			return SQL3_CHARACTER_VARYING;		/* varchar */ | ||||
| 		case DATEOID: | ||||
| 			return SQL3_DATE_TIME_TIMESTAMP;	/* date */ | ||||
| 		case TIMEOID: | ||||
| 			return SQL3_DATE_TIME_TIMESTAMP;	/* time */ | ||||
| 		case TIMESTAMPOID: | ||||
| 			return SQL3_DATE_TIME_TIMESTAMP;	/* datetime */ | ||||
| 		case NUMERICOID: | ||||
| 			return SQL3_NUMERIC;	/* numeric */ | ||||
| 		default: | ||||
| 			return -type; | ||||
| 	} | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user