compile insert SQLExp_Manager_Equates ***************************************************************************** * * Name : SQLExp_Manager_Equates * Description: Equates and internal subroutines used by the SQL Warehousing * Manager and the wizard which starts the warehousing process. * * History (Date, Initials, Notes) * 03/03/97 cp Original programmer * 06/16/97 cp Updated for 3.5, split out of SQLExp_Manager * ***************************************************************************** goto SkipCode equ WP_ALL$ to "WP" * values selected in the start wizard the last time run are stored in SYSENV/CFG_SQLEXP equ OPT_WPLIST$ to 41 ;* list of WP names to run, @vm-delim'd equ OPT_LOCK$ to 42 ;* 1=prevent all, 2=prevent specific, 3=prevent none equ OPT_CREATE$ to 43 ;* bool, TRUE$ means create tables first equ OPT_CLEAR$ to 44 ;* 1=clear, 2=drop/create, 3=don't clear equ OPT_NOTUSED45$ to 45 equ OPT_NOTUSED46$ to 46 equ OPT_DUALCON$ to 47 ;* TRUE$ if second non-transacted con needed equ OPT_SCHEDTYPE$ to 48 ;* 1=last-used sched, 2=every n seconds, 3=once apiece equ OPT_DELAY$ to 49 ;* delay, in seconds, between re-runs * schedule data (amv) from the manager is stored in SYSENV/CFG_SQLEXP equ SCHED_WPNAME$ to 51 ;* list of wp names, @vm-delim'd equ SCHED_TYPE$ to 52 ;* 1=not scheduled, 2=next available, 3=certain date/time equ SCHED_TIME$ to 53 ;* dt value for type=3 equ SCHED_REPEAT$ to 54 ;* TRUE$ means repeat equ SCHED_INTERVAL$ to 55 ;* interval in seconds equ SCHED_SELECT$ to 56 ;* FULL, UPDATES, or custom equ SCHED_CREATE$ to 57 ;* TRUE$ means this wp needs tables created equ SCHED_CLEAR$ to 58 ;* 1=clear, 2=drop/create, 3=none equ SCHED_LASTRUN$ to 59 ;* last time run equ SCHED_DTFMT$ to 60 ;* date format (sv), defaults to "D2/" * manager states equ MGR_ST_STOP$ to 0 ;* not running equ MGR_ST_WAIT$ to 1 ;* waiting to exec next equ MGR_ST_RUN$ to 2 ;* running wp equ MGR_ST_PAUSE$ to 3 ;* pausing (pause button) equ MGR_ST_ABORT$ to 4 ;* running wp with expectation of a possible debugger abort (i.e. a wp blows up) * proc info equ PROC_NAME$ to 1 equ PROC_LASTRUN$ to 2 equ PROC_NEXTRUN$ to 3 equ PROC_TYPE$ to 4 ;* see SCHED_TYPE$ equ PROC_TIME$ to 5 ;* see SCHED_TIME$ equ PROC_REPEAT$ to 6 ;* see SCHED_REPEAT$ equ PROC_INTERVAL$ to 7 ;* see SCHED_INTERVAL$ equ PROC_SELECT$ to 8 ;* see SCHED_SELECT$ equ PROC_CREATE$ to 9 ;* see SCHED_CREATE$ equ PROC_CLEAR$ to 10 ;* see SCHED_CLEAR$ equ PROC_FIRST$ to 11 ;* TRUE$ if proc hasn't been run yet (used for create table logic) equ PROC_SCHED$ to 12 ;* time at which proc is scheduled to run ********************* * bulk get properties ********************* GetProps: swap "@" with @window in Ctrls convert "," to @rm in Ctrls convert "," to @rm in Props Vals = Get_Property(Ctrls, Props) return ********************* * bulk set properties ********************* SetProps: swap "@" with @window in Ctrls convert "," to @rm in Ctrls convert "," to @rm in Props Set_Property(Ctrls, Props, Vals) return *********************** * display error message *********************** * Error [in ] - text of error message * Ret [out] - failure ErrMsg: Error = "H" Error = Get_Property(@window, "TEXT") Msg(@window, Error) Ret = FALSE$ return ********************** * display info message ********************** * Error [in ] - text of info message InfoMsg: Error = "!" Error = Get_Property(@window, "TEXT") Msg(@window, Error) return ****************** * add error to log ****************** * Error [in ] - text to log (can be @fm-delim'd for multi errors) LogError: Limit = Get_Property(@window: ".ET_LOG", "LIMIT") <2> if Limit < 1000 then * remove blank errors convert " ":@fm to @fm:" " in Error Error = trim(Error) convert " ":@fm to @fm:" " in Error * stamp each error with currrent time Error = @fm: Error Limit += count(Error, @fm) if Limit >= 1000 then Error := @fm: "" end dFmt = Get_Property(@window, "@OPTIONS") swap @fm with (@fm: fmt(date(), dFmt): " ": fmt(time(), "MTS"): @vm) in Error Error [1,1] = "" * append to error log Send_Message(@window: ".ET_LOG", "INSERT", -1, Error) Set_Property(@window: ".CB_REVIEW", "ENABLED", TRUE$) end return *************************** * lock warehouse procedures *************************** * Type [in ] - 1=all, 2=specific, 3=none * List [in ] - @fm-delim'd list of procs * Init [in ] - TRUE$ if this is the first lock attempt * Ret [out] - TRUE$ on success, FALSE$ on failure * Error [out] - description on failure LockProcs: Ret = TRUE$ if Type and len(List) else return open "SYSENV" to f else Error = "Unable to open SYSENV." Ret = FALSE$ return end * type 1 puts an exclusive (obtrusive) lock on "all" if Type = 1 then if Init then lock f, WP_ALL$, X else Error = "Another workstation is already using the Warehouse Manager." Ret = FALSE$ end end return end * types 2&3 put a shared (non-obtrusive) lock on "all" if Init then lock f, WP_ALL$, S else Error = "Another workstation is already using the Warehouse Manager " Error := "and has prevented other workstations from warehousing." Ret = FALSE$ return end end Count = count(List, @fm) + (List # "") Pos = 1 loop while Pos <= Count Text = List if Type = 2 then * type 2 puts an exclusive (obtrusive) lock on each warehouse procedure lock f, Text, X else Error = "Another workstation is already using the ": Text: " Warehouse Procedure." Ret = FALSE$ end end else * type 3 puts a shared (non-obtrusive) lock on each warehouse procedure, * but detects if a workstation has an exclusive (obtrusive) lock already lock f, Text, S else Error = "Another workstation is already using the Warehouse Manager " Error := "and has prevented other workstations from executing the " Error := Text: " Warehouse Procedure." Ret = FALSE$ end end while Ret Pos += 1 repeat if Ret else * unlock each wp that was successfully locked Count = Pos - 1 for i = 1 to Count unlock f, List else null next i if Init then * remove the lock from "all" unlock f, WP_ALL$ else null end end return ***************************** * unlock warehouse procedures ***************************** * Type [in ] - 1=all, 2=specific, 3=none * List [in ] - @fm-delim'd list of procs * Final [in ] - TRUE$ means this is unlocking all procs * Ret [out] - TRUE$ on success, FALSE$ on failure * Error [out] - description on failure UnlockProcs: Ret = TRUE$ if Type else return open "SYSENV" to f else Error = "Unable to open SYSENV." Ret = FALSE$ return end * type 1 only bothers to put an exclusive lock on "all"; * the other types use exclusive or shared record locks on the wp's if Type > 1 and len(List) then Count = count(List, @fm) + (List # "") for i = 1 to Count unlock f, List else null next i end if Final then unlock f, WP_ALL$ else null end return ****************************** * check if time interval is ok ****************************** * Text [in ] - time interval string * Value [out] - time interval in seconds (only if ok) * Ret [out] - TRUE$ if ok, FALSE$ otherwise CheckInterval: Ret = TRUE$ Value = 0 Count = count(Text, ":") + (Text # "") if Count < 1 or Count > 3 then Ret = FALSE$ return end for i = 1 to Count Temp = field(Text, ":", Count - i + 1) Test = Temp convert "0123456789" to "" in Test if num(Temp) and len(Temp) and not(len(Test)) then if Temp >= 0 and Temp <= 59 then Value += Temp * field("1,60,3600", ",", i) end else Ret = FALSE$ return end end else Ret = FALSE$ return end next i * zero not allowed if Value else Ret = FALSE$ end return ************************************* * format seconds into interval string ************************************* * Value [in ] - time interval in seconds * Text [out] - time interval string FormatInterval: Text = fmt(int(Value / 3600), "R(0)#2"): ":": fmt(int(mod(Value, 3600) / 60), "R(0)#2"): ":": fmt(mod(Value, 60), "R(0)#2") return ****************************** * build list of available WP's ****************************** * Procs [out] - @fm-delim'd list of procs GetProcs: More = 1 Procs = "" *loop List = Get_Repos_Entities(@appid<1>, "STPROCEXE", "", FALSE$, FALSE$, FALSE$, More) Count = count(List, @fm) + (List # "") *if List<1> [1,3] <= "WP_" and List [1,3] >= "WP_" then * extract wp's Pos = index(@fm: List, @fm: "WP_", 1) if Pos then Pos = count(List [1,Pos], @fm) + 1 loop Text = List while Text [1,3] = "WP_" Procs<-1> = Text [4,99999] Pos += 1 repeat end *end *while More and List [1,3] <= "WP_" *repeat return SkipCode: