151 lines
4.5 KiB
C++
151 lines
4.5 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
||
|
//
|
||
|
// File: FRETEST.CXX
|
||
|
//
|
||
|
// Contents: Fresh test object
|
||
|
//
|
||
|
// Classes: CFreshTest
|
||
|
//
|
||
|
// History: 01-Oct-91 BartoszM Created.
|
||
|
// 17-Oct-91 BartoszM Reimplemented using hash table
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.cxx>
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "fretest.hxx"
|
||
|
#include "fresh.hxx"
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CFreshTest::CFreshTest, public
|
||
|
//
|
||
|
// Arguments: [size] -- initial # of entries
|
||
|
//
|
||
|
// History: 08-Oct-91 BartoszM Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
CFreshTest::CFreshTest ( unsigned size )
|
||
|
: _refCount(0),
|
||
|
_freshTable(size),
|
||
|
_cDeletes( 0 )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CFreshTest::CFreshTest, public
|
||
|
//
|
||
|
// Synopsis: Pseudo copy constructor
|
||
|
// Substitutes old index id's with new iid
|
||
|
//
|
||
|
// Arguments: [freshTest] -- fresh test
|
||
|
// [subst] -- index subst object
|
||
|
//
|
||
|
// History: 15-Oct-91 BartoszM Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
CFreshTest::CFreshTest ( CFreshTest& freshTest, CIdxSubstitution& subst)
|
||
|
: _refCount(0),
|
||
|
_freshTable ( freshTest._freshTable, subst ),
|
||
|
_cDeletes( freshTest._cDeletes )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CFreshTest::CFreshTest
|
||
|
//
|
||
|
// Synopsis: Copy ~ctor
|
||
|
//
|
||
|
// History: 7-19-94 srikants Created
|
||
|
//
|
||
|
// Notes: Having a default copy constructor is dangerous for a
|
||
|
// unwindable object because it does not get delinked from
|
||
|
// the exception stack in the absence of an END_CONSTRUCTION
|
||
|
// macro at the end of the constructor.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
CFreshTest::CFreshTest( CFreshTest& freshTest )
|
||
|
: _refCount(0),
|
||
|
_freshTable(freshTest._freshTable),
|
||
|
_cDeletes( freshTest._cDeletes )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CFreshTest::IsCorrectIndex
|
||
|
//
|
||
|
// Synopsis: Checks if the index <-> wid pid association is fresh.
|
||
|
// If entry not found, (wid, pidAll) is tried.
|
||
|
//
|
||
|
// Arguments: [iid] -- index id
|
||
|
// [wid] -- work id
|
||
|
//
|
||
|
// Returns: Shadow if (wid) most recent index is iid
|
||
|
// or Master if (wid) not found (meaning: master index)
|
||
|
// Invalid if (wid) has a more recent iid
|
||
|
// or the the property has been deleted.
|
||
|
//
|
||
|
// History: 16-May-91 BartoszM Created.
|
||
|
//
|
||
|
// Notes: When the document is deleted, the entry
|
||
|
// will contain iidDeleted, wich does not
|
||
|
// match any valid index id.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
CFreshTest::IndexSource CFreshTest::IsCorrectIndex ( INDEXID iid,
|
||
|
WORKID wid )
|
||
|
{
|
||
|
ciDebugOut (( DEB_FRESH, " -- testing iid %lx <-> wid %ld\n", iid, wid));
|
||
|
|
||
|
CFreshItem* pEntry = _freshTable.Find ( wid );
|
||
|
|
||
|
if ( pEntry == 0 )
|
||
|
{
|
||
|
#if CIDBG == 1
|
||
|
CIndexId indexId(iid);
|
||
|
Win4Assert( indexId.IsPersistent() );
|
||
|
ciDebugOut (( DEB_FRESH, "fresh entry not found\n" ));
|
||
|
#endif // CIDBG == 1
|
||
|
|
||
|
// not found -> must be master index
|
||
|
return CFreshTest::Master;
|
||
|
}
|
||
|
|
||
|
ciDebugOut (( DEB_FRESH, " -- FreshTest found entry\n" ));
|
||
|
INDEXID iidFresh = pEntry->IndexId();
|
||
|
|
||
|
if ( iidFresh == iid )
|
||
|
return CFreshTest::Shadow;
|
||
|
|
||
|
#if CIDBG == 1
|
||
|
//
|
||
|
// If we hit this assert, put this code back in
|
||
|
//
|
||
|
if ( iidFresh == iidInvalid )
|
||
|
{
|
||
|
Win4Assert( !"Unexpected behavior in FreshTest. email searchdv" );
|
||
|
ciDebugOut (( DEB_WARN,
|
||
|
"FreshTest::found invalid index id\n" ));
|
||
|
PatchEntry ( pEntry, iid );
|
||
|
return CFreshTest::Unknown;
|
||
|
}
|
||
|
#endif // CIDBG == 1
|
||
|
|
||
|
ciDebugOut (( DEB_FRESH, " -- FreshTest different iid %lx\n", iidFresh ));
|
||
|
|
||
|
return CFreshTest::Invalid;
|
||
|
} //IsCorrectIndex
|
||
|
|