Icon View Thread

The following is the text of the current message along with any replies.
Messages 1 to 10 of 18 total
Thread Database full error 9480
Thu, Apr 27 2006 2:15 PMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

I've run into this error. Why I'm not sure. AddImages is run as part of a routine which is going to convert stuff from one format to another, there's about 25k records in the table to be converted, not all of them will have images.Roughly 83% of the way through I get the error which presumably means I've created more than 4096 tables in memory. The problem is for all of the tables I create I also zap em, or at least I thought I was. Can anyone suggest what's going on, and preferably a solution.

procedure AddImages;
var
 ePics: TDBISAMTable;
begin
 if not eMail.FieldByName('_InLine').IsNull then begin
  Pics := Encoded.AddPartMultipart('related', MimePart);
  ePics := MakeDBISAMTable(MakeImgAttMemTable('enc', 'I', Session), 'Memory', Session);<<<<<<<<<<<< table created here
  StreamMemoToTable('_InLine', eMail, ePics);
  ePics.First;
  while not ePics.Eof do begin
   ms := TMemoryStream.Create;
   TMemoField(ePics.FieldByName('_Item')).SaveToStream(ms);
   Encoded.AddPartHTMLBinary(ms, ExtractFileName(ePics.FieldByName('_Name').AsString), ePics.FieldByName('_CID').AsString, Pics);
   ms.Free;
   ePics.Next;
  end;
  ZapInMemoryTable(ePics);<<<<<<<<<<<< table removed here - or so I thought
 end;
end;

procedure ZapInMemoryTable(WhichTable: TDBISAMTable);
begin
try
 if Assigned(WhichTable) and WhichTable.Exists then begin
  WhichTable.DisableControls;
  WhichTable.Close;
  WhichTable.Exclusive := True;
  if not (WhichTable.Bof and WhichTable.Eof) then WhichTable.EmptyTable;
  WhichTable.DeleteTable;
  FreeAndNil(WhichTable);
 end;
except
//  MessageDlg('Problem experienced deleteing memory table: ' + #13 + WhichTable.Name + #13 + WhichTable.TableName, mtError, [mbOK], 0);
end;
end;


Roy Lambert
Fri, Apr 28 2006 7:58 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Tim


I've been doing some more investigating. I added a TRichEdit control on the form and went    

    Session.GetTableNames('memory', richedit1.Lines);

After the encode operation. All I'm shown are the three memory tables that are created/freed with the form. To me that translates as I'm getting rid of them, however, when the count of creating/freeing the temporary in memory tables reaches the magic 4096 it blows up.

I can work around it for the data conversion, but I'm getting worried about if I am freeing the tables properly or what.


Roy Lambert
Fri, Apr 28 2006 4:00 PMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

Roy,

<< After the encode operation. All I'm shown are the three memory tables
that are created/freed with the form. To me that translates as I'm getting
rid of them, however, when the count of creating/freeing the temporary in
memory tables reaches the magic 4096 it blows up.

I can work around it for the data conversion, but I'm getting worried about
if I am freeing the tables properly or what. >>

Make sure that you open the temporary tables exclusively.  That will prevent
them from being thrown into the in-memory lock file and will allow you to
create more than 4096 of them.

--
Tim Young
Elevate Software
www.elevatesoft.com

Sat, Apr 29 2006 6:32 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Tim

>Make sure that you open the temporary tables exclusively. That will prevent
>them from being thrown into the in-memory lock file and will allow you to
>create more than 4096 of them.

OK, where I can I'll do that. It'll be no problem for ones created in a thread. At what point are they removed from the lock file? I would have thought deleting the table would be a good point.

Roy Lambert
Mon, May 1 2006 2:38 PMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

Roy,

<< OK, where I can I'll do that. It'll be no problem for ones created in a
thread. At what point are they removed from the lock file? I would have
thought deleting the table would be a good point. >>

It can't delete them from the lock file because it can't disturb the
ordering of the "slots" used by each table.

--
Tim Young
Elevate Software
www.elevatesoft.com

Tue, May 2 2006 3:28 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Tim


I'd forgotten you used an offset (or whatever) to get the table/lock information, should have remembered that from previous postings.

When does the exclusive flag have to be set eg

table create
table open
table close
table exclusive
table open

What would happen to locks with that sequence?

Roy Lambert
Tue, May 2 2006 1:50 PMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

Roy,

<< When does the exclusive flag have to be set eg >>

Open and create both, however a CreateTable automatically uses the Exclusive
flag so that you don't have to.

<< table create
table open
table close
table exclusive
table open

What would happen to locks with that sequence? >>

That would cause a slot to be consumed in the lock file due to the first
non-exclusive open.

--
Tim Young
Elevate Software
www.elevatesoft.com

Wed, May 3 2006 2:53 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Tim


That's about what I thought.

Next question - when are slots in the lock file released? Is it possible over several months of creating/freeing memory tables with different names to fill it up?


Roy Lambert
Wed, May 3 2006 11:55 AMPermanent Link

Tim Young [Elevate Software]

Elevate Software, Inc.

Avatar

Email timyoung@elevatesoft.com

Roy,

<< Next question - when are slots in the lock file released? >>

Never.  The only way to get rid of them is to delete the dbisam.lck file and
let DBISAM rebuild it.  With in-memory tables, this is possible only by
shutting down the process.

<< Is it possible over several months of creating/freeing memory tables with
different names to fill it up? >>

Yes, provided that you don't set Exclusive=True for the in-memory tables.

--
Tim Young
Elevate Software
www.elevatesoft.com

Thu, May 4 2006 5:36 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Tim


I can't find the answers in the pdf manual so I'm asking the guru. I'm looking through the code of an existing app to open memory tables exclusively. I also opened the dbisam.lck file in notepad to see what's in it. I can spot all of the disk tables, most of the memory tables are created exclusively but one (SandT) isn't, and I can't see it anywhere.

What is actually stored in dbisam.lck for memory tables? I presume, unlike disk tables, there would be one entry per instance of the application creating the memory table?


Roy Lambert
Page 1 of 2Next Page »
Jump to Page:  1 2
Image