Hi Arno,

procedure TCacheTree.Insert(
    Key           : String;
    Data          : Pointer;
    Len           : Integer;
    TimeStamp     : TDateTime = MinDT;
    Expires       : TDateTime = MinDT;
    UpdateTime    : Boolean = True;
    UpdateData    : Boolean = True);
var
    CacheNode,
    ResNode : TCacheNode;
    NewIdx,
    ResIdx : TCacheIdxNode;
    Found : Boolean;
begin
    CacheNode := TCacheNode.Create(Key, Data, Len);
    FFoundNode := nil;
    ResNode := TCacheNode(SearchAndInsert(CacheNode, Found));
    if not Found then  // Primary key not found = new cache Node added
    begin
        NewIdx := TCacheIdxNode.Create(CacheNode, TimeStamp, Expires);
        ResIdx := TCacheIdxNode(FSecIdxTree.SearchAndInsert(NewIdx, Found));
        if not Found then   // New TimeStamp inserted
            CacheNode.FIdxRef := NewIdx
        else begin          // TimeStamp exists, add a duplicate
            if not Assigned(ResIdx.FDups) then
            begin
                ResIdx.FDups := TSecIdxDuplicates.Create;
                ResIdx.FDups.InsertEnd(ResIdx);
            end;
            ResIdx.FDups.InsertEnd(NewIdx);
            CacheNode.FIdxRef := NewIdx;
        end;
        FLastInsertedNode := CacheNode;  // Fastream
    end
    else begin // Primary key found - update data and secondary index
        if UpdateData then
        begin
            // Old data needs to be freed
            TriggerFreeData(ResNode.FData, ResNode.FLen);
            // Update Data
            ResNode.FData := Data;
            ResNode.FLen  := Len;
        end;
        if UpdateTime then
        begin
            //Update TimeStamp (delete and new)
            FSecIdxTree.Remove(ResNode.FIdxRef);
            NewIdx := TCacheIdxNode.Create(ResNode, TimeStamp, Expires);
            ResIdx := TCacheIdxNode(FSecIdxTree.SearchAndInsert(NewIdx,
Found));
            if not Found then
                ResNode.FIdxRef := NewIdx
            else begin   // Time value exists, create a duplicate
                if not Assigned(ResIdx.FDups) then
                begin
                    ResIdx.FDups := TSecIdxDuplicates.Create;
                    ResIdx.FDups.InsertEnd(ResIdx);
                end;
                ResIdx.FDups.InsertEnd(NewIdx);
                ResNode.FIdxRef := NewIdx
            end;
        end;
        FLastInsertedNode := ResNode; // Fastream
        // not new
        FreeAndNil(CacheNode);
    end;
end;

I think this is better to get the last insertion node.

Best Regards,

SZ
On Tue, Dec 6, 2011 at 11:03, Arno Garrels <arno.garr...@gmx.de> wrote:

> Fastream Technologies wrote:
> >    TCacheNode = class(TAvlTreeNode)
> >    private
> >        FKey     : String;
> >        FData    : Pointer;
> >        FLen     : Integer;
> >        FIdxRef  : TCacheIdxNode;
> >    public
> >        constructor Create(Key: String; Data: Pointer; Len: Integer);
> >        destructor  Destroy; override;
> >        property    Key: String read FKey;
> >        property    Data: Pointer read FData write FData; // could you
> > add this "write FData"?? Fastream
> >        property    Len: Integer read FLen;
> >        property    IdxRef: TCacheIdxNode read FIdxRef;
> >    end;
>
> Done.
>
> --
> Arno Garrels
> --
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
>
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to