Andy Guilard's DebugStr LSX Function

Mindwatering Incorporated

Author: Tripp W Black

Created: 11/18/2013 at 11:51 AM

 

Category:
Notes Developer Tips
LSX (LotusScript Extensions/Connectors)

The function below is used to debug LCFieldList issues. Call the function like:

Set fldLst = New LCFieldList
. . . (after the select is run)
Print Cstr ( DebugStr(fldLst, True) )


Function:

Function DebugStr(vel As Variant, Byval brief As Boolean) As Variant
' This function takes any variant or object and returns a string describing its value.
' E.g. a string type is converted to a string enclosed in quotes, a date or number is
' simply converted to its default string representation, and there are special notations
' for arrays and lists. For any object, the type name of the object is shown.
On Error Goto oops

Dim result$, cc$
Dim i%
If Isarray(vel) Then
Forall values In vel
result$ = result$ & ", " & DebugStr(values, brief)
End Forall
DebugStr
= "(" + Mid$(result$, 3) + ")"
Elseif Islist(vel) Then
Forall lvalues In vel
result$ = result$ + ", " + Listtag(lvalues) + "|" + DebugStr(lvalues, brief)
End Forall
DebugStr
= "{" + Mid$(result$, 3) + "}"
Else
Select Case Datatype(vel)
Case 0 ' EMPTY
DebugStr
= "EMPTY"
Case 1 ' NULL
DebugStr
= Null
Case 2, 3, 4, 5, 6, 7 ' any number or date
DebugStr
= Cstr(vel)
Case 8 ' String
DebugStr
= """"
For i% = 1 To Len(vel)
cc$ = Mid$(vel, i%, 1)
Select Case cc$
Case """", "\"
DebugStr
= DebugStr & "\" & cc$
Case "a" To "z", "A" To "Z", "0" To "9"
DebugStr
= DebugStr & cc$
Case Else
If Instr(".,`~/?;:'|{}[]=+-_)(*&^%$# @!", cc$) Then
DebugStr
= DebugStr + cc$
Else
DebugStr
= DebugStr & "\" & Uni(cc$) & "."
End If
End Select
Next
DebugStr
= DebugStr + """"
Case 9 ' OLE object or NOTHING
If vel Is Nothing Then
DebugStr
= "NOTHING"
Else
DebugStr
= "OLE Object"
End If
Case 10 ' OLE error
DebugStr
= "OLE Error"
Case 11 ' Boolean
If vel Then
DebugStr
= "True"
Else
DebugStr
= "False"
End If
Case Else
DebugStr
= Typename(vel)
Select Case Typename(vel)
Case "NOTESDOCUMENT"
DebugStr
= DebugStr & " noteID=" & vel.noteid
Case "NOTESVIEW"
DebugStr
= DebugStr & {(} & vel.name & {)}
Case "NOTESDOCUMENTCOLLECTION"
DebugStr
= DebugStr & {(} & vel.count & {)}
Case "LCFIELDLIST"
result = ""
For i = 1 To vel.FieldCount
result = result & ", " & vel.GetName(i) & "=" & DebugStr(vel.GetField(i), brief)
Next
If brief Then
DebugStr
= Mid$(result, 3)
Else
DebugStr
= "FL<" & Mid$(result, 3) & ">"
End If
Case "LCFIELD"
debugStr
= debugStrLCField(vel, brief)
Case "LCCONNECTION"
debugStr
= debugStr & {< } & debugProperties(vel) & { >}
End Select
End Select
End If
Exit Function

oops:
debugStr
= "error " & Err & " line " & Erl & ": " & Error
Exit Function
End Function

Function debugFMTName(ffmt As Long) As String
Select Case ffmt
Case LCSTREAMFMT_BLOB
debugFMTName = "BLOB"
Case LCSTREAMFMT_COMPOSITE
debugFMTName = "COMPOSITE"
Case LCSTREAMFMT_TEXT_LIST
debugFMTName = "TEXTLIST"
Case LCSTREAMFMT_NUMBER_LIST
debugFMTName = "NUMBERLIST"
Case LCSTREAMFMT_DATETIME_LIST
debugFMTName = "DATETIMELIST"
Case Else
debugFMTName = "format=" & ffmt & "?"
End Select
End Function

Function debugProperties(x) As String
' create a string listing all properties of a LCConnection or LCSession
Dim pTok As Long, pTyp As Long, pFlg As Long, pNam As String, more As Boolean, result As String
Dim fProp As LCField
more = x.ListProperty(LCLIST_FIRST, pTok, pTyp, pFlg, pNam)
While more
Set fProp = x.GetProperty(pTok)
result = result & ", " & pNam & "=" & debugstr(fProp, True)
more = x.ListProperty(LCLIST_NEXT, pTok, pTyp, pFlg, pNam)
Wend
debugProperties = Mid$(result, 3)
End Function

Function DebugFieldFlags(Byval flags As Long) As String
Dim result As String
If flags And LCFIELDF_KEY Then
result = ",key"
flags = flags And (Not LCFIELDF_KEY)
End If
If flags And LCFIELDF_KEY_NE Then
result = result & ",!="
flags = flags And (Not LCFIELDF_KEY_NE)
End If
If flags And LCFIELDF_KEY_GT Then
result = result & ",>"
flags = flags And (Not LCFIELDF_KEY_GT)
End If
If flags And LCFIELDF_KEY_LT Then
result = result & ",<"
flags = flags And (Not LCFIELDF_KEY_LT)
End If
If flags And LCFIELDF_NO_NULL Then
result = result & ",nonull"
flags = flags And (Not LCFIELDF_NO_NULL)
End If
If flags And LCFIELDF_TRUNC_PREC Then
result = result & ",truncprec"
flags = flags And (Not LCFIELDF_TRUNC_PREC)
End If
If flags And LCFIELDF_TRUNC_DATA Then
result = result & ",truncdata"
flags = flags And (Not LCFIELDF_TRUNC_DATA)
End If
If flags And LCFIELDF_NO_FETCH Then
result = result & ",nofetch"
flags = flags And (Not LCFIELDF_NO_FETCH)
End If
If flags And LCFIELDF_NO_INSERT Then
result = result & ",noinsert"
flags = flags And (Not LCFIELDF_NO_INSERT)
End If
If flags And LCFIELDF_NO_UPDATE Then
result = result & ",noupdate"
flags = flags And (Not LCFIELDF_NO_UPDATE)
End If
If flags And LCFIELDF_NO_REMOVE Then
result = result & ",noremove"
flags = flags And (Not LCFIELDF_NO_REMOVE)
End If
If flags And LCFIELDF_NO_CREATE Then
result = result & ",nocreate"
flags = flags And (Not LCFIELDF_NO_CREATE)
End If
If flags And LCFIELDF_NO_DROP Then
result = result & ",nodrop"
flags = flags And (Not LCFIELDF_NO_DROP)
End If
If flags > 0 Then
result = result & flags & "?"
End If
If result <> "" Then DebugFieldFlags = "[" & Mid$(result, 2) & "]"
End Function

Sub DebugPrint(Byval s As String)
Dim pos As Long
While Len(s) > 200
pos = Instr(180, s, " ")
If pos = 0 Then
Print s
Exit Sub
Else
Print Left$(s, pos-1)
s = Mid$(s, pos+1)
End If
Wend
If Len(s) > 0 Then
Print s
End If
End Sub

Function debugStrLCField(vel, Byval brief As Boolean) As String
If brief Then
If vel.IsNull(1) Then
debugStr
LCField = "NULL"
Elseif vel.Datatype = LCTYPE_BINARY Then
debugStr
LCField = "(binary)"
Else
debugStr
LCField = debugStr(vel.Value, brief)
End If
Else
If vel.Datatype = LCTYPE_BINARY Then
Dim buf As LCStream
Dim ffmt As Long, fmax As Long, fflg As Long
Call vel.GetFormatStream(fflg, fmax, ffmt)
Set buf = vel.GetStream(1, ffmt)
If ffmt = LCSTREAMFMT_TEXT_LIST Then
debugStr
LCField = "F(textlist:" & buf.Text & ")"
Elseif ffmt = LCSTREAMFMT_NUMBER_LIST Then
debugStr
LCField = "F(numlist:" & buf.Text & ")"
Elseif ffmt = LCSTREAMFMT_DATETIME_LIST Then
debugStr
LCField = "F(datelist:" & buf.Text & ")"
Else
debugStr
LCField = "F(binary:" & debugFMTName(ffmt) & ", " & buf.Length & " bytes)"
End If
Else
debugStr
LCField = "F" & debugStr(vel.Value, brief)
End If
debugStr
LCField = debugStrLCField & DebugFieldFlags(vel.Flags) & DebugFieldVirtCodes(vel)
End If
End Function

Function debugFieldVirtCodes(vel) As String
Dim lngVcode As Long
If vel.ListVirtualCode(LCLIST_FIRST, lngVcode) Then
debugFieldVirtCodes = debugFieldVirtCodes & "," & lngVcode
End If
If debugFieldVirtCodes <> "" Then debugFieldVirtCodes = "[virtcodes=" & Mid$(debugFieldVirtCodes, 2) & "]"
End Function

previous page