
/*     
 *      FILE
 *     	rules/linf/rmgr.l
 *     
 *      DESCRIPTION
 *     	Routines to process rules affecting a query.
 *     
 */
defvar (_RCS_rmgr_,"$Header: rmgr.l,v 1.3 89/02/25 17:57:22 aoki Exp $");

/*     
 *      EXPORTS
 *     	myRelationGetRelationId
 *     	rule-manager
 *     	debug-rule-manager
 *     	debug2-rule-manager
 */

/*    
 *     global variables -- XXX note the unconventional names
 *    
 */
defvar (first_time,1 /* XXX - true */);
defvar (depthOfRecursion,0);
defvar (timesCalled,0);
defvar (DebugLevel,0);

/*  (defvar DebugFileName "/a/postgres/spyros/postgres/src/tcop/DebugSpec.l")
 */

/*    
 *     ?
 *    
 */
LispValue
myRelationGetRelationId (aa)
LispValue a ;
{
	RelationGetRelationId (a);
}

/*    
 *     rule-manager
 *    
 */
LispValue
rule_manager (commandcommand,useruser,relDescrelDesc,relIdrelId,oldTupleoldTuple,oldBufferPageoldBufferPage,newTuplenewTuple,
newBufferPagenewBufferPage,attrDescattrDesc,targetListtargetList)
LispValue command,user,relDesc,relId,oldTuple,oldBufferPage,newTuple,newBufferPage,attrDesc,targetList ;
{
	depthOfRecursion = depthOfRecursion + 1;
	;
	timesCalled = 1 + timesCalled;
	;
	if ( and (not (equal (command,/* XXX- QUOTE start,*/)),not (equal (command,/* XXX- QUOTE end,*/))) ) {
		relId = myRelationGetRelationId (relDesc);
		;
	} else {
	};

	if(first_time) {
		print ("RULE MANAGER: Initializing Debug Info....");
		terpri ();
		first_time = nil;
		/*   (cond ((probef DebugFileName) */

		/*          (load DebugFileName) */

		/*          (print "DEBUG LEVEL = ") (print DebugLevel) (terpri))) */
		;

	} else if ( true ) ;  
	end-cond ;
	/* XXX - prog form, maybe incorrect */
	LispValue result = LispNil;
	LispValue thisTimeCalled = LispNil;
	LispValue thisDepthOfRecursion = LispNil;

	/*    */

	/*    NOTE: The buffer of the tuple returned will always be */

	/*    InvalidBuffer. This should change later on however... */

	/*    */
	thisTimeCalled = timesCalled;
	;
	thisDepthOfRecursion = depthOfRecursion;
	;
	if ( DebugLevel >= 1 ) {
		debug_rule_manager (command,user,relDesc,relId,oldTuple,oldBufferPage,newTuple,newBufferPage,attrDesc,targetList,
		    thisDepthOfRecursion,thisTimeCalled);
	} else {
	};

	if ( and (not (null (oldTuple)),not (eq (0,oldTuple))) ) {
		oldTuple = palloctup (oldTuple,vrefi_long (oldBufferPage,0),relDesc);
		;
		oldBufferPage = ReturnInvalidBuffer ();
		;
		;
	} else {
	};

	/*  why? */

	if ( and (not (null (newTuple)),not (eq (0,newTuple)),eq (command,/* XXX- QUOTE replace,*/)) ) {
		newBufferPage = ReturnInvalidBuffer ();
		/*  why? */
		;
		newTuple = palloctup (newTuple,newBufferPage
		    /*  (vrefi-long) if fix (RIB) */
		,relDesc);
		;
		;
	} else {
	};

	result = switch (command) {

	case: /* XXX- QUOTE retrieve,*/
		{ 
			DoRetrieve (oldTuple,targetList,relDesc,relId,attrDesc,oldBufferPage);
		}
		break;

	case: /* XXX- QUOTE delete,*/
		{ 
			DoDelete (oldTuple,targetList,relDesc,relId,attrDesc,oldBufferPage);
		}
		break;

	case: /* XXX- QUOTE append,*/
		{ 
			DoAppend (oldTuple,targetList,relDesc,relId,attrDesc,oldBufferPage);
		}
		break;

	case: /* XXX- QUOTE replace,*/
		{ 
			DoAppend (newTuple,targetList,relDesc,relId,attrDesc,newBufferPage);
		}
		break;

	case: 
		1 /* XXX - true */
		{ 
			list (/* XXX- QUOTE OK,*/,oldTuple,oldBufferPage);
		}
		break;

	default: /* do nothing */
	};

	/*     XXX Check the result and how it is used.
 *     XXX The buffer page returned may be of the incorrect format!
 */
	;
	if ( DebugLevel >= 1 ) {
		debug2_rule_manager (result,attrDesc,thisDepthOfRecursion,thisTimeCalled);
	} else {
	};

	depthOfRecursion = depthOfRecursion - 1;
	;
	return (result);
	;
}
LispValue
debug_rule_manager (commandcommand,useruser,relDescrelDesc,relIdrelId,oldTupleoldTuple,oldBufferPageoldBufferPage,newTuplenewTuple,
newBufferPagenewBufferPage,attrDescattrDesc,targetListtargetList,thisDepthOfRecursionthisDepthOfRecursion,thisTimeCalledthisTimeCalled)
LispValue command,user,relDesc,relId,oldTuple,oldBufferPage,newTuple,newBufferPage,attrDesc,targetList,thisDepthOfRecursion,
thisTimeCalled ;
{
	print (/* XXX- QUOTE */,,,,,,,,,,,,,,,,,);
	terpri ();
	print (/* XXX- QUOTE RULE_MANAGER_CALLED,*/);
	terpri ();
	print (/* XXX- QUOTE depthOfRecursion,*/,);
	print (thisDepthOfRecursion);
	terpri ();
	print (/* XXX- QUOTE timesCalled,*/,);
	print (thisTimeCalled);
	terpri ();
	print (/* XXX- QUOTE command,*/,);
	print (command);
	terpri ();
	print (/* XXX- QUOTE targetList,*/,);
	print (targetList);
	terpri ();
	print (/* XXX- QUOTE oldTuple,*/,);
	if ( or (null (oldTuple),eq (0,oldTuple)) ) {
		print (/* XXX- QUOTE NIL,*/);
		terpri ();
		;
	} else {
		debugtup (oldTuple,attrDesc)
		    /*    Print RuleLocks */
		;
		print ("----LOCKS (old Tuple):");
		terpri ();
		PrintTupleLocks (oldTuple,oldBufferPage,relDesc);
		;
	};

	print (/* XXX- QUOTE newTuple,*/,);
	if ( or (null (newTuple),eq (0,newTuple)) ) {
		print (/* XXX- QUOTE NIL,*/);
		terpri ();
		;
	} else {
		debugtup (newTuple,attrDesc)
		    /*    Print RuleLocks */
		;
		print ("----LOCKS (new Tuple):");
		terpri ();
		PrintTupleLocks (newTuple,newBufferPage,relDesc);
		;
	};

	terpri ();
}
LispValue
debug2_rule_manager (resultresult,attrDescattrDesc,thisDepthOfRecursionthisDepthOfRecursion,thisTimeCalledthisTimeCalled)
LispValue result,attrDesc,thisDepthOfRecursion,thisTimeCalled ;
{
	print (/* XXX- QUOTE RULE_MANAGER_FINISHED,*/);
	terpri ();
	print (/* XXX- QUOTE depthOfRecursion,*/,);
	print (thisDepthOfRecursion);
	terpri ();
	print (/* XXX- QUOTE timesCalled,*/,);
	print (thisTimeCalled);
	terpri ();
	print (/* XXX- QUOTE returnedTuple,*/,);
	if ( null (cadr (result)) ) {
		print (/* XXX- QUOTE NIL,*/);
	} else {
		debugtup (cadr (result),attrDesc);
	};

	terpri ();
	print (/* XXX- QUOTE */,,,,,,,,,,,,,,,,,);
	terpri ();
}
