Index: rserv.c
===================================================================
RCS file: /home/dpavlin/private/cvsroot/rserv/lib/rserv.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -r1.1 -r1.2
--- rserv.c	20 Dec 2000 17:22:35 -0000	1.1
+++ rserv.c	5 Aug 2003 09:52:39 -0000	1.2
@@ -48,7 +47,7 @@
 	char	   *key;
 	char	   *okey;
 	char	   *newkey = NULL;
-	int			deleted;
+  int			deleted, inserted, updated;
 	char		sql[8192];
 	char		outbuf[8192];
 	char		oidbuf[64];
@@ -79,11 +78,17 @@
 	rel = CurrentTriggerData->tg_relation;
 	tupdesc = rel->rd_att;
 
-	deleted = (TRIGGER_FIRED_BY_DELETE(CurrentTriggerData->tg_event)) ? 
-		1 : 0;
-
-	if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event))
+  deleted  = (TRIGGER_FIRED_BY_DELETE(CurrentTriggerData->tg_event)) ? 1 : 0;
+  inserted = (TRIGGER_FIRED_BY_INSERT(CurrentTriggerData->tg_event)) ? 1 : 0;
+  //  updated  = (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event)) ? 1 : 0;
+
+  updated = 0;
+  if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event)) {
+    updated = 1;
 		newtuple = CurrentTriggerData->tg_newtuple;
+  }
+
+#ifndef PG_FUNCTION_INFO_V1
 
 	/*
 	 * Setting CurrentTriggerData to NULL prevents direct calls to trigger
@@ -91,24 +96,23 @@
 	 * by trigger manager code only.
 	 */
 	CurrentTriggerData = NULL;
+#endif
 
 	/* Connect to SPI manager */
 	if ((ret = SPI_connect()) < 0)
 		elog(ERROR, "_rserv_log_: SPI_connect returned %d", ret);
 
	if (keynum == ObjectIdAttributeNumber)
	{
 		sprintf(oidbuf, "%u", tuple->t_data->t_oid);
 		key = oidbuf;
	}
	else
 		key = SPI_getvalue(tuple, tupdesc, keynum);
 
 	if (key == NULL)
 		elog(ERROR, "_rserv_log_: key must be not null");
 
	if (newtuple && keynum != ObjectIdAttributeNumber)
	{
 		newkey = SPI_getvalue(newtuple, tupdesc, keynum);
 		if (newkey == NULL)
 			elog(ERROR, "_rserv_log_: key must be not null");
@@ -123,9 +127,64 @@
 	else
 		okey = key;
 
+
+  /**
+     versao onde verifica-se primeiro se o registro existe 
+     para decidir se faz insert ou update em _RSERV_LOG_
+  **********************/
+
+#ifdef ASKFORUPDATE
+  sprintf(sql, "SELECT true WHERE EXISTS (SELECT logid from _RSERV_LOG_ "
+	  "WHERE reloid = %u AND key = '%s')",
+	  rel->rd_id, okey);
+
+  if (debug)
+    elog(NOTICE, sql);
+
+  if ((ret = SPI_exec(sql, 1)) < 0) {
+    elog(ERROR, "_rserv_log_: SPI_exec(update) returned %d", ret);
+  } 
+
+  if (SPI_processed > 0) {
+    sprintf(sql, "update _RSERV_LOG_ set logid = %d, logtime = now(), "
+	    "insert = %d, update = %d, delete = %d where reloid = %u "
+	    "and key = '%s'",
+	    GetCurrentTransactionId(), 
+	    inserted, updated, deleted, rel->rd_id, okey);
+    
+    if (debug)
+      elog(NOTICE, sql);
+    
+    ret = SPI_exec(sql, 0);
+    
+    if (ret < 0)
+      elog(ERROR, "_rserv_log_: SPI_exec(update) returned %d", ret);
+    
+    if (SPI_processed > 1)
+      elog(ERROR, "_rserv_log_: duplicate tuples");
+  } else {
+    sprintf(sql, "insert into _RSERV_LOG_ "
+	    "(reloid, logid, logtime, insert, update, delete, key) "
+	    "values (%u, %d, now(), %d, %d, %d, '%s')",
+	    rel->rd_id, GetCurrentTransactionId(),
+	    inserted, updated, deleted, okey);
+    
+    if (debug)
+      elog(NOTICE, sql);
+    
+    ret = SPI_exec(sql, 0);
+    
+    if (ret < 0)
+      elog(ERROR, "_rserv_log_: SPI_exec(insert) returned %d", ret);
+  }
+
+#else
+ 
 	sprintf(sql, "update _RSERV_LOG_ set logid = %d, logtime = now(), "
-			"deleted = %d where reloid = %u and key = '%s'", 
-			GetCurrentTransactionId(), deleted, rel->rd_id, okey);
+			"insert = %d, update = %d, delete = %d where reloid = %u and key = '%s'",
+	  GetCurrentTransactionId(), inserted, updated, deleted, rel->rd_id, okey);
 
 	if (debug)
 		elog(NOTICE, sql);
@@ -135,18 +194,20 @@
 	if (ret < 0)
 		elog(ERROR, "_rserv_log_: SPI_exec(update) returned %d", ret);
 
 	/*
 	 * If no tuple was UPDATEd then do INSERT...
 	 */
 	if (SPI_processed > 1)
 		elog(ERROR, "_rserv_log_: duplicate tuples");
	else if (SPI_processed == 0)
	{
 		sprintf(sql, "insert into _RSERV_LOG_ "
-				"(reloid, logid, logtime, deleted, key) "
-				"values (%u, %d, now(), %d, '%s')",
+				"(reloid, logid, logtime, insert, update, delete, key) "
+				"values (%u, %d, now(), %d, %d, %d, '%s')",
 				rel->rd_id, GetCurrentTransactionId(), 
-				deleted, okey);
+				inserted, updated, deleted, okey);
 
 		if (debug)
 			elog(NOTICE, sql);
@@ -157,20 +218,21 @@
 			elog(ERROR, "_rserv_log_: SPI_exec(insert) returned %d", ret);
 	}
 
+#endif    
+
 	if (okey != key && okey != outbuf)
 		pfree(okey);
 
  if (newkey) {
 		if (strpbrk(newkey, "\\	\n'"))
 			okey = OutputValue(newkey, outbuf, sizeof(outbuf));
 		else
 			okey = newkey;
 
 		sprintf(sql, "insert into _RSERV_LOG_ "
-				"(reloid, logid, logtime, deleted, key) "
-				"values (%u, %d, now(), 0, '%s')", 
-				rel->rd_id, GetCurrentTransactionId(), okey);
+				"(reloid, logid, logtime, insert, update, delete, key) "
+				"values (%u, %d, now(), %d, %d, 0, '%s')",
+				rel->rd_id, GetCurrentTransactionId(), inserted, updated, okey);
 
 		if (debug)
 			elog(NOTICE, sql);
