From 051a4f233f707a56130f44b4b3940eecc91c9c91 Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Fri, 11 Jan 2002 14:43:11 +0000
Subject: [PATCH] Added Christof's fixes.

---
 src/interfaces/ecpg/ChangeLog        |  5 +++++
 src/interfaces/ecpg/lib/descriptor.c | 32 +++++++++++++++++++++++-----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 37a2b826c09..70ad65acf76 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1196,5 +1196,10 @@ Tue Jan  8 15:16:37 CET 2002
 Thu Jan 10 11:12:14 CET 2002
 
 	- Include sqlca.h automatically.
+
+Fri Jan 11 15:43:39 CET 2002
+
+	- clear sqlca on : [de]allocate descriptor  & get descriptor and set
+	  sqlca.sqlerrd[2] accordingly (Christof).
 	- Set ecpg version to 2.9.0.
         - Set library version to 3.3.0.
diff --git a/src/interfaces/ecpg/lib/descriptor.c b/src/interfaces/ecpg/lib/descriptor.c
index 66fb6b1d861..749272394c9 100644
--- a/src/interfaces/ecpg/lib/descriptor.c
+++ b/src/interfaces/ecpg/lib/descriptor.c
@@ -1,6 +1,6 @@
 /* dynamic SQL support routines
  *
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.20 2001/12/23 12:17:41 meskes Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/descriptor.c,v 1.21 2002/01/11 14:43:11 meskes Exp $
  */
 
 #include "postgres_fe.h"
@@ -10,6 +10,7 @@
 #include "ecpglib.h"
 #include "ecpgerrno.h"
 #include "extern.h"
+#include "sqlca.h"
 #include "sql3types.h"
 
 struct descriptor *all_descriptors = NULL;
@@ -49,12 +50,15 @@ ECPGDynamicType_DDT(Oid type)
 bool
 ECPGget_desc_header(int lineno, char *desc_name, int *count)
 {
-	PGresult   *ECPGresult = ECPGresultByDescriptor(lineno, desc_name);
+	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;
 }
@@ -140,13 +144,15 @@ bool
 ECPGget_desc(int lineno, char *desc_name, int index,...)
 {
 	va_list		args;
-	PGresult   *ECPGresult = ECPGresultByDescriptor(lineno, desc_name);
+	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);
 
@@ -359,7 +365,7 @@ ECPGget_desc(int lineno, char *desc_name, int index,...)
 			ECPGlog("ECPGget_desc: INDICATOR[%d] = %d\n", act_tuple, -PQgetisnull(ECPGresult, act_tuple, index));
 		}
 	}
-	
+	sqlca.sqlerrd[2]=ntuples;
 	return (true);
 }
 
@@ -369,6 +375,7 @@ 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))
@@ -387,11 +394,26 @@ ECPGdeallocate_desc(int line, const char *name)
 bool
 ECPGallocate_desc(int line, const char *name)
 {
-	struct descriptor *new = (struct descriptor *) ECPGalloc(sizeof(struct descriptor), line);
+	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;
-- 
GitLab