windows-nt/Source/XPSP1/NT/inetsrv/query/cindex/fretable.cxx
2020-09-26 16:20:57 +08:00

193 lines
4.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: FRETABLE.CXX
//
// Contents: Fresh table
//
// Classes: CFreshTable
//
// History: 15-Oct-91 BartoszM created
// 5-Dec-97 dlee rewrote as simple sorted array
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <fretable.hxx>
//+-------------------------------------------------------------------------
//
// Method: CFreshTable::Add, public
//
// Synopsis: Adds an entry to the table
//
// Arguments: [wid] -- work id
// [iid] -- index id
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
void CFreshTable::Add( WORKID wid, INDEXID iid )
{
//
// The most typical case is that items arrive sorted. Use Get() instead
// of operator [] since Add isn't const.
//
ULONG cItems = _aItems.Count();
ULONG index;
if ( 0 == cItems )
index = 0;
else if ( wid > _aItems.Get( cItems - 1 )._wid )
index = cItems;
else
{
CSortable<CFreshItem,WORKID> sort( _aItems );
// duplicates are not expected here
Win4Assert( !sort.Search( wid ) );
index = sort.FindInsertionPoint( wid );
ciDebugOut(( DEB_ITRACE, "insert, count %d index %d\n",
cItems, index ));
}
CFreshItem itemTmp;
itemTmp._wid = wid;
itemTmp._iid = iid;
_aItems.Insert( itemTmp, index );
} //Add
//+-------------------------------------------------------------------------
//
// Method: CFreshTable::AddReplace, public
//
// Synopsis: Either updates the iid of an existing item, or adds the item
//
// Arguments: [wid] -- work id
// [iid] -- index id
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
INDEXID CFreshTable::AddReplace( WORKID wid, INDEXID iid )
{
CFreshItem * p = Find( wid );
INDEXID iidOld;
if ( 0 == p )
{
iidOld = iidInvalid;
Add( wid, iid );
}
else
{
iidOld = p->_iid;
p->_iid = iid;
}
return iidOld;
} //AddReplace
//+-------------------------------------------------------------------------
//
// Method: CFreshTable::CFreshTable, public
//
// Synopsis: Constructs a fresh table
//
// Arguments: [freshTable] -- Table from which a copy is made
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
CFreshTable::CFreshTable(
CFreshTable & freshTable ) :
_aItems( freshTable._aItems,
freshTable._aItems.Count() + CI_MAX_DOCS_IN_WORDLIST )
{
//
// the CI_MAX_DOCS_IN_WORDLIST above is a hint that up to 16 items may
// be added to the test, so that much space should be reserved now.
//
} //CFreshTable
//+-------------------------------------------------------------------------
//
// Method: CFreshTable::CFreshTable, public
//
// Synopsis: Constructs a fresh table
//
// Arguments: [freshTable] -- Table from which a copy is made
// [subst] -- Index substitution object for new table
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
CFreshTable::CFreshTable(
CFreshTable const & freshTable,
CIdxSubstitution const & subst) :
_aItems( freshTable._aItems.Count() )
{
for ( unsigned i = 0; i < freshTable._aItems.Count(); i++ )
{
CFreshItem const & item = freshTable._aItems[i];
if (subst.IsMaster())
{
// skip old deleted and old indexes
if ( item._iid != subst.IidOldDeleted() &&
!subst.Find( item._iid) )
Add( item._wid, item._iid );
}
else
{
// replace source indexes with the new index id
INDEXID iid = item._iid;
if ( subst.Find( iid ) )
iid = subst.IidNew();
Add( item._wid, iid );
}
}
} //CFreshTable
//+-------------------------------------------------------------------------
//
// Method: CFreshTable::ModificationsComplete, public
//
// Synopsis: Called when updates to the table have completed, so memory
// usage can be trimmed if possible.
//
// History: 5-Dec-97 dlee created
//
//--------------------------------------------------------------------------
void CFreshTable::ModificationsComplete()
{
// Make sure we're really sorted
CSortable<CFreshItem,WORKID> sort( _aItems );
Win4Assert( sort.IsSorted() );
// save memory if the size is much larger than the count
if ( _aItems.Size() > ( _aItems.Count() + 100 ) )
_aItems.Shrink();
} //ModificationsComplete