home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / lockmanvie.tcl < prev    next >
Text File  |  1997-10-08  |  10KB  |  399 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)lockmanvie.tcl    /main/titanic/19
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)lockmanvie.tcl    /main/titanic/19   8 Oct 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require "browstable.tcl"
  13. require "lockbrobje.tcl"
  14. require "lockbrtabl.tcl"
  15. require "lockfilter.tcl"
  16. require "lockfiltdi.tcl"
  17. require "setlockdia.tcl"
  18. # End user added include file section
  19.  
  20. require "reptoolvie.tcl"
  21.  
  22. Class LockManView : {RepToolView} {
  23.     method destructor
  24.     constructor
  25.     method initialize
  26.     method selectedObjSet
  27.     method selectionChanged
  28.     method update
  29.     method reload
  30.     method getLockDetails
  31.     method removeLocks
  32.     method removeLock
  33.     method lockServerRunning
  34.     method setFont
  35.     method getFont
  36.     method fileNew
  37.     method fileDelete
  38.     method editSelectAll
  39.     method editDeselectAll
  40.     method editInvertSelection
  41.     method optionsLockFilter
  42.     method helpOnContext
  43.     attribute locksLoaded
  44.     attribute setLockPoppedUp
  45.     attribute badServers
  46.     attribute lastSelection
  47.     attribute lockList
  48.     attribute filterDialog
  49.     attribute setLockDialog
  50.     attribute shutdownDialog
  51.     attribute filter
  52. }
  53.  
  54. method LockManView::destructor {this} {
  55.     # Start destructor user section
  56.     # End destructor user section
  57.     $this RepToolView::destructor
  58. }
  59.  
  60. constructor LockManView {class this name} {
  61.     set this [RepToolView::constructor $class $this $name replock]
  62.  
  63.         $this setTitle "Lock Management" rep_lock_64
  64.         $this firstExposed "$this initialize"
  65.         $this filter [LockFilter new]
  66.         [$this filter] load
  67.     $this setLockPoppedUp 0
  68.  
  69.         [$this rep] quickTimeOut 5000
  70.  
  71.         # Create main interface part.
  72.         #
  73.         interface DlgColumn $this.gui.locks {
  74.         spaceType NONE
  75.         LockBrTable locks {
  76.         columnCount 72
  77.         rowCount 15
  78.             }
  79.         }
  80.         $this lockList $this.gui.locks.locks
  81.         [$this lockList] view $this
  82.         [$this lockList] font [$this getFont]
  83.         [$this lockList] selectionChanged "$this selectionChanged"
  84.         [$this lockList] setHeaderLabels {
  85.             Id Object Type User Host Pid Count Date Reason
  86.     }
  87.  
  88.     ViewPopUpMenu new [$this lockList].pop -poppedUp {
  89.       [.main lockList].pop entrySet [[.main menuHandler] validPopUpEntrySet]
  90.     }
  91.  
  92.     return $this
  93. }
  94.  
  95. proc LockManView::repToolClass {} {
  96.     return "LockManView"
  97. }
  98.  
  99. method LockManView::initialize {this} {
  100.     busy {
  101.         $this viewRefresh
  102.     }
  103. }
  104.  
  105. method LockManView::selectedObjSet {this} {
  106.     return [[$this lockList] selectedSet]
  107. }
  108.  
  109. method LockManView::selectionChanged {this} {
  110.     $this RepToolView::selectionChanged
  111.     
  112.     set ls [[$this rep] getLockServer 0]
  113.     if ![$ls isNil] {
  114.     catch {$ls disconnect}
  115.     }
  116. }
  117.  
  118. method LockManView::update {this} {
  119.     busy {
  120.         $this reload
  121.     }
  122. }
  123.  
  124. method LockManView::reload {this} {
  125.     set lockList [$this lockList]
  126.  
  127.     set currSel {}
  128.     foreach s [$lockList selectedSet] {
  129.         lappend currSel [$s label]
  130.     }
  131.     set newSel {}
  132.  
  133.     $lockList removeAllObjects
  134.     $lockList format
  135.  
  136.     set filter [$this filter]
  137.     set locks [[$this rep] getLocks [$filter description] \
  138.                     [$filter lockHanging]]
  139.     if {$locks == "NO_LOCKSERVER"} {
  140.     return
  141.     }
  142.  
  143.     set ls [[$this rep] getLockServer 0]
  144.  
  145.     set list [List new]
  146.     foreach lock $locks {
  147.     set desc [LockDescription new]
  148.         if ![catch {$ls describeLock $lock $desc}] {
  149.             $list append $desc
  150.         }
  151.     }
  152.  
  153.     set count 0
  154.     foreach desc [osort id -int [$list contents]] {
  155.     set label [$desc id]
  156.     LockBrObject new $lockList.lock$count $desc \
  157.         -label $label \
  158.         -details [$this getLockDetails $desc]
  159.  
  160.     if {[lsearch -exact $currSel $label] != -1} {
  161.         lappend newSel $lockList.lock$count
  162.     }
  163.  
  164.     incr count
  165.     }
  166.  
  167.     $lockList format
  168.     $lockList selectedSet $newSel
  169.  
  170.     if {$count != 1} {
  171.         set s "s"
  172.     } else {
  173.         set s ""
  174.     }
  175.  
  176.     $this message "Found $count lock$s."
  177. }
  178.  
  179. method LockManView::getLockDetails {this desc} {
  180.     set date "-"
  181.     if {[$desc date] != 0} {
  182.         set date [clock format [$desc date] -format "%b %d, %T"]
  183.     }
  184.     return [list \
  185.         [[$this rep] describeLock [$desc id]] \
  186.         [$desc types] \
  187.         [$desc user] \
  188.         [$desc host] \
  189.         [$desc pid] \
  190.         [$desc count] \
  191.         $date \
  192.         [$desc reason] ]
  193. }
  194.  
  195. method LockManView::removeLocks {this lockIds} {
  196.     global errorCode
  197.     set errorCode 0
  198.  
  199.     set count 0
  200.     foreach lock $lockIds {
  201.         set n [$this removeLock $lock]
  202.         if {$n > 0} {
  203.         incr count $n
  204.         }
  205.     }
  206.  
  207.     busy { $this viewRefresh }
  208. }
  209.  
  210. method LockManView::removeLock {this lockId {checkHanging 1}} {
  211.     set rep [$this rep]
  212.     set ls [$rep getLockServer 0]
  213.  
  214.     set desc [LockDescription new]
  215.     if [catch {$ls describeLock $lockId $desc}] {
  216.     busy { $this viewRefresh }
  217.     return 0
  218.     }
  219.  
  220.     if {$checkHanging && ![$rep isHangingLock $lockId]} {
  221.         set cnt [$desc count]
  222.         if {$cnt == 1} {
  223.         set lockDesc "Lock"
  224.             set is "is"
  225.             set these "this lock"
  226.         } else {
  227.         set lockDesc "Locks"
  228.             set is "are"
  229.             set these "these locks"
  230.     }
  231.  
  232.         set msg "$lockDesc on '[$rep describeLock $lockId]' $is not hanging.\
  233.          \nOwning process [$desc pid] of '[$desc user]'\
  234.          is still running on host '[$desc host]',\
  235.          \nor was terminated abnormally, possibly due to a system reboot.\
  236.          \n\nDo you want to delete $these anyway?"
  237.  
  238.     set dlg [YesNoWarningDialog new $this.removehangingdlg \
  239.         -title "Confirm Non-hanging Lock Delete" \
  240.         -message $msg \
  241.         -yesPressed "busy \"$this removeLock $lockId 0\"" \
  242.         -helpPressed "$this helpOnName deleteNonHangingLock"]
  243.  
  244.         $dlg delCancelButton
  245.         $dlg popUp
  246.         return
  247.     }
  248.  
  249.     busy {
  250.         set r 0
  251.         set count [$desc count]
  252.         while {$count > 0} {
  253.         incr r [$rep removeLock $lockId 0]
  254.             incr count -1
  255.         }
  256.         $this viewRefresh
  257.         set selected {}
  258.         foreach sel [$this lastSelection] {
  259.             if [isCommand $sel] {
  260.                 lappend selected $sel
  261.             }
  262.         }
  263.         [$this lockList] selectedSet $selected
  264.     $this selectionChanged
  265.     }
  266.  
  267.     if {$r > 0} {
  268.         $this message "Removed $r lock[expr {$r == 1 ? "" : "s"}]."
  269.     } else {
  270.         $this message "No locks were removed."
  271.     }
  272.  
  273.     return $r
  274. }
  275.  
  276. method LockManView::lockServerRunning {this} {
  277.     set ls [[$this rep] getLockServer 0]
  278.     if [$ls isNil] {
  279.         return 0
  280.     }
  281.     return 1
  282. }
  283.  
  284. method LockManView::setFont {this font} {
  285.     [$this lockList] font $font
  286.  
  287.     $this RepToolView::setFont $font
  288. }
  289.  
  290. method LockManView::getFont {this} {
  291.     return [m4_var get M4_font -context replock]
  292. }
  293.  
  294. method LockManView::fileNew {this {objectId ""} {clientCtx ""}} {
  295.     if {[$this setLockDialog] == ""} {
  296.     $this setLockDialog [SetLockDialog new $this.setlockdlg $this]
  297.     }
  298.  
  299.     # These are set when called by LockBrTable on which an object was
  300.     # dropped.
  301.     #
  302.     if {$objectId != ""} {
  303.         [$this setLockDialog] setObject $objectId
  304.     }
  305.     if {$clientCtx != ""} {
  306.         [$this setLockDialog] setClient $clientCtx
  307.     }
  308.  
  309.     if ![$this setLockPoppedUp] {
  310.     [$this setLockDialog] popUp
  311.         $this setLockPoppedUp 1
  312.     }
  313. }
  314.  
  315. method LockManView::fileDelete {this} {
  316.     $this lastSelection [[$this lockList] selectedSet]
  317.     foreach obj [$this lastSelection] {
  318.         lappend lockIds [$obj lock]
  319.     }
  320.  
  321.     set cnt [llength $lockIds]
  322.     if {$cnt == 1} {
  323.         set lock [lindex $lockIds 0]
  324.         set desc [LockDescription new]
  325.         set ls [[$this rep] getLockServer 0]
  326.         
  327.         if [catch { $ls describeLock $lock $desc  }] {
  328.         busy { $this viewRefresh }
  329.             return 0
  330.         }
  331.  
  332.         set obj  [$desc object]
  333.         set type [$desc types]
  334.         set user [$desc user]
  335.         set host [$desc host]
  336.         set cnt  [$desc count]
  337.         if {$cnt == 1} {
  338.         set typeDesc "${type}Lock"
  339.         } else {
  340.             set typeDesc "$cnt ${type}Locks"
  341.         }
  342.  
  343.         set what "the $typeDesc on\n'[[$this rep] describeLock $lock]'\
  344.                   set by '$user' on host '$host'"
  345.     } else {
  346.         set what "these $cnt locks"
  347.     }
  348.  
  349.     set dlg [YesNoWarningDialog new $this.removelockdlg \
  350.         -title "Confirm Lock Delete" \
  351.         -message "Are you sure you want to delete $what?" \
  352.         -yesPressed "busy { $this removeLocks [list $lockIds] }" \
  353.         -helpPressed "$this helpOnName deleteLock"]
  354.  
  355.     $dlg delCancelButton
  356.     $dlg popUp
  357. }
  358.  
  359. method LockManView::editSelectAll {this} {
  360.     [$this lockList] selectedSet [[$this lockList] objectSet]
  361.     $this selectionChanged
  362. }
  363.  
  364. method LockManView::editDeselectAll {this} {
  365.     [$this lockList] selectedSet {}
  366.     $this selectionChanged
  367. }
  368.  
  369. method LockManView::editInvertSelection {this} {
  370.     set selected [[$this lockList] selectedSet]
  371.     set inverse {}
  372.     foreach obj [[$this lockList] objectSet] {
  373.         if {[lsearch $selected $obj] == -1} {
  374.             lappend inverse $obj
  375.         }
  376.     }
  377.     [$this lockList] selectedSet $inverse
  378.     $this selectionChanged
  379. }
  380.  
  381. method LockManView::optionsLockFilter {this} {
  382.     if {[$this filterDialog] == ""} {
  383.         $this filterDialog [LockFiltDialog new $this.lockfiltdlg $this]
  384.     }
  385.     [$this filterDialog] popUp
  386. }
  387.  
  388. method LockManView::helpOnContext {this} {
  389.     set selected [[$this lockList] selectedSet]
  390.     if ![lempty $selected] {
  391.         $this helpOnName selectedLock
  392.     } else {
  393.         $this helpOnName repToolLockManView
  394.     }
  395. }
  396.  
  397. # Do not delete this line -- regeneration end marker
  398.  
  399.