home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Visual Database / Visual BASIC 5.0 (Ent. Edition) / Vb5ent Extractor.EXE / VB / SAMPLES / ENTRPRIS / POOLMGR / PMGR_SVR.BAS < prev    next >
Encoding:
BASIC Source File  |  1996-11-23  |  12.6 KB  |  367 lines

  1. Attribute VB_Name = "modPoolMngr"
  2. Option Explicit
  3.  
  4. 'Note: this is a simple example of a pool manager.  For demo purposes,
  5. 'if it does not find a list of servers to initialize, it creates an initial list with
  6. 'intrface project server as thge only member of the list.
  7. 'It should be quite straightforward to extend this implemntation to support
  8. 'a custom list of objects for your own environment needs.
  9. 'The allocation scheme could also be much more sophisticated to
  10. 'reflect the specific managment needs of your environment.
  11.  
  12. Type ProjectInfoStruc
  13.   Prev As Integer
  14.   Next As Integer
  15.   nFirstSvrNode As Integer
  16.   strProgID As String
  17.   intCurUseCount As Integer
  18.   intMinUseCount As Integer
  19.   intMaxUseCount As Integer
  20.   intCloseDelay As Integer
  21.   bLookAheadCreate As Integer
  22. End Type
  23.  
  24. Type ServerInstanceStruc
  25.   Prev As Integer
  26.   Next As Integer
  27.   ObjHandle As Object
  28.   DeallocTime As Date
  29.   bInUse As Integer
  30. End Type
  31.  
  32. Global Const gnINFO_TYPE = 0
  33. Global Const gnINST_TYPE = 1
  34. Global gaPrjInfo() As ProjectInfoStruc
  35. Global gaSvrInst() As ServerInstanceStruc
  36. Global gnFirstPrjNode As Integer
  37. 'Linked List implementation conventions:
  38.   'a root node is always available at index mnXXXX_ROOT
  39.   'when node.prev = node that node is the 1st member of a list
  40.   'when node.next = gnNIL that node is the last member of a list
  41. Const mINFO_FREE_ROOT = 0
  42. Const mINST_FREE_ROOT = 0
  43. Global Const gnNIL = -1
  44. Const mnMAX_NODES = 32000
  45.  
  46. Const mstrINI_POOL_MNGR_FILE_NAME = "poolmngr.ini"
  47. Const mstrINI_POOL_MNGR_KEY = "PoolManager"
  48. Const mstrINI_POOL_SVR_KEY = "PoolSvr"
  49.  
  50. #If Win32 Then
  51.   Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  52.   Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lplFileName As String) As Long
  53. #Else
  54.   Declare Function GetPrivateProfileString Lib "Kernel" (ByVal Secname1$, ByVal Keynamei$, ByVal Def1$, ByVal Ret1$, ByVal Size1%, ByVal lpFileName$) As Integer
  55.   Declare Function WritePrivateProfileString% Lib "Kernel" (ByVal lpAppName$, ByVal lpKeyName$, ByVal lpString$, ByVal lpFileName$)
  56. #End If
  57.  
  58. Sub Main()
  59.    frmPoolMngr.Show
  60. End Sub
  61.  
  62. Sub InitProjectArray()
  63.   Dim strPrjSettings As String
  64.   Dim bDone As Integer
  65.   Dim i As Integer
  66.   Dim j As Integer
  67.   Dim nPrjNode As Integer
  68.   Dim nPrevPrjNode As Integer
  69.   Dim nSvrNode As Integer
  70.   Dim intPtr1  As Integer
  71.   Dim intPtr2  As Integer
  72.   
  73. 'Initialize Linked List Pools and set root references to themselves
  74. ReDim gaPrjInfo(0) As ProjectInfoStruc              'alloc mINFO_FREE_ROOT
  75. gaPrjInfo(mINFO_FREE_ROOT).Prev = mINFO_FREE_ROOT
  76. gaPrjInfo(mINFO_FREE_ROOT).Next = mINFO_FREE_ROOT
  77. ReDim gaSvrInst(0) As ServerInstanceStruc       'alloc mINST_FREE_ROOT
  78. gaSvrInst(mINST_FREE_ROOT).Prev = mINST_FREE_ROOT
  79. gaSvrInst(mINST_FREE_ROOT).Next = mINST_FREE_ROOT
  80.  
  81. i = 0
  82.   While Not bDone
  83.     strPrjSettings = IniStringGet(mstrINI_POOL_SVR_KEY & Format$(i))
  84.     If strPrjSettings = "" Then
  85.       If i = 0 Then
  86.         InitPoolSvrList
  87.       Else
  88.         bDone = True
  89.       End If
  90.     Else
  91.       nPrjNode = NodeGet(gnINFO_TYPE)
  92.       If nPrjNode = gnNIL Then
  93.         bDone = True
  94.       Else
  95.         If i = 0 Then
  96.           gnFirstPrjNode = nPrjNode
  97.           nPrevPrjNode = nPrjNode
  98.         Else
  99.           gaPrjInfo(nPrevPrjNode).Next = nPrjNode
  100.         End If
  101.         gaPrjInfo(nPrjNode).Prev = nPrevPrjNode
  102.         gaPrjInfo(nPrjNode).Next = gnNIL
  103.         gaPrjInfo(nPrjNode).nFirstSvrNode = gnNIL
  104.         gaPrjInfo(nPrjNode).intCurUseCount = 0
  105.         
  106.         'Parse Ini string and initialize Project Info struc
  107.         intPtr1 = 1
  108.         intPtr2 = InStr(intPtr1, strPrjSettings, ",")
  109.         If intPtr2 > 0 Then gaPrjInfo(nPrjNode).strProgID = Mid$(strPrjSettings, intPtr1, intPtr2 - intPtr1)
  110.         intPtr1 = intPtr2 + 1
  111.         intPtr2 = InStr(intPtr1, strPrjSettings, ",")
  112.         If intPtr2 > 0 Then gaPrjInfo(nPrjNode).intMinUseCount = Val(Mid$(strPrjSettings, intPtr1, intPtr2 - intPtr1))
  113.         intPtr1 = intPtr2 + 1
  114.         intPtr2 = InStr(intPtr1, strPrjSettings, ",")
  115.         If intPtr2 > 0 Then gaPrjInfo(nPrjNode).intMaxUseCount = Val(Mid$(strPrjSettings, intPtr1, intPtr2 - intPtr1))
  116.         intPtr1 = intPtr2 + 1
  117.         intPtr2 = InStr(intPtr1, strPrjSettings, ",")
  118.         If intPtr2 > 0 Then gaPrjInfo(nPrjNode).intCloseDelay = Val(Mid$(strPrjSettings, intPtr1, intPtr2 - intPtr1))
  119.         gaPrjInfo(nPrjNode).bLookAheadCreate = Val(Mid$(strPrjSettings, intPtr2 + 1))
  120.         
  121.         'Initialize Server pool to minimum size
  122.         For j = 0 To gaPrjInfo(nPrjNode).intMinUseCount - 1
  123.           nSvrNode = GetNewServerNode(nPrjNode)
  124.           If nSvrNode = gnNIL Then Exit For
  125.           Set gaSvrInst(nSvrNode).ObjHandle = CreateObject(gaPrjInfo(nPrjNode).strProgID)
  126.           gaSvrInst(nSvrNode).bInUse = False
  127.         Next j
  128.         
  129.         i = i + 1
  130.         nPrevPrjNode = nPrjNode
  131.       End If
  132.     End If
  133.   Wend
  134. End Sub
  135.  
  136. Sub InitPoolSvrList()
  137.   'Define an initial Pool Server List entry so that the pool manager can be demoed
  138.   Const strINTERFACE_PROG_ID = "InterfaceProj.ServerInterface"
  139.   Const strPASSTHRU_PROG_ID = "PassThruProj.PassThruClass"
  140.   Dim strTmp As String
  141.    
  142.   strTmp = strINTERFACE_PROG_ID & "," & "1,6,60,-1"
  143.   IniStringSet mstrINI_POOL_SVR_KEY & "0", strTmp
  144.   strTmp = strPASSTHRU_PROG_ID & "," & "1,6,60,-1"   'ProgId, MinPoolSize, MaxPoolSize, CloseDelay, LookAheadCreate
  145.   IniStringSet mstrINI_POOL_SVR_KEY & "1", strTmp
  146. End Sub
  147.  
  148. Sub NodeAppend(rnNodeType As Integer, rnBaseNode As Integer, rnNewNode As Integer)
  149.  'Append rnNewNode next of rnBaseNode
  150.   If rnNodeType = gnINFO_TYPE Then
  151.     gaPrjInfo(rnNewNode).Next = gaPrjInfo(rnBaseNode).Next
  152.     gaPrjInfo(rnNewNode).Prev = rnBaseNode
  153.     If gaPrjInfo(rnBaseNode).Next <> gnNIL Then
  154.       gaPrjInfo(gaPrjInfo(rnBaseNode).Next).Prev = rnNewNode
  155.     End If
  156.     gaPrjInfo(rnBaseNode).Next = rnNewNode
  157.   
  158.   ElseIf rnNodeType = gnINST_TYPE Then
  159.     gaSvrInst(rnNewNode).Next = gaSvrInst(rnBaseNode).Next
  160.     gaSvrInst(rnNewNode).Prev = rnBaseNode
  161.     If gaSvrInst(rnBaseNode).Next <> gnNIL Then
  162.       gaSvrInst(gaSvrInst(rnBaseNode).Next).Prev = rnNewNode
  163.     End If
  164.     gaSvrInst(rnBaseNode).Next = rnNewNode
  165.   End If
  166. End Sub
  167.  
  168. Function NodeGet(rnNodeType As Integer) As Integer
  169.  'Return a new Node immediately next of ROOT
  170.   NodeGet = gnNIL
  171.   
  172.   If rnNodeType = gnINFO_TYPE Then
  173.     If gaPrjInfo(mINFO_FREE_ROOT).Next = mINFO_FREE_ROOT Then
  174.       If Not NodeGrowLinkedList(gnINFO_TYPE, 2) Then Exit Function
  175.     End If
  176.     NodeGet = gaPrjInfo(mINFO_FREE_ROOT).Next
  177.     gaPrjInfo(mINFO_FREE_ROOT).Next = gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Next
  178.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = mINFO_FREE_ROOT
  179.   
  180.   ElseIf rnNodeType = gnINST_TYPE Then
  181.     If gaSvrInst(mINST_FREE_ROOT).Next = mINST_FREE_ROOT Then
  182.       If Not NodeGrowLinkedList(gnINST_TYPE, 8) Then Exit Function
  183.     End If
  184.     NodeGet = gaSvrInst(mINST_FREE_ROOT).Next
  185.     gaSvrInst(mINST_FREE_ROOT).Next = gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Next
  186.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = mINST_FREE_ROOT
  187.   End If
  188. End Function
  189.  
  190. Sub CloseOpenServers()
  191.   Dim nPrjNode As Integer
  192.   Dim nSvrNode As Integer
  193.   On Error GoTo cosErr
  194.  
  195.   nPrjNode = gnFirstPrjNode
  196.   While nPrjNode <> gnNIL
  197.     nSvrNode = gaPrjInfo(nPrjNode).nFirstSvrNode
  198.     While nSvrNode <> gnNIL
  199.       Set gaSvrInst(nSvrNode).ObjHandle = Nothing
  200.       nSvrNode = gaSvrInst(nSvrNode).Next
  201.     Wend
  202.     nPrjNode = gaPrjInfo(nPrjNode).Next
  203.   Wend
  204. GoTo cosExit
  205.  
  206. cosErr:
  207.   DisplayError
  208.   Resume cosExit
  209.  
  210. cosExit:
  211. End Sub
  212. Sub DisplayError()
  213.   #If gbDEBUG2 Then
  214.     MsgBox Error$
  215.   #End If
  216. End Sub
  217. Function GetNewServerNode(rnProjNode As Integer) As Integer
  218.   'Get a new Server node and initialize its references
  219.   Dim nSvrNode As Integer
  220.   On Error GoTo gnsnErr
  221.     
  222.   nSvrNode = NodeGet(gnINST_TYPE)
  223.   GetNewServerNode = nSvrNode
  224.   If nSvrNode = gnNIL Then Exit Function    'Should log error
  225.       
  226.   gaSvrInst(nSvrNode).Prev = nSvrNode
  227.   gaSvrInst(nSvrNode).Next = gaPrjInfo(rnProjNode).nFirstSvrNode
  228.   If gaPrjInfo(rnProjNode).nFirstSvrNode <> gnNIL Then
  229.     gaSvrInst(gaPrjInfo(rnProjNode).nFirstSvrNode).Prev = nSvrNode
  230.   End If
  231.   gaPrjInfo(rnProjNode).nFirstSvrNode = nSvrNode
  232.   GoTo gnsnExit
  233.  
  234. gnsnErr:
  235.   DisplayError
  236.   Resume gnsnExit
  237.  
  238. gnsnExit:
  239. End Function
  240. Function NodeGrowLinkedList(rnNodeType As Integer, rnIncrease As Integer) As Integer
  241.   Dim i As Integer
  242.   Dim nLast As Integer
  243.   Dim nFirst As Integer
  244.   On Error GoTo gllErr
  245.  
  246.   NodeGrowLinkedList = False
  247.   If rnIncrease < 1 Then Exit Function
  248.   If rnNodeType = gnINFO_TYPE Then
  249.     nLast = UBound(gaPrjInfo)
  250.     If nLast + rnIncrease < mnMAX_NODES Then ReDim Preserve gaPrjInfo(nLast + rnIncrease)
  251.       
  252.     nFirst = nLast + 1
  253.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = nLast + rnIncrease
  254.     gaPrjInfo(nLast + rnIncrease).Next = gaPrjInfo(mINFO_FREE_ROOT).Next
  255.     gaPrjInfo(mINFO_FREE_ROOT).Next = nFirst
  256.     gaPrjInfo(nFirst).Prev = mINFO_FREE_ROOT
  257.  
  258.     gaPrjInfo(nFirst).Next = nFirst + 1
  259.     For i = nFirst + 1 To nLast + rnIncrease - 1
  260.       gaPrjInfo(i).Prev = i - 1
  261.       gaPrjInfo(i).Next = i + 1
  262.     Next i
  263.     gaPrjInfo(i).Prev = i - 1
  264.   Else
  265.     nLast = UBound(gaSvrInst)
  266.     If nLast + rnIncrease < mnMAX_NODES Then ReDim Preserve gaSvrInst(nLast + rnIncrease)
  267.     
  268.     nFirst = nLast + 1
  269.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = nLast + rnIncrease
  270.     gaSvrInst(nLast + rnIncrease).Next = gaSvrInst(mINST_FREE_ROOT).Next
  271.     gaSvrInst(mINST_FREE_ROOT).Next = nFirst
  272.     gaSvrInst(nFirst).Prev = mINST_FREE_ROOT
  273.  
  274.     gaSvrInst(nFirst).Next = nFirst + 1
  275.     For i = nFirst + 1 To nLast + rnIncrease - 1
  276.       gaSvrInst(i).Prev = i - 1
  277.       gaSvrInst(i).Next = i + 1
  278.     Next i
  279.     gaSvrInst(i).Prev = i - 1
  280.   End If
  281.   NodeGrowLinkedList = True
  282.   GoTo gllExit
  283.  
  284. gllErr:
  285.   DisplayError
  286.   Resume gllExit
  287.  
  288. gllExit:
  289. End Function
  290.  
  291. Sub NodeRemove(rnNodeType As Integer, nRemoveNode As Integer)
  292.  'Extract node from siblings.
  293.   If rnNodeType = gnINFO_TYPE Then
  294.     gaPrjInfo(gaPrjInfo(nRemoveNode).Prev).Next = gaPrjInfo(nRemoveNode).Next
  295.     If gaPrjInfo(nRemoveNode).Next <> gnNIL Then
  296.       gaPrjInfo(gaPrjInfo(nRemoveNode).Next).Prev = gaPrjInfo(nRemoveNode).Prev
  297.     End If
  298.   ElseIf rnNodeType = gnINST_TYPE Then
  299.     gaSvrInst(gaSvrInst(nRemoveNode).Prev).Next = gaSvrInst(nRemoveNode).Next
  300.     If gaSvrInst(nRemoveNode).Next <> gnNIL Then
  301.       gaSvrInst(gaSvrInst(nRemoveNode).Next).Prev = gaSvrInst(nRemoveNode).Prev
  302.     End If
  303.   Else
  304.     Exit Sub
  305.   End If
  306.   NodeReturn rnNodeType, nRemoveNode
  307. End Sub
  308.  
  309. Sub NodeReturn(rnNodeType As Integer, nReturnNode As Integer)
  310.  'Insert nReturnNode immediately next ROOT
  311.   If rnNodeType = gnINFO_TYPE Then
  312.     gaPrjInfo(nReturnNode).Next = gaPrjInfo(mINFO_FREE_ROOT).Next
  313.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = nReturnNode
  314.     gaPrjInfo(mINFO_FREE_ROOT).Next = nReturnNode
  315.     gaPrjInfo(nReturnNode).Prev = mINFO_FREE_ROOT
  316.   ElseIf rnNodeType = gnINST_TYPE Then
  317.     gaSvrInst(nReturnNode).Next = gaSvrInst(mINST_FREE_ROOT).Next
  318.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = nReturnNode
  319.     gaSvrInst(mINST_FREE_ROOT).Next = nReturnNode
  320.     gaSvrInst(nReturnNode).Prev = mINST_FREE_ROOT
  321.   End If
  322. End Sub
  323.  
  324. Function IniStringGet(KeyString As String) As String
  325. Dim strIniBuffer As String * 255
  326. On Error GoTo gisErr
  327.  
  328.   #If Win32 Then
  329.     Dim lRetLen As Long
  330.     lRetLen = GetPrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, "", strIniBuffer, 255, mstrINI_POOL_MNGR_FILE_NAME)
  331.     If lRetLen > 0 Then IniStringGet = Left$(strIniBuffer, lRetLen)
  332.   #Else
  333.     Dim nRetLen As Integer
  334.     nRetLen = GetPrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, "", strIniBuffer, 255, mstrINI_POOL_MNGR_FILE_NAME)
  335.     If nRetLen > 0 Then IniStringGet = Left$(strIniBuffer, nRetLen)
  336.   #End If
  337.  
  338.   GoTo gisExit
  339.  
  340. gisErr:
  341.   DisplayError
  342.   Resume gisExit
  343.  
  344. gisExit:
  345. End Function
  346.  
  347. Sub IniStringSet(KeyString As String, ValString As String)
  348.   Dim sIniGroupKey As String
  349.   On Error GoTo sisErr
  350.  
  351.   #If Win32 Then
  352.   Dim lTmp As Long
  353.   lTmp = WritePrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, ValString, mstrINI_POOL_MNGR_FILE_NAME)
  354.   #Else
  355.   Dim ntmp As Integer
  356.   ntmp = WritePrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, ValString, mstrINI_POOL_MNGR_FILE_NAME)
  357.   #End If
  358.   GoTo sisExit
  359.  
  360. sisErr:
  361.   DisplayError
  362.   Resume sisExit
  363.  
  364. sisExit:
  365. End Sub
  366.  
  367.