<?xml version="1.0" encoding="windows-1251" ?>
<document type="SelFTrendxTest" version="0.0" xmlns:m="xTest">
    <xTest type="USER_SCRIPT" alias="MSSQLServerTransactionSimulationTest" 
          TitleRus="Тест эмуляции транзакций для MS SQL Server 2000/2005/2008" 
          TitleRootRus="Тесты MS SQL Server" 
          TitleEng="Transaction Simulation Test for MS SQL Server 2000/2005/2008" 
          TitleRootEng="MS SQL Server Tests" 
          TrafficLightsName="Transaction Simulation Test for MS SQL Server 2000/2005/2008"
          Version="2.1">
        <Files>
            <File type="conf" name="VB.MSCOMPerformanceData.xml" />
            <File type="help" name="XT.VB.what-UnallowedApp.html" />
            <File type="dll" name="ST_SCTest.dll" />
        </Files>
      <Keywords>
        <Keyword>Windows</Keyword>
        <Keyword>SQL</Keyword>
        <Keyword>Эмуляция транзакций</Keyword>
        <Keyword>Бизнес-приложение</Keyword>        
      </Keywords>
      <xTestProps>
            <log_level_def>5</log_level_def>
            <truncate_log>1</truncate_log>
            <AverInervDuration>60</AverInervDuration>
            <discovery_func>OnDiscovery</discovery_func>
            <work_func>OnDataReceived</work_func>
        </xTestProps>
        <parameters TitleRus="Список контролируемых ресурсов:" TitleEng="Servers List:">
            <resources>
                <resource_id TitleRus="Имя Windows компьютера" TitleEng="Name"></resource_id>
            </resources>
            
            <common_attribs TitleRus="Список параметров (общие):" TitleEng="Parameters List (common):" SubTitleRus="Параметр" SubTitleEng="Parameter">
                <Attrib Type="String" TitleRus="Пороговые значения метрики 'SQL Server Connect Time' (через ;)" 
                        TitleEng="Thresholds for 'SQL Server Connect Time' (separated by ;)" 
                        Alias="ThresholdTLSQLServerConnectTime">
                  10000000;7000000;4000000;1000000
                </Attrib>
              <Attrib Type="String" TitleRus="Пороговые значения метрики 'SQL Operation Time' (через ;)" 
                      TitleEng="Thresholds for 'SQL Operation Time' (separated by ;)" 
                      Alias="ThresholdTLSQLOperationTime">
                40000;30000;20000;10000
              </Attrib>
              <Attrib Type="String" TitleRus="Пороговые значения метрики 'Total Transaction Time' (через ;)" 
                      TitleEng="Thresholds for 'Total Transaction Time' (separated by ;)" 
                      Alias="ThresholdTLSQLTotalTransactionTime">
                10040000;7030000;4020000;1010000
              </Attrib>
            </common_attribs>
            
            <resource_attribs TitleRus="Список параметров:" TitleEng="Parameters List:" SubTitleRus="Параметр" SubTitleEng="Parameter">
              <!-- Type: "String", "Bool", "Integer", "Double", "Enum" -->
              <Attrib Type="String" TitleRus="SQL запрос" TitleEng="SQL Query" Alias="AliasSQLQuery">
                SELECT CHECKSUM(GetDate())
              </Attrib>
              <Attrib Type="String" TitleRus="Источник данных" TitleEng="DBSource" Alias="AliasDBSource">
                Provider=SQLOLEDB.1;Password=&lt;Enter Password&gt;;Persist Security Info=True;User ID=&lt;Enter UserName&gt;;Initial Catalog=&lt;Enter DB Name&gt;;Data Source=&lt;Enter SQL Server Name &gt;
              </Attrib>
              <Attrib Type="Enum" TitleRus="Расположение курсора" TitleEng="Cursor Location" Alias="AliasCursorLocation">
                <Attrib_enum TitleRus="Серверный" TitleEng="adUseServer">
                  2
                </Attrib_enum>
                <Attrib_enum TitleRus="Клиентский" TitleEng="adUseClient">
                  3
                </Attrib_enum>
              </Attrib>
              <Attrib Type="Enum" TitleRus="Уровень изоляции транзакции" TitleEng="Transaction Isolation Level" 
                      Alias="AliasTransactionIsolationLevel">
                <Attrib_enum TitleRus="ReadCommitted" TitleEng="ReadCommitted">
                  4096
                </Attrib_enum>
                <Attrib_enum TitleRus="Chaos" TitleEng="Chaos">
                  16
                </Attrib_enum>
                <Attrib_enum TitleRus="ReadUncommitted" TitleEng="ReadUncommitted">
                  256
                </Attrib_enum>
                <Attrib_enum TitleRus="RepeatableRead" TitleEng="RepeatableRead">
                  65536
                </Attrib_enum>
                <Attrib_enum TitleRus="Serializable" TitleEng="Serializable">
                  1048576
                </Attrib_enum>
              </Attrib>
              <Attrib Type="Bool" TitleRus="Выполнять запрос в транзации" TitleEng="Use Transaction" 
                      Alias="AliasUseTransaction">No
              </Attrib>
            </resource_attribs>
        </parameters>
        <popupdisplay>
            <!-- Function: "EventCount", "Average", "Maximum", "Minimum" -->
            <description ru="Тест эмуляции транзакций для MS SQL Server 2000/2005/2008" 
                         en="Transaction Simulation Test for MS SQL Server 2000/2005/2008"></description>            
            
        </popupdisplay>
        <Script language="VBScript">
            <!--

