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