ServerDoc App Client.
When ScriptEZ.API based script file is running,
an identification area is appended
to the system menu of the console windows
as following:
'//////////////////////////////////////////////////////////////////////////////
' Author: SY
' Copyright 2011
' Demo
ScriptEZ.API based application which uses facilities from RAD API:
' . Connect, query for SQL data flow from
within ServerDoc App
' . Threadpool usage
' . Echo() method usage which
displays always messages into a console window
' instead of WScript.Echo() with 2 behaviours for
cscript.exe or wscript.exe
' . ScriptEZ.API Remoting Control Interface usage by
NPTelnet.exe program
' (Connect to
ScriptEZ.API process with <processid (PID)> as connection name)
'
' Purpose:
Client connecting to ServerDoc and posting queries for Perf Counters
'//////////////////////////////////////////////////////////////////////////////
const SCRIPTEZ_API
= "ScriptEZ.API" ' Component name
const PROBING_DELAY
= 10000 '
Delay in ms before launching a query
Dim SELECTED_FIELDS
Dim WshShell
Dim ScriptEZMain
Dim ScriptEZConnect
Dim hThreadPool
Dim onExit
Dim InputString
Dim HostAndPort
Dim typeEnc
' start the script
'/////////////////
On Error Resume Next
Main()
' Main Subroutine
'////////////////
Sub
'
selecting known fields for a SQL table
SELECTED_FIELDS = "DATE,SERVER_TIME,IN_USE_MEMORY,OWN_MEMORY,PENDING_TASKS,"
+ _
"SEND,RECV,RECV_MAX,RECV_MIN,QUERY_COUNT,QUERY_FAILURE,UPDATE_COUNT,"
+ _
"INCOMING_REQUEST,IP_LIMIT,WHITE_IP,BLOCKED_IP,COM_APARTMENT"
onExit = 0
Set WshShell = CreateObject("WScript.Shell")
'
instantiate component object with callback interface
Set ScriptEZMain = WScript.CreateObject(SCRIPTEZ_API,"ScriptEZMain_")
'ScriptEZMain.SetCPUCoreAffinity
"0"
'
creating thread pool with 1 thread for posting SQL query
hThreadPool
= ScriptEZMain.CreateTaskQueueObject(1)
'
connect to server
hStringTable
= ScriptEZMain.MallocStringTable(2)
r = ScriptEZMain.AddStringTableItem(hStringTable,"localhost:8088")
r = ScriptEZMain.AddStringTableItem(hStringTable,"88.173.237.11:8088")
InputString = ScriptEZMain.InputComboBox(0,
_
"Enter hostname and port to reach ServerDoc App, such like
localhost:8088", _
hStringTable)
ScriptEZMain.FreeStringTable
hStringTable
If Len(InputString)
<= 0 Then
Set ScriptEZMain = Nothing
Set WshShell = Nothing
Exit Sub
End If
HostAndPort =
Set ScriptEZConnect = WScript.CreateObject(SCRIPTEZ_API,"ScriptEZConnect_")
hStringTable
= ScriptEZMain.MallocStringTable(3)
r = ScriptEZMain.AddStringTableItem(hStringTable,".FULL
ENCRYPTION (RECOMMENDED)")
r = ScriptEZMain.AddStringTableItem(hStringTable,".CUSTOM
ENCRYPTION WITH 64 BYTES")
r = ScriptEZMain.AddStringTableItem(hStringTable,".NO
ENCRYPTION (UNSAFE & INCOMPATIBLE)")
encryptionType
= ScriptEZMain.InputComboBox(0,"SELECT A TYPE OF DATA ENCRYPTION FOR
DIALING WITH SERVERDOC",_
-hStringTable)
ScriptEZMain.FreeStringTable
hStringTable
If Len(encryptionType)
Then
' The third parameter can be chosen among 3 values:
' 0 (no encryption),
' -1 (encrypting all data, by default),
' n bytes encryption
Select Case encryptionType
Case ".NO ENCRYPTION
(UNSAFE & INCOMPATIBLE)"
typeEnc
= 0
Case ".FULL
ENCRYPTION (RECOMMENDED)"
typeEnc
= -1
Case ".CUSTOM
ENCRYPTION WITH 64 BYTES"
typeEnc = 64 '
along with 64 bytes
End Select
r = ScriptEZConnect.ServerDocConnect(HostAndPort(0),
HostAndPort(1),typeEnc)
ScriptEZMain.FreeBSTR
encryptionType
Else
Set ScriptEZConnect =
Nothing
Set ScriptEZMain = Nothing
Set WshShell = Nothing
Exit Sub
End If
' Restore previously saved console window's positions
r = ScriptEZConnect.RestoreWindowLayout(-1,WScript.ScriptName+
"_" + HostAndPort(0)+":"+HostAndPort(1))
'
Register App for receiving AppEvent(s) with
onAppEvent(EventID)
ScriptEZConnect.AppRegister
'
block until socket break or exit event
Do Until onExit = 3
WScript.Sleep 100
' Save current
console window's positions
r = ScriptEZConnect.SaveWindowLayout(-1,WScript.ScriptName+
"_" + HostAndPort(0)+":"+HostAndPort(1))
' App
unregister before ending
ScriptEZConnect.AppUnregister
WScript.Sleep 3000
Set ScriptEZConnect = Nothing
Set ScriptEZMain = Nothing
Set WshShell = Nothing
End Sub
' Callbacks for
App Events notification and fetching help text
'/////////////////////////////////////////////////////////////
Sub ScriptEZConnect_onAppEvent(EventID)
ScriptEZMain.Echo " ->
EventID:" + CStr(EventID)
Select Case EventID
Case 3 onExit= 3
End Select
End Sub
Function ScriptEZConnect_AppEventHelp()
ScriptEZConnect_AppEventHelp =
vbLF +_
CStr("Filename:
" + Chr(34) + CStr(WScript.ScriptFullName) + Chr(34) + vbLF +_
" **** Supported AppEvents ****" +
vbLF +_
"AppEventID = 3"
+ vbTab + "to exit" + vbLF _
)
End Function
' Callbacks for
ServerDoc Comm
'//////////////////////////////
Function ScriptEZConnect_onServerDocStatus(error_number)
Dim code_err
code_err = CStr(error_number)
If error_number = 0 Then
r = ScriptEZConnect.ServerDocPostSQLFields(SELECTED_FIELDS )
r = ScriptEZMain.AddTask(hThreadPool,0)
' Thread for posting SQL Query
ScriptEZMain.SetConsoleTitle
"ServerDoc@" + InputString + " connected"
Else
ScriptEZMain.Echo code_err
End If
ScriptEZConnect_onServerDocStatus = CLng(0)
End Function
' Callbacks for
ServerDoc Comm
'//////////////////////////////
Function ScriptEZConnect_onServerDocData(DataRows, RowCount,
DataSize)
If RowCount > 0 Then
Dim bstrData,encryptLabel
'
converting raw C-String to BSTR
bstrData =
ScriptEZMain.ConvertStringToBSTR(DataRows)
bstrArray = Split(bstrData,vbTab)
ScriptEZMain.FreeBSTR bstrData
Select Case typeEnc
Case 0
encryptLabel
= "none (unsafe & incompatible)"
Case -1
encryptLabel
= "full (recommended)"
Case 64
encryptLabel
= "along with 64 bytes (custom)"
End Select
bstrData
= vbCRLF + _
"
Refresh delay____: " + CStr(PROBING_DELAY/1000) + "
seconds" + vbCRLF + _
" ." + vbCRLF + _
"
DATE_____________: " + bstrArray(0) + vbCRLF + _
"
SERVER_TIME______: " + bstrArray(1) + vbCRLF + _
"
IN_USE_MEMORY____: " + bstrArray(2) + vbCRLF + _
"
OWN_MEMORY_______: " + bstrArray(3) + vbCRLF + _
"
PENDING_TASKS____: " + bstrArray(4) + vbCRLF + _
"
SEND_____________: " + bstrArray(5) + vbCRLF + _
"
RECV_____________: " + bstrArray(6) + vbCRLF + _
"
RECV_MAX_________: " + bstrArray(7) + vbCRLF + _
"
RECV_MIN_________: " + bstrArray(8) + vbCRLF + _
"
QUERY_COUNT______: " + bstrArray(9) + vbCRLF + _
"
QUERY_FAILURE____: " + bstrArray(10) + vbCRLF + _
"
UPDATE_COUNT_____: " + bstrArray(11) + vbCRLF + _
"
INCOMING_REQUEST_: " + bstrArray(12) + vbCRLF + _
"
IP_LIMIT_________: " + bstrArray(13) + vbCRLF + _
"
WHITE_IP_________: " + bstrArray(14) + vbCRLF + _
"
BLOCKED_IP_______: " + bstrArray(15) + vbCRLF + _
"
COM_APARTMENT____: " + bstrArray(16) + vbCRLF + _
" ." + vbCRLF
+ _
"
Encryption type__: " + encryptLabel
ScriptEZMain.ClearConsole
ScriptEZMain.Echo CStr(bstrData) + vbLF
ScriptEZMain.FreeString
raw_data
End If
ScriptEZConnect_onServerDocData
= CLng(0)
End Function
' Callback for thread pool
object (TaskQueueObject)
'//////////////////////////////////////////////////
Function ScriptEZMain_onRun( localStorage )
'
Yielding a while
WScript.Sleep PROBING_DELAY
'
Submitting a simple SQL query to ServerDoc about its Performance
counters
QueryCommandString = "SELECT * FROM
PERF_COUNT WHERE DATE='"+ CStr(Date)+"';"
' Instead of a full path filename, ":memory:" is a
special name for Perf counters
r = ScriptEZConnect.ServerDocPostSQLQuery(QueryCommandString,":memory:"
)
If onExit = 3 Then
ScriptEZMain_onRun = CLng(0) ' stop this task
ScriptEZMain.Echo "Exit
thread pool..."
r = ScriptEZConnect.ServerDocDisconnect
Exit Function
ElseIf r <> 0 Then
ScriptEZMain.Echo
"Terminate task..."
ScriptEZMain_onRun = CLng(0) ' stop this task
ScriptEZMain.SetConsoleTitle
"ServerDoc@" + InputString + " disconnected"
Else
ScriptEZMain_onRun = CLng(1) ' continue this task again
End If
End Function