Option Explicit 

Const Threshold_Min = 1
Const Threshold_Max = 100

Sub OnDiscovery(ByRef ResSet)

	Dim a, Unid, l_strMsg,  i, l_Error 
  Dim l_nResCount
  Dim l_strSLAAliasName, l_strSLAEventName
  Dim l_objLog
  Dim l_objMSCOMAccessor 
  Dim l_objMetricsColl 
  Dim l_objMetrics

  Dim l_strTLNameRu
  Dim l_strTLNameEn
  
  Dim l_objMonResource  

  Dim l_aThresholdTLMetric
  
	'Stop
	
	'On Error Resume Next
	'Err.Clear	
  
	Unid = ResSet.UnidBase

  ResSet.LogMsg("Discovering test data")  

  ResSet.SendProgressMessage("VBScript is running")
    
  l_nResCount=ResSet.Count
  
  ResSet.LogMsg("Resources count: " & l_nResCount)  
  
  For i=0 To l_nResCount - 1
    
    Set l_objMonResource = ResSet.Resource(i)
    
    On Error Resume Next
    
    TestSQLServerConnection ResSet,l_objMonResource
    
    If (Err.Number <> 0) Then
      ResSet.LogMsg("Failed to TestSQLServerConnection. Resource [" & l_objMonResource.Name & "] "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
		  ResSet.ScriptError = -1
		  ResSet.ScriptErrorInfo = "Ошибка при подлючении к БД." & vbNewLine & "Ресурс [" & l_objMonResource.Name & "]." & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
      Err.Clear
      Exit Sub
    End If
    
    On Error GoTo 0
    
    ' Задаем метрики и индикаторы
    l_aThresholdTLMetric = GetThresholdForTL (ResSet.CommonProp.Attrib("ThresholdTLSQLServerConnectTime").Value)   
    
    If IsArray(l_aThresholdTLMetric) Then    
    
      l_strSLAEventName = GetSLAEventName(ResSet,i,"SQL Server Connect Time (usec)")    
      l_strSLAAliasName = GetSLAEventAliasFullName(l_objMonResource,"SQLServerConnectTime") 

      l_Error = ResSet.EventAdd(l_strSLAEventName, l_strSLAAliasName, Unid)
    
      l_strTLNameEn = "[" & l_objMonResource.Name & "] " & "SQL Server Connect Time (usec)"
      l_strTLNameRu = "[" & l_objMonResource.Name & "] " & "Время установления подключения к SQL Server (usec)"
    
      l_Error = ResSet.AddTrafficLight(l_strSLAAliasName, l_strTLNameRu, l_strTLNameEn, "Average",">", _
        l_aThresholdTLMetric(0),l_aThresholdTLMetric(1),l_aThresholdTLMetric(2),l_aThresholdTLMetric(3))

      Unid = Unid + 1
      
      ResSet.SendProgressMessage("Metric: " & l_strSLAEventName & " has been added")
      
    Else    
		  ResSet.ScriptError = -1
		  ResSet.ScriptErrorInfo = "Пороговые значения для 'SQL Server Connect Time (usec)' в свойствах теста указаны не верно! Проверьте настройки и повторите запуск тестов."
		  Exit Sub    		  
	  End If          

    l_aThresholdTLMetric = GetThresholdForTL (ResSet.CommonProp.Attrib("ThresholdTLSQLOperationTime").Value)   

    If IsArray(l_aThresholdTLMetric) Then
    
      l_strSLAEventName = GetSLAEventName(ResSet,i,"SQL Operation Time (usec)")    
      l_strSLAAliasName = GetSLAEventAliasFullName(l_objMonResource,"SQLOperationTime") 

      l_Error = ResSet.EventAdd(l_strSLAEventName, l_strSLAAliasName, Unid)

      l_strTLNameEn = "[" & l_objMonResource.Name & "] " & "SQL Operation Time (usec)"
      l_strTLNameRu = "[" & l_objMonResource.Name & "] " & "Время выполнения SQL запроса (usec)"

      l_Error = ResSet.AddTrafficLight(l_strSLAAliasName, l_strTLNameRu, l_strTLNameEn, "Average",">", _
        l_aThresholdTLMetric(0),l_aThresholdTLMetric(1),l_aThresholdTLMetric(2),l_aThresholdTLMetric(3))

      Unid = Unid + 1

      ResSet.SendProgressMessage("Metric: " & l_strSLAEventName & " has been added")
    
    Else 
		  ResSet.ScriptError = -1
		  ResSet.ScriptErrorInfo = "Пороговые значения для 'SQL Operation Time (usec)' в свойствах теста указаны не верно! Проверьте настройки и повторите запуск тестов."
		  Exit Sub    		      
    End If

    l_aThresholdTLMetric = GetThresholdForTL (ResSet.CommonProp.Attrib("ThresholdTLSQLTotalTransactionTime").Value)   

    If IsArray(l_aThresholdTLMetric) Then

      l_strSLAEventName = GetSLAEventName(ResSet,i,"Total Transaction Time (usec)")    
      l_strSLAAliasName = GetSLAEventAliasFullName(l_objMonResource,"TotalTransactionTime") 

      l_Error = ResSet.EventAdd(l_strSLAEventName, l_strSLAAliasName, Unid)
      
      l_strTLNameEn = "[" & l_objMonResource.Name & "] " & "Total Transaction Time (usec)"
      l_strTLNameRu = "[" & l_objMonResource.Name & "] " & "Полное время выполнения тестовой транзакции (usec)"
      
      l_Error = ResSet.AddTrafficLight(l_strSLAAliasName, l_strTLNameRu, l_strTLNameEn, "Average",">", _
        l_aThresholdTLMetric(0),l_aThresholdTLMetric(1),l_aThresholdTLMetric(2),l_aThresholdTLMetric(3))

      Unid = Unid + 1
      
      ResSet.SendProgressMessage("Metric: " & l_strSLAEventName & " has been added")

    Else
		  ResSet.ScriptError = -1
		  ResSet.ScriptErrorInfo = "Пороговые значения для 'Total Transaction Time (usec)' в свойствах теста указаны не верно! Проверьте настройки и повторите запуск тестов."
		  Exit Sub    		          
    End If

  Next
  
  ResSet.SendProgressMessage("Succeeded to add events.")

End Sub

Function GetThresholdForTL(l_ThresholdString)
	Dim arrTL, i
	arrTL = Split(l_ThresholdString, ";")
	If UBound(arrTL) <> 3 Then 
		GetThresholdForTL = "Данные не верны, проверьте правильность введенных пороговых значений в настройках теста - 1"
		Exit Function
	End If
	
	For i = LBound(arrTL) To UBound(arrTL)
		If Not IsNumeric (Trim(arrTL(i))) Then
			GetThresholdForTL = "Данные не верны, проверьте правильность введенных пороговых значений в настройках теста - 2"
			Exit Function
		End If
	Next
	
	GetThresholdForTL = arrTL
End Function

Function GetSLAEventName(ByRef ResSet, ByRef l_nResourceIndex, ByRef strEventName)

  Dim l_strSLAEventName

  l_strSLAEventName="[" & ResSet.Resource(l_nResourceIndex).Name & "] "
  l_strSLAEventName=l_strSLAEventName & strEventName
  
  GetSLAEventName = l_strSLAEventName
  
End Function

Function GetSLAEventAliasFullName(ByRef objMonResource, ByRef strAliasName)

  Dim l_strSLAEventAliasFullName

  l_strSLAEventAliasFullName="[" & objMonResource.Name & "] "
  l_strSLAEventAliasFullName=l_strSLAEventAliasFullName & strAliasName
  
  GetSLAEventAliasFullName = l_strSLAEventAliasFullName
  
End Function


Sub OnDataReceived(ByRef ResSet)

  On Error Resume Next
  
	Dim l_nError, i,j
  Dim l_objLog  
  
  Dim l_objSLAEventDurationGauge
  
  Dim l_nResCount
  Dim l_objMonResource
  
	'Stop
	Randomize Timer
	ResSet.InitEventsHash
	l_nError = ResSet.InternalError
	
  Set l_objLog = CreateObject("PLDBServiceLogComponent.PLDBServiceLog")

  l_objLog.AddDateTimePrefix = 1
  l_objLog.LogMode = 1

  l_objLog.EnableLog 1,"%temp%\PLMSSQLTransactionSimulationTest.log",1,-1,2

  l_objLog.WriteLn "MS SQL Test log",-1,2

  ' Создаем объект для измерения времени события
  Set l_objSLAEventDurationGauge = CreateObject("ProLAN.PLSLAEventDurationGaugeComponent.PLSLAEventDurationGauge")

  If (Err.Number <> 0) Then
    l_objLog.WriteLn  "Failed to CreateObject: ProLAN.PLSLAEventDurationGaugeComponent.PLSLAEventDurationGauge. " & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source,-1,2     
    Exit Sub
  End If

  l_objSLAEventDurationGauge.Log = l_objLog

  l_nResCount = ResSet.Count

  l_objLog.WriteLn  "Number of monitored resources: " & l_nResCount,-1,2         
  

  Do While Not ResSet.StopTest
    If ResSet.IsNewSLaPeriod Then
    
      For i  = 0 To l_nResCount - 1

        Set  l_objMonResource = ResSet.Resource(i)

        RunSQLTransaction ResSet,l_objMonResource,l_objSLAEventDurationGauge,l_objLog

        If Err.Number <> 0 Then
          l_objLog.WriteLn  "Failed to RunSQLTransaction. " & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source,-1,2         
          Err.Clear        
        End If

      Next

      ResSet.SendSLaEvents() ' Передаем измеренные события SLA
      ResetEvents ResSet
      
		Else			
			ResSet.Sleep 2000 'Pause 2 sec
		End If      
  Loop
End Sub

Sub RunSQLTransaction(ByRef ResSet, ByRef objMonResource, ByRef objSLAEventDurationGauge, ByRef objLog)

  'On Error Resume Next  

  Dim l_objConnection
  Dim l_objCommand
  Dim l_objRecordset  
  Dim l_objField

  Dim l_nSLAHandleConnectTime
  Dim l_nSLAHandleTotalTransactionTime
  Dim l_nSLAHandleDataRetriveTime

  Dim l_flSLAValueConnectTime
  Dim l_flSLAValueTotalTransactionTime
  Dim l_flSLAValueDataRetriveTime
  
  Dim i
  
  Dim l_strDBSource
  Dim l_strQuery  
  
  Dim l_adCursorLocation
  Dim l_adIsolationLevel
  
  Dim l_boolIsUseTransaction  

  ' Имя сервера, для которого выполняется тестовая транзакция
  ResSet.LogMsg("Monitoring resource: " & objMonResource.Name)  

  ' Строка подключения к источнику данных OLEDB
  l_strDBSource = objMonResource.Attrib("AliasDBSource").Value

  ResSet.LogMsg("DBSource: " & l_strDBSource)  

  ' Расположение курсора
  l_adCursorLocation = objMonResource.Attrib("AliasCursorLocation").Value    
                  
  ResSet.LogMsg("AliasCursorLocation: " & l_adCursorLocation)  

  ' Уровень изоляции транзакции
  l_adIsolationLevel = objMonResource.Attrib("AliasTransactionIsolationLevel").Value    

  ResSet.LogMsg("AliasTransactionIsolationLevel: " & l_adIsolationLevel)  

  ' Выполнять запрос в транзакции или нет
  l_boolIsUseTransaction = objMonResource.Attrib("AliasUseTransaction").Value       
  
  ResSet.LogMsg("UseTransaction: " & l_boolIsUseTransaction)  

  ' Начать замер времени тестовой транзакции
  l_nSLAHandleTotalTransactionTime=objSLAEventDurationGauge.BeginEvent()
  ' Начать замер времени подключения к БД
  l_nSLAHandleConnectTime=objSLAEventDurationGauge.BeginEvent()

  ' Создать объект ADODB.Connection
  Set l_objConnection = CreateObject("ADODB.Connection")
  
  l_objConnection.ConnectionString = l_strDBSource
  l_objConnection.CursorLocation = l_adCursorLocation
  l_objConnection.IsolationLevel = l_adIsolationLevel

  objLog.WriteLn "Opening connection to: " & l_strDBSource,-1,2

  l_objConnection.Open      

  ' Завершить замер времени подключения к БД
  l_flSLAValueConnectTime=objSLAEventDurationGauge.EndEvent(l_nSLAHandleConnectTime)      
  
  If l_boolIsUseTransaction = True Then
    l_objConnection.BeginTrans
  End If

  ' Начать замер времени SQL операции
  l_nSLAHandleDataRetriveTime=objSLAEventDurationGauge.BeginEvent()

  ' Создать ADO команду
  Set l_objCommand = CreateObject("ADODB.Command")

  ' Получить текст тестового SQL запроса
  l_strQuery = objMonResource.Attrib("AliasSQLQuery").Value
  
  ResSet.LogMsg("Resource Query: " & l_strQuery)  
    
  l_objCommand.CommandText = l_strQuery

  l_objCommand.ActiveConnection = l_objConnection

  ' Выполнить SQL запрос
  Set l_objRecordset=l_objCommand.Execute(vbNull,vbNull)

  ' Здесь может быть реализована обработка Recordset
  'Do While Not l_objRecordset.EOF

  '    objLog.WriteLn "DataDescr: start======",-1,2
      
  '    For i = 0 To l_objRecordset.Fields.Count -1
  '        Set l_objField = l_objRecordset.Fields(i)         
          
  '        objLog.WriteLn "Name: " & l_objField.Name,-1,2
  '        objLog.WriteLn "Value: " & l_objField.Value & " ",-1,2
  '    Next

  '    objLog.WriteLn "DataDescr: end======",-1,2
          
  '    l_objRecordset.MoveNext
  'Loop

  ' Завершить замер времени SQL операции
  l_flSLAValueDataRetriveTime=objSLAEventDurationGauge.EndEvent(l_nSLAHandleDataRetriveTime)

  objLog.WriteLn "Closing connection",-1,2

  If l_boolIsUseTransaction = True Then
    l_objConnection.CommitTrans
  End If

  ' Закрыть соединение с БД
  l_objConnection.Close

  objLog.WriteLn "Succeeded to execute script",-1,2

  ' Завершить замер времени тестовой транзакции
  l_flSLAValueTotalTransactionTime=objSLAEventDurationGauge.EndEvent(l_nSLAHandleTotalTransactionTime)

  ' Вывести в лог файл время операций
  objLog.WriteLn GetSLAEventAliasFullName(objMonResource,"SQLServerConnectTime") & " " & l_flSLAValueConnectTime & " (usec)",-1,2
  objLog.WriteLn GetSLAEventAliasFullName(objMonResource,"SQLOperationTime") & " " & l_flSLAValueDataRetriveTime & " (usec)",-1,2
  objLog.WriteLn GetSLAEventAliasFullName(objMonResource,"TotalTransactionTime") & " " & l_flSLAValueTotalTransactionTime & " (usec)",-1,2

  ' Передать значения измеренных метрик зонду
  ResSet.Events(GetSLAEventAliasFullName(objMonResource,"SQLServerConnectTime")).Value = l_flSLAValueConnectTime
  ResSet.Events(GetSLAEventAliasFullName(objMonResource,"SQLOperationTime")).Value = l_flSLAValueDataRetriveTime
  ResSet.Events(GetSLAEventAliasFullName(objMonResource,"TotalTransactionTime")).Value = l_flSLAValueTotalTransactionTime
   
  'ResSet.SendSLaEvents()

  If Err.Number <> 0 Then

    objLog.WriteLn "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source,-1,2 
    
    Err.Clear
    
  End If

End Sub

Sub TestSQLServerConnection(ByRef ResSet, ByRef objMonResource)

  Dim l_objConnection
  Dim l_strDBSource

  ResSet.LogMsg("Testing connection for resource: " & objMonResource.Name)  

  l_strDBSource = objMonResource.Attrib("AliasDBSource").Value

  ' Открываем соединение
  Set l_objConnection = CreateObject("ADODB.Connection")
  
  l_objConnection.ConnectionString = l_strDBSource

  ResSet.LogMsg("Opening connection to: " & l_strDBSource)  
   
  l_objConnection.Open      

  ResSet.LogMsg("Succeeded to open connection to: " & l_strDBSource)  
  
  l_objConnection.Close

End Sub

Sub ResetEvents(ByRef ResSet)
    Dim l_iEvCount, l_Indx

    l_iEvCount = ResSet.EventsCount
    
    For l_Indx = 0 To l_iEvCount - 1
        ResSet.Events(l_Indx).Value = ResSet.BadValue
    Next    

End Sub

--></Script>
    </xTest>
</document>
