Bram Kuijvenhoven escreveu:
Micha Nelissen wrote:
On Sat, 01 Apr 2006 18:33:10 -0300
Luiz Americo Pereira Camara <[EMAIL PROTECTED]> wrote:
And what about recno? Just define it as -1, or do a quick count to
get
the current record number?
Take a look at TCustomSqliteDataset implementation. In its
implementation a count is done each time.
Store the recno with/in the linked list entry ?
It has two drawbacks: increase memory usage and when inserting,
deleting all following records must be updated.
An array of records has the same problem, no ? So these are not
drawbacks
IMHO.
I think, when using an array, the RecNo is implicit from the position
in the array.
Implementing the RecordCount property is not so much a problem (using
increments/decrements on changes), but updating RecNo's can be
troublesome I think.
I can imagine it is possible to store some kind of relative RecNo's
with only a sparse subset of the record in a smart way, allowing O(log
N) times for inserting/deleting records and O(log N) time for getting
RecNo's. I do not know whether this is indeed possible, and the
implementation would not be easy I think.
Another option is to update the RecNo's only when requested, i.e.:
- each record stores a record number
- when inserting/deleting, all RecNo's from that record on are marked
as 'dirty' (this needs only storage of a LowestDirtyRecNoIndex)
- when requesting the RecNo of an item with 'dirty' stored RecNo, one
could recalculate the RecNo's of record LowestDirtyRecNoIndex until
the record whose RecNo is requested at that time
To prevent the memory overhead of storing RecNo's, it is even possible
to only allocate the RecNo storage space only when some RecNo is
retrieved for the first time. This allows people to save memory by
never using RecNo, but still use RecNo if they really need.
Of course, using Bookmarks is a very good substitute for RecNo's! And
if one wants to enumerate the records, one can still do so by keeping
a private counter while traversing the dataset with calls to Next. (In
one of my applications I even have an array of Bookmarks -- I think I
overlooked the RecNo property, which would take away the necessity of
using such an array, if I'm understanding things correctly).
This is what you get in TSqliteDataset: while RecNo is something
expensive (both to get and to set the RecNo it walks through the linked
list), BookMarks are almost inexpensive (both in memory requirements and
to set/retrive) because the bookmark is really the list item pointer
(Take a look at the implementation). Every time you choose a design
(any) you have strengths :-) and weakness :-( . It's a matter of
what you want, what's the priority.
Luiz
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel