[Gambas-user] Probable bug with "_unknown" method when used for properties
Gary D Walborn
gwalborn at ...626...
Thu Jun 30 11:57:42 CEST 2011
Benoit,
Here is more detail on the problem... What I'm attempting to do is
read/write CISAM files from Gambas3. I am using the external VBISAM library
"libvbisam.so". I have a VBISAM class and a driver program. Here is the
VBISAM Class:
---------------------------------------------Begin
VBISAM-------------------------------------
Class VBISAM
Const ISFIRST As Integer = 0
Const ISLAST As Integer = 1
Const ISNEXT As Integer = 2
Const ISPREV As Integer = 3
Const ISCURR As Integer = 4
Const ISEQUAL As Integer = 5
Const ISGREAT As Integer = 6
Const ISGTEQ As Integer = 7
Const ISLOCK As Integer = &H100&
Const ISSKIPLOCK As Integer = &H200&
Const ISWAIT As Integer = &H400&
Const ISLCKW As Integer = &H500&
Const ISKEEPLOCK As Integer = &H800&
Const ISAUTOLOCK As Integer = &H200&
Const ISMANULOCK As Integer = &H400&
Const ISEXCLLOCK As Integer = &H800&
Const ISINPUT As Integer = 0
Const ISOUTPUT As Integer = 1
Const ISINOUT As Integer = 2
Const ISTRANS As Integer = 4
Const ISNOLOG As Integer = 8
Const ISVARLEN As Integer = &H10&
Const ISFIXLEN As Integer = 0
Extern isopen(FNAME As String, MODE As Integer) As Integer In "libvbisam"
Extern isread(FD As Integer, BUFF As Pointer, MODE As Integer) As Integer In
"libvbisam"
Extern isclose(FD As Integer) As Integer In "libvbisam"
Public RecLen As Integer = 768
Private FD As Integer
Public ReturnCode As Integer
Private BUFF As Pointer = Alloc(RecLen)
Public DataRecord As String
Private Dictionary As Collection
Private Sub ReadDict(FName As String)
Dim items As New String[30]
Dim DictIn As File
Dim TextLine As String
Dim i As String
Dim x As Integer
Dim Dict As DictEntry
DictIn = Open FNAME & ".dic" For Read
' Loop through each line until the end of file.
' Eof() returns true at the end of the file.
Dictionary = New Collection
While Not Eof(DictIn)
Line Input #DictIn, TextLine
' Split each line into fields
' Note that we set the " char as an escape char
items = Split(TextLine, ",", "\"")
Dict = New DictEntry
items[3] = Replace$(items[3], "-", "_")
Dict.DataName = items[3]
Dict.Pos = items[4] + 1
Dict.Len = items[5]
Dict.Type = items[6]
Dict.Occurs = items[8]
Dict.Edit = items[12]
Dict.SerialNo = items[19]
Dictionary[items[3]] = Dict
Wend
Close #DictIn
End
Public Sub _new(FNAME As String, Optional MODE As Integer = ISINPUT +
ISMANULOCK)
FD = isopen(FNAME, MODE)
ReadDict(FNAME)
End
Public Sub close()
Dim ReturnCode As Integer
ReturnCode = isclose(FD)
Free(BUFF)
End
Public Sub first() As Integer
Dim ch As Byte
Dim tmp As Pointer = BUFF
Dim I As Integer
Dim BuffStream As Stream
ReturnCode = isread(FD, BUFF, 0)
If ReturnCode < 0 Then
Return ReturnCode
Endif
BuffStream = Memory BUFF For Write
DataRecord = Read #BuffStream As String
Return ReturnCode
End
Public Sub _next()
Dim ch As Byte
Dim tmp As Pointer = BUFF
Dim I As Integer
Dim BuffStream As Stream
BuffStream = Memory BUFF For Write
ReturnCode = isread(FD, BUFF, ISNEXT)
If ReturnCode < 0 Then Enum.Stop
DataRecord = Read #BuffStream As String
Return
End
Public Function _unknown(...) As Variant
Dim Params As Integer = Param.Count
Dim D As DictEntry = Dictionary[Upper$(Param.Name)]
Dim Value As Variant
If Param.Property
If Params = 0 Then
Return Mid$(DataRecord, D.Pos, D.Len)
Else
Value = Param[0]
Mid$(DataRecord, D.Pos, D.Len) = Value
Endif
Endif
End
-----------------------------------------------End
VBISAM-------------------------------------
And here is the driver:
----------------------------------------------Begin
MMain---------------------------------------
' Gambas module file
Public Sub Main()
Dim CUSTOMER As VBISAM
Dim RESULT As Integer
Dim CustCount As Integer = 0
Dim Branch As String
CUSTOMER = New VBISAM("/data/CUSTFILE")
RESULT = CUSTOMER.first()
For Each CUSTOMER
Branch = CUSTOMER.Branch
If CUSTOMER.Branch = "000" Then Goto ReadNext
Print CUSTOMER.Key, CUSTOMER.Name, CUSTOMER.City, CUSTOMER.State,
CUSTOMER.Zip_Code
CustCount += 1
ReadNext:
Next
CUSTOMER.close()
Print "Total Customers: " & CustCount
End
-------------------------------------------End
MMain----------------------------------------
The error message I get in line 12 of MMain is:
Type mismatch: Wanted Number, Date, or String, got Function instead in
MMain:12.
Without the "If CUSTOMER" statement, everything is fine (i.e., I can use a
property as as string when I print or do other opeations). However, the
"IF" statrement (line 12) doesn't like the unknown property at all! I set a
breakpoint in the _unknown method of VBISAM and it gets there when using the
unknown properties in print statements (or other expressions), but does not
when using it in a conditional.
Hope that helps,
gwalborn
--
Gary D. Walborn
gwalborn at ...626...
More information about the User
mailing list