/* BAE_EXIT (STD) -- BAE Program Exit Action */ /* BAE_EXIT (STD) -- BAE Programmende-Aktion */ /* -- EXECUTED BEFORE EXITING CURRENT BAE MODULE -- */ /* // Copyright (c) 2006-2013 Bartels System GmbH, Muenchen // Author: Roman Ludwig // Changes History: // rl (131029) RELEASED FOR BAE V8.0. // rl (120427) RELEASED FOR BAE V7.8. // rl (101019) RELEASED FOR BAE V7.6. // rl (091020) RELEASED FOR BAE V7.4. // rl (081014) RELEASED FOR BAE V7.2. // rl (071029) RELEASED FOR BAE V7.0. // rl (060829) RELEASED FOR BAE V6.8. // rl (060216) ORIGINAL CODING: // // DESCRIPTION // // The bae_exit User Language program is automatically activated // before exiting the current BAE module. It frees any active lock for // the currently loaded element. */ // Enforce standard caller type #pragma ULCALLERSTD // Includes #include "sql.ulh" // User Language SQL utilities // INI file parameter name definitions #define PAR_USEREPROG "USEREPROG_STD" // User defined exit program name #define PAR_LOCKEXT "LOCKEXT_STD" // Lock file extension // Global variable names #define GV_LOCKFN "lockfname" // Locked element file name #define GV_LOCKEN "lockename" // Locked element plan name #define GV_LOCKCL "lockclass" // Locked element plan class #define GV_MODID "MODULEID" // Module instance ID // SQL command definitions #define L_DELETE1 "delete from lockinfo " #define L_DELETE2 "where class=%d AND ename=%s AND modid=%s;" #define L_CHKEXIST "select class from lockinfo;" string sqlcommand /* SQL command string */; // Globals static string usereprog = bae_inistrval(PAR_USEREPROG,"") /* User definied exit prog. name */; static string lockext = bae_inistrval(PAR_LOCKEXT,".lck") /* User definied load prog. name */; static int found /* Data found flag */; // Main program void main() { string lockfname /* Lock file name */; string modid /* Module ID name */; string oename /* Old lock element name */; int oddbcl /* Old lock element class */; // Check if extra user specific ULC program call requested if (usereprog!="") ulsystem(usereprog,0); // Release any lock for current element if (varget(GV_LOCKEN,oename)==0 && varget(GV_LOCKCL,oddbcl)==0) { // Get the module ID if (varget(GV_MODID,modid)!=0) modid=""; // Build the lock file name lockfname=convstring(bae_planfname(),0)+lockext; sprintf(sqlcommand,L_DELETE1+L_DELETE2,oddbcl, sql_quotestr(oename),sql_quotestr(modid)); sqlcmd(lockfname,sqlcommand,NULL); // Delete the lock entry vardelete(GV_LOCKFN); vardelete(GV_LOCKEN); vardelete(GV_LOCKCL); // Check if all locks to released found=0; sqlcmd(lockfname,L_CHKEXIST,lockchkfunc); if (!found) remove(lockfname); } } static int lockchkfunc(string dstr,int dint,double ddbl, int dval,int dtype,string dtable,string dfield,int didx) /* // Macro selection callback function // Return value : // zero if done or (-1) on data error // Parameters : // string dstr : String/Date data // int dint : Integer/Boolean data // double ddbl : Float data // int dval : Data valid flag // int dtype : Data type // string dtable : Data table name // string dfield : Data field name // int didx : Data output field index */ { found=1; // Return without errors return(0); } // User Language program end