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 / PASSTHRU / PASS_SVR.BAS < prev    next >
Encoding:
BASIC Source File  |  1996-11-23  |  12.4 KB  |  365 lines

  1. Attribute VB_Name = "Module1"
  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 the 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.  
  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 strSIMPLE_PROG_ID = "SimpleProj.SimpleTimeClass"
  140.   Dim strTmp As String
  141.    
  142.   strTmp = strINTERFACE_PROG_ID & "," & "1,6,60,-1"
  143.   IniStringSet mstrINI_POOL_SVR_KEY & "0", strTmp
  144. End Sub
  145.  
  146. Sub NodeAppend(rnNodeType As Integer, rnBaseNode As Integer, rnNewNode As Integer)
  147.  'Append rnNewNode next of rnBaseNode
  148.   If rnNodeType = gnINFO_TYPE Then
  149.     gaPrjInfo(rnNewNode).Next = gaPrjInfo(rnBaseNode).Next
  150.     gaPrjInfo(rnNewNode).Prev = rnBaseNode
  151.     If gaPrjInfo(rnBaseNode).Next <> gnNIL Then
  152.       gaPrjInfo(gaPrjInfo(rnBaseNode).Next).Prev = rnNewNode
  153.     End If
  154.     gaPrjInfo(rnBaseNode).Next = rnNewNode
  155.   
  156.   ElseIf rnNodeType = gnINST_TYPE Then
  157.     gaSvrInst(rnNewNode).Next = gaSvrInst(rnBaseNode).Next
  158.     gaSvrInst(rnNewNode).Prev = rnBaseNode
  159.     If gaSvrInst(rnBaseNode).Next <> gnNIL Then
  160.       gaSvrInst(gaSvrInst(rnBaseNode).Next).Prev = rnNewNode
  161.     End If
  162.     gaSvrInst(rnBaseNode).Next = rnNewNode
  163.   End If
  164. End Sub
  165.  
  166. Function NodeGet(rnNodeType As Integer) As Integer
  167.  'Return a new Node immediately next of ROOT
  168.   NodeGet = gnNIL
  169.   
  170.   If rnNodeType = gnINFO_TYPE Then
  171.     If gaPrjInfo(mINFO_FREE_ROOT).Next = mINFO_FREE_ROOT Then
  172.       If Not NodeGrowLinkedList(gnINFO_TYPE, 2) Then Exit Function
  173.     End If
  174.     NodeGet = gaPrjInfo(mINFO_FREE_ROOT).Next
  175.     gaPrjInfo(mINFO_FREE_ROOT).Next = gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Next
  176.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = mINFO_FREE_ROOT
  177.   
  178.   ElseIf rnNodeType = gnINST_TYPE Then
  179.     If gaSvrInst(mINST_FREE_ROOT).Next = mINST_FREE_ROOT Then
  180.       If Not NodeGrowLinkedList(gnINST_TYPE, 8) Then Exit Function
  181.     End If
  182.     NodeGet = gaSvrInst(mINST_FREE_ROOT).Next
  183.     gaSvrInst(mINST_FREE_ROOT).Next = gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Next
  184.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = mINST_FREE_ROOT
  185.   End If
  186. End Function
  187.  
  188. Sub CloseOpenServers()
  189.   Dim nPrjNode As Integer
  190.   Dim nSvrNode As Integer
  191.   On Error GoTo cosErr
  192.  
  193.   nPrjNode = gnFirstPrjNode
  194.   While nPrjNode <> gnNIL
  195.     nSvrNode = gaPrjInfo(nPrjNode).nFirstSvrNode
  196.     While nSvrNode <> gnNIL
  197.       Set gaSvrInst(nSvrNode).ObjHandle = Nothing
  198.       nSvrNode = gaSvrInst(nSvrNode).Next
  199.     Wend
  200.     nPrjNode = gaPrjInfo(nPrjNode).Next
  201.   Wend
  202. GoTo cosExit
  203.  
  204. cosErr:
  205.   DisplayError
  206.   Resume cosExit
  207.  
  208. cosExit:
  209. End Sub
  210. Sub DisplayError()
  211.   #If gbDEBUG2 Then
  212.     MsgBox Error$
  213.   #End If
  214. End Sub
  215. Function GetNewServerNode(rnProjNode As Integer) As Integer
  216.   'Get a new Server node and initialize its references
  217.   Dim nSvrNode As Integer
  218.   On Error GoTo gnsnErr
  219.     
  220.   nSvrNode = NodeGet(gnINST_TYPE)
  221.   GetNewServerNode = nSvrNode
  222.   If nSvrNode = gnNIL Then Exit Function    'Should log error
  223.       
  224.   gaSvrInst(nSvrNode).Prev = nSvrNode
  225.   gaSvrInst(nSvrNode).Next = gaPrjInfo(rnProjNode).nFirstSvrNode
  226.   If gaPrjInfo(rnProjNode).nFirstSvrNode <> gnNIL Then
  227.     gaSvrInst(gaPrjInfo(rnProjNode).nFirstSvrNode).Prev = nSvrNode
  228.   End If
  229.   gaPrjInfo(rnProjNode).nFirstSvrNode = nSvrNode
  230.   GoTo gnsnExit
  231.  
  232. gnsnErr:
  233.   DisplayError
  234.   Resume gnsnExit
  235.  
  236. gnsnExit:
  237. End Function
  238. Function NodeGrowLinkedList(rnNodeType As Integer, rnIncrease As Integer) As Integer
  239.   Dim i As Integer
  240.   Dim nLast As Integer
  241.   Dim nFirst As Integer
  242.   On Error GoTo gllErr
  243.  
  244.   NodeGrowLinkedList = False
  245.   If rnIncrease < 1 Then Exit Function
  246.   If rnNodeType = gnINFO_TYPE Then
  247.     nLast = UBound(gaPrjInfo)
  248.     If nLast + rnIncrease < mnMAX_NODES Then ReDim Preserve gaPrjInfo(nLast + rnIncrease)
  249.       
  250.     nFirst = nLast + 1
  251.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = nLast + rnIncrease
  252.     gaPrjInfo(nLast + rnIncrease).Next = gaPrjInfo(mINFO_FREE_ROOT).Next
  253.     gaPrjInfo(mINFO_FREE_ROOT).Next = nFirst
  254.     gaPrjInfo(nFirst).Prev = mINFO_FREE_ROOT
  255.  
  256.     gaPrjInfo(nFirst).Next = nFirst + 1
  257.     For i = nFirst + 1 To nLast + rnIncrease - 1
  258.       gaPrjInfo(i).Prev = i - 1
  259.       gaPrjInfo(i).Next = i + 1
  260.     Next i
  261.     gaPrjInfo(i).Prev = i - 1
  262.   Else
  263.     nLast = UBound(gaSvrInst)
  264.     If nLast + rnIncrease < mnMAX_NODES Then ReDim Preserve gaSvrInst(nLast + rnIncrease)
  265.     
  266.     nFirst = nLast + 1
  267.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = nLast + rnIncrease
  268.     gaSvrInst(nLast + rnIncrease).Next = gaSvrInst(mINST_FREE_ROOT).Next
  269.     gaSvrInst(mINST_FREE_ROOT).Next = nFirst
  270.     gaSvrInst(nFirst).Prev = mINST_FREE_ROOT
  271.  
  272.     gaSvrInst(nFirst).Next = nFirst + 1
  273.     For i = nFirst + 1 To nLast + rnIncrease - 1
  274.       gaSvrInst(i).Prev = i - 1
  275.       gaSvrInst(i).Next = i + 1
  276.     Next i
  277.     gaSvrInst(i).Prev = i - 1
  278.   End If
  279.   NodeGrowLinkedList = True
  280.   GoTo gllExit
  281.  
  282. gllErr:
  283.   DisplayError
  284.   Resume gllExit
  285.  
  286. gllExit:
  287. End Function
  288.  
  289. Sub NodeRemove(rnNodeType As Integer, nRemoveNode As Integer)
  290.  'Extract node from siblings.
  291.   If rnNodeType = gnINFO_TYPE Then
  292.     gaPrjInfo(gaPrjInfo(nRemoveNode).Prev).Next = gaPrjInfo(nRemoveNode).Next
  293.     If gaPrjInfo(nRemoveNode).Next <> gnNIL Then
  294.       gaPrjInfo(gaPrjInfo(nRemoveNode).Next).Prev = gaPrjInfo(nRemoveNode).Prev
  295.     End If
  296.   ElseIf rnNodeType = gnINST_TYPE Then
  297.     gaSvrInst(gaSvrInst(nRemoveNode).Prev).Next = gaSvrInst(nRemoveNode).Next
  298.     If gaSvrInst(nRemoveNode).Next <> gnNIL Then
  299.       gaSvrInst(gaSvrInst(nRemoveNode).Next).Prev = gaSvrInst(nRemoveNode).Prev
  300.     End If
  301.   Else
  302.     Exit Sub
  303.   End If
  304.   NodeReturn rnNodeType, nRemoveNode
  305. End Sub
  306.  
  307. Sub NodeReturn(rnNodeType As Integer, nReturnNode As Integer)
  308.  'Insert nReturnNode immediately next ROOT
  309.   If rnNodeType = gnINFO_TYPE Then
  310.     gaPrjInfo(nReturnNode).Next = gaPrjInfo(mINFO_FREE_ROOT).Next
  311.     gaPrjInfo(gaPrjInfo(mINFO_FREE_ROOT).Next).Prev = nReturnNode
  312.     gaPrjInfo(mINFO_FREE_ROOT).Next = nReturnNode
  313.     gaPrjInfo(nReturnNode).Prev = mINFO_FREE_ROOT
  314.   ElseIf rnNodeType = gnINST_TYPE Then
  315.     gaSvrInst(nReturnNode).Next = gaSvrInst(mINST_FREE_ROOT).Next
  316.     gaSvrInst(gaSvrInst(mINST_FREE_ROOT).Next).Prev = nReturnNode
  317.     gaSvrInst(mINST_FREE_ROOT).Next = nReturnNode
  318.     gaSvrInst(nReturnNode).Prev = mINST_FREE_ROOT
  319.   End If
  320. End Sub
  321.  
  322. Function IniStringGet(KeyString As String) As String
  323. Dim strIniBuffer As String * 255
  324. On Error GoTo gisErr
  325.  
  326.   #If Win32 Then
  327.     Dim lRetLen As Long
  328.     lRetLen = GetPrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, "", strIniBuffer, 255, mstrINI_POOL_MNGR_FILE_NAME)
  329.     If lRetLen > 0 Then IniStringGet = Left$(strIniBuffer, lRetLen)
  330.   #Else
  331.     Dim nRetLen As Integer
  332.     nRetLen = GetPrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, "", strIniBuffer, 255, mstrINI_POOL_MNGR_FILE_NAME)
  333.     If nRetLen > 0 Then IniStringGet = Left$(strIniBuffer, nRetLen)
  334.   #End If
  335.  
  336.   GoTo gisExit
  337.  
  338. gisErr:
  339.   DisplayError
  340.   Resume gisExit
  341.  
  342. gisExit:
  343. End Function
  344.  
  345. Sub IniStringSet(KeyString As String, ValString As String)
  346.   Dim sIniGroupKey As String
  347.   On Error GoTo sisErr
  348.  
  349.   #If Win32 Then
  350.   Dim lTmp As Long
  351.   lTmp = WritePrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, ValString, mstrINI_POOL_MNGR_FILE_NAME)
  352.   #Else
  353.   Dim ntmp As Integer
  354.   ntmp = WritePrivateProfileString(mstrINI_POOL_MNGR_KEY, KeyString, ValString, mstrINI_POOL_MNGR_FILE_NAME)
  355.   #End If
  356.   GoTo sisExit
  357.  
  358. sisErr:
  359.   DisplayError
  360.   Resume sisExit
  361.  
  362. sisExit:
  363. End Sub
  364.  
  365.