I follow John's policy in all web integration. All external access comes through a single entry point which identifies the purpose of the connection and transfers to an appropriate subroutine. I also include logging abilities in most code, just in case. Code below is made up for this example and not stylistically elegant nor complete. :
SUBROUTINE ENTRY.POINT(QUERY,RESPONSE) INCLUDE WEB.COMMON * that routine does initialization, logging, breaks up query, etc BEGIN CASE CASE OPERATION="CUSTINQ" CALL WEB.CUSTINQ(QUERY,RESPONSE) CASE 1 ; * bad request END CASE INCLUDE WEB.EXIT RETURN SUBROUTINE WEB.COMMON COMMON VARS(100) INCLUDE WEB.EQUATES ; * assign name to all VARS IF NOT(INITIALIZED) THEN GOSUB INIT IF LOGGING THEN GOSUB LOG .... RETURN SUBROUTINE WEB.EXIT IF LOGGING THEN GOSUB LOG ... RETURN Since all code includes WEB.COMMON, note from above that when LOGGING is active all routines will log on entry, and all programs have access to the common LOG function. HTH T > From: John Hester > Another gotcha I've run into in the past (also not app > platform specific) is difficutly isolating bugs in UV > subroutines that cause an abort. The result is a hung > unirpc connection and a corresponding consumed > license. If this problem happens in a frequently > called subroutine, you can quickly find yourself with > no UV licenses left. To isolate offending > subroutines, I created a tracking subroutine that gets > called at the beginning of each subroutine... _______________________________________________ U2-Users mailing list U2-Users@listserver.u2ug.org http://listserver.u2ug.org/mailman/listinfo/u2-users