[Oberon] Library

Dan Parnete parnete at aladata.it
Sun Aug 31 18:40:41 CEST 2003


Hello,

I'm writing a simple database engine based on Library. Practically I'm 
collecting objects in lib and store libs in a database file. For now I 
have a running version with volatile indexes, witch is a nice experience 
with less the 5000 libs stored, but above that, building indexes on the 
fly is no more funny. Expecialy do to an anoing problem with 
Objects.LoadLibrary procedure.

I should like to do that:

PROCEDURE ReadLib*( f: Files.File, pos: LONGINT ): Objects.Library;
    VAR i, len: LONGINT;
             L: Objects.Library;
BEGIN
    NEW( L );  Objects.OpenLibrary( L );  Objects.LoadLibrary( L, f, 
pos+1, len );
    RETURN L
END ReadLib;

But the result is:

TRAP 7  Index out of range in thread Oberon.Loop

Files.ReadString  PC = 7278
    R =  00411878H Files.Rider
    ch =  00000020X
    i = 64
    x = "                                                                
" ...
Objects.LoadLibrary  PC = 6475
    @for = 8223
    @for = 13
    L =  014E0200H Objects.LibDesc
    N = 8224
    R =  00411878H Files.Rider
    dict =  00000000H (Objects.ListDictDesc)
    dorg = 595
    entry =  00000000H (Objects.EntryDesc)
    f =  01C1CA20H Files.File
    gorg = 512
    i = 14
    ind =  014AAF40H Objects.ArrayIndexDesc
    key = 8224
    len = 597
    n = 0
    pos = 200017
    version = 1380272450
DpsDb.ReadLib  PC = 11734
    L =  014E0200H Objects.LibDesc
    ch =  00000000X
    f =  01C1CA20H Files.File
    fl =  00000000H (Files.File)
    i = 0
    len = 597
    rl =  00411878H Files.Rider
    size = 597


And is nothing wrong with the data because doing that:

PROCEDURE ReadLib*( size: LONGINT; f: Files.File; r: Files.Rider ): 
Objects.Library;
    VAR i, len: LONGINT;
            ch: CHAR;
            fl: Files.File;  rl: Files.Rider;
            L: Objects.Library;
BEGIN
    fl := Files.New( "TempLib" );  Files.Set( rl, fl, 0 );
    FOR i:=0 TO size-1 DO Files.Read( r, ch );  Files.Write( rl, ch ) END;
    Files.Register( fl );  fl := Files.Old( "TempLib" );
    NEW( L );  Objects.OpenLibrary( L );  Objects.LoadLibrary( L, fl, 1, 
len );
    RETURN L
END ReadLib;

works fine, but writing on disk when you just want to read, is very time 
consuming. And if you use it to build and index, it's another nice mess.
Have any of you experienced this problem? I'm using Windows Plugin 
version 14.05.2001 but it's the same on WinAos and Linux.

Thank you,
Dan Parnete




More information about the Oberon mailing list