[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