1146 lines
35 KiB
C++
1146 lines
35 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
|
//
|
|
// File: VQuery.Cxx
|
|
//
|
|
// Contents: Query interface functions
|
|
//
|
|
// Functions: ProxyErrorToCIError
|
|
// EvalQuery
|
|
// EvalMetadataQuery
|
|
// ForceMasterMerge
|
|
// AbortMerges
|
|
// CiState
|
|
// AddScopeToCI
|
|
// RemoveScopeFromCI
|
|
// BeginCacheTransaction
|
|
// SetupCacheEx
|
|
// SetupCache
|
|
// EndCacheTransaction
|
|
// DumpWorkId
|
|
// SetCatalogState
|
|
//
|
|
// History: 18-Aug-91 KyleP Created.
|
|
// 16-Sep-96 dlee made it work with cisvc
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "svcquery.hxx"
|
|
|
|
#include <isearch.hxx>
|
|
#include <svccatpx.hxx>
|
|
#include <cidbprop.hxx>
|
|
#include <dbprputl.hxx>
|
|
#include <fsciclnt.h>
|
|
#include <ciframe.hxx>
|
|
#include <fsci.hxx>
|
|
#include <cifwexp.hxx>
|
|
#include <ciregkey.hxx>
|
|
#include <fsciexps.hxx>
|
|
|
|
|
|
|
|
typedef SCODE (* T_FsCiShutdown)(void);
|
|
|
|
static GUID clsidStorageDocStoreLocator = CLSID_StorageDocStoreLocator;
|
|
static XLibHandle gxCiFrmWrk;
|
|
static T_MakeGenericQueryForDocStore gprocMakeGenericQuery = 0;
|
|
|
|
extern CStaticMutexSem g_mtxCommandCreator;
|
|
|
|
|
|
void SetIDbProperties( IDBProperties * pIDbProp,
|
|
WCHAR const * pwcCatalog,
|
|
WCHAR const * pwcMachine,
|
|
GUID & clientGuid,
|
|
WCHAR const * pwcScope = 0,
|
|
CiMetaData eType = CiAdminOp);
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ProxyErrorToCIError, public
|
|
//
|
|
// Synopsis: Attempt to translate an error code from the proxy into
|
|
// a CI error code.
|
|
//
|
|
// Arguments: [sc] -- source error
|
|
//
|
|
// Returns: The translated or original error
|
|
//
|
|
// History: 06-Jan-98 dlee Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE ProxyErrorToCIError( CException & e )
|
|
{
|
|
SCODE sc = GetScodeError( e );
|
|
|
|
if ( HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ) == sc )
|
|
sc = CI_E_NOT_RUNNING;
|
|
else if ( STATUS_NOT_FOUND == sc )
|
|
sc = CI_E_NOT_FOUND;
|
|
else if ( sc == HRESULT_FROM_WIN32( ERROR_SEM_TIMEOUT ) ||
|
|
sc == HRESULT_FROM_WIN32( ERROR_PIPE_BUSY ) )
|
|
sc = CI_E_TIMEOUT;
|
|
|
|
return sc;
|
|
} //ProxyErrorToCIError
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CreateDbProperties
|
|
//
|
|
// Synopsis: Helper function to create an IDBProperties and set the
|
|
// given parameters as DBPROPS in the IDBProperties.
|
|
//
|
|
// Arguments: [pwcCatalog] - Name or location of the catalog.
|
|
// [pwcMachine] - Name of the machine to connect to.
|
|
// [pwcScopes ] - (first scope) directory.
|
|
// [eType] - query type
|
|
//
|
|
// Returns: Pointer to an initilized IDBProperties interface.
|
|
//
|
|
// History: 1-15-97 srikants Created
|
|
// 5-14-97 mohamedn use SetIDbProperties
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
IDBProperties * CreateDbProperties( WCHAR const * pwcCatalog,
|
|
WCHAR const * pwcMachine,
|
|
WCHAR const * pwcScopes = 0,
|
|
CiMetaData eType = CiAdminOp )
|
|
{
|
|
XInterface<IDBProperties> xdbp( new CDbProperties );
|
|
if ( xdbp.IsNull() )
|
|
THROW( CException( E_OUTOFMEMORY ) );
|
|
|
|
SetIDbProperties( xdbp.GetPointer(),
|
|
pwcCatalog,
|
|
pwcMachine,
|
|
clsidStorageDocStoreLocator,
|
|
pwcScopes,
|
|
eType );
|
|
|
|
return xdbp.Acquire();
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: LoadCiFrmWrkLibrary, private
|
|
//
|
|
// Synopsis: Loads the appropriate framework library
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Returns: Handle to library
|
|
//
|
|
// History: 22-Apr-97 KrishnaN Created
|
|
// 02-Jun-97 KrishnaN Decide between olympus/ci version
|
|
// based on registry entry.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline HINSTANCE LoadCiFrmWrkLibrary()
|
|
{
|
|
HINSTANCE hLib;
|
|
WCHAR awszLibName[MAX_PATH];
|
|
|
|
//
|
|
// We want to be able to load the right version of the framework dll.
|
|
// The olympus and ci versions are for the most part similar, but not
|
|
// identical. So when Olympus is installed, we should lookup in the
|
|
// registry to find out what dll to use. If that registry entry is
|
|
// not found, we default to query.dll.
|
|
//
|
|
|
|
wcscpy(awszLibName, L"QUERY.DLL");
|
|
|
|
HKEY hKey;
|
|
|
|
long sc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Root
|
|
wcsRegCommonAdminSubKey, // key
|
|
0, // Reserved
|
|
KEY_READ, // Access
|
|
&hKey); // Handle
|
|
|
|
// For a smoother transition, if we don't find it in the
|
|
// newly defined commonadminsubkey, look for it in the old place
|
|
if (ERROR_SUCCESS != sc)
|
|
sc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Root
|
|
L"Software\\Microsoft\\Site Server\\3.0\\Search\\CiFramework",
|
|
0, // Reserved
|
|
KEY_READ, // Access
|
|
&hKey); // Handle
|
|
|
|
if (ERROR_SUCCESS == sc)
|
|
{
|
|
DWORD dwType = REG_SZ;
|
|
DWORD dwSize = MAX_PATH * sizeof(WCHAR);
|
|
// If we successfully read the value, the full path name will be read in
|
|
sc = RegQueryValueEx(hKey,
|
|
L"CiFrmWrkDll",
|
|
0,
|
|
&dwType,
|
|
(LPBYTE)awszLibName,
|
|
&dwSize
|
|
);
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
hLib = LoadLibraryW(awszLibName);
|
|
|
|
if ( 0 == hLib )
|
|
{
|
|
ciDebugOut(( DEB_ERROR, "Error %d occurred in LoadLibrary on %ws\n",
|
|
GetLastError(), awszLibName ));
|
|
THROW(CException( E_UNEXPECTED ));
|
|
}
|
|
|
|
gprocMakeGenericQuery = (T_MakeGenericQueryForDocStore)
|
|
GetProcAddress( hLib, "MakeGenericQueryForDocStore" );
|
|
if (0 == gprocMakeGenericQuery)
|
|
{
|
|
ciDebugOut((DEB_ERROR, "Failed to locate MakeGenericQueryForDocStore"
|
|
" in the framework dll\n"));
|
|
THROW(CException( E_UNEXPECTED ));
|
|
}
|
|
|
|
return hLib;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: EvalQuery, public
|
|
//
|
|
// Synopsis: Simulates bind to to ci object store
|
|
//
|
|
// Arguments: [ppQuery] -- returns the PIInternalQuery
|
|
// [idbProps] -- object exposing IDBProperties
|
|
// [pDocStore] -- doc store interface pointer
|
|
//
|
|
// Returns: SCODE result
|
|
//
|
|
// History: 12 Dec 95 AlanW Created
|
|
// 08-Feb-96 KyleP Add virtual path support
|
|
// 01-Nov-96 dlee Add multi-scope support, return scode
|
|
// 14-May-97 mohamedn hidden fs/core property set details.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE EvalQuery(
|
|
PIInternalQuery ** ppQuery,
|
|
CDbProperties & idbProps,
|
|
ICiCDocStore * pDocStore)
|
|
{
|
|
SCODE sc = S_OK;
|
|
PIInternalQuery * pQuery = 0;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
if ( pDocStore )
|
|
{
|
|
//
|
|
// If the framework library is not loaded, load it and get the
|
|
// generic query
|
|
//
|
|
|
|
if ( 0 == gxCiFrmWrk.Get() )
|
|
{
|
|
//
|
|
// we don't want to go through this crit sect for each
|
|
// invocation of EvalQuery. So first check for the handle
|
|
// to be null, and then take a lock.
|
|
// Multiple threads running simultaeneously could get past
|
|
// the check for null handle, but only the first one that gets
|
|
// the lock will have the chance to set the gxCiFrmWrk variable.
|
|
// The remaining will find that the second check for null
|
|
// handle doesn't hold and will do nothing.
|
|
//
|
|
|
|
CLock lock(g_mtxCommandCreator);
|
|
if (0 == gxCiFrmWrk.Get())
|
|
{
|
|
Win4Assert( 0 == gprocMakeGenericQuery);
|
|
gxCiFrmWrk.Set(LoadCiFrmWrkLibrary());
|
|
}
|
|
}
|
|
|
|
sc = gprocMakeGenericQuery( &idbProps, pDocStore, &pQuery);
|
|
}
|
|
else
|
|
{
|
|
CGetDbProps dbProp;
|
|
|
|
dbProp.GetProperties( &idbProps , CGetDbProps::eMachine );
|
|
|
|
WCHAR const *pwcMachine = dbProp.GetMachine();
|
|
|
|
if ( 0 != pwcMachine )
|
|
{
|
|
pQuery = new CSvcQuery( pwcMachine,
|
|
&idbProps );
|
|
}
|
|
else
|
|
{
|
|
THROW( CException(E_INVALIDARG) );
|
|
}
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
vqDebugOut(( DEB_ERROR,
|
|
"Catastrophic error 0x%x in EvalQuery\n",
|
|
e.GetErrorCode() ));
|
|
pQuery = 0;
|
|
|
|
//
|
|
// NOTE: Fix for bug 86178. This is a lower level routine and it should
|
|
// propogate errors untranslated to the upper layer (ICommand::Execute).
|
|
//
|
|
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH;
|
|
|
|
*ppQuery = pQuery;
|
|
return sc;
|
|
} //EvalQuery
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: EvalMetadataQuery, public
|
|
//
|
|
// Synopsis: Simulates bind to PIInternalQuery for ci object store
|
|
//
|
|
// Arguments: [ppQuery] - returns the PIInternalQuery
|
|
// [eType] - Type of metadata
|
|
// [wcsCat] - Catalog location
|
|
// [pwcsMachine] - Machine on which catalog resides
|
|
//
|
|
// Returns: SCODE result
|
|
//
|
|
// History: 12 Dec 95 AlanW Created
|
|
// 08-Feb-96 KyleP Add virtual path support
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE EvalMetadataQuery(
|
|
PIInternalQuery ** ppQuery,
|
|
CiMetaData eType,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
*ppQuery = 0;
|
|
PIInternalQuery * pQuery = 0;
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( wcsCat,
|
|
wcsMachine,
|
|
0,
|
|
eType ) );
|
|
Win4Assert( 0 != wcsMachine );
|
|
pQuery = new CSvcQuery( wcsMachine, xDbProps.GetPointer() );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
vqDebugOut(( DEB_ERROR,
|
|
"Catastrophic error 0x%x in EvalMetadataQuery\n",
|
|
e.GetErrorCode() ));
|
|
pQuery = 0;
|
|
|
|
//
|
|
// NOTE: Fix for bug 86178. This is a lower level routine and it should
|
|
// propogate errors untranslated to the upper layer (ICommand::Execute).
|
|
//
|
|
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH;
|
|
|
|
*ppQuery = pQuery;
|
|
return sc;
|
|
} //EvalMetadataQuery
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ForceMasterMerge, public
|
|
//
|
|
// Synopsis: Forces a master merge on the partition ID specified
|
|
//
|
|
// Arguments: [wcsDrive] - Drive to force merge on
|
|
// [pwcsCat] - Catalog name
|
|
// [pwcsMachine] - Machine on which catalog resides
|
|
// [partId] - PartitionID to force merge on
|
|
//
|
|
// History: 01-Nov-95 DwightKr Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE ForceMasterMerge(
|
|
WCHAR const * wcsDrive,
|
|
WCHAR const * pwcsCat,
|
|
WCHAR const * pwcsMachine,
|
|
ULONG partId )
|
|
{
|
|
SCODE status = S_OK;
|
|
|
|
//
|
|
// Verify that we have legal parameters
|
|
//
|
|
|
|
if ( (0==wcsDrive) || (1!=partId) )
|
|
return E_INVALIDARG;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( pwcsCat,
|
|
pwcsMachine,
|
|
wcsDrive ) );
|
|
|
|
Win4Assert( 0 != pwcsMachine );
|
|
CSvcCatProxy cat( pwcsMachine, xDbProps.GetPointer() );
|
|
cat.ForceMerge( partId );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return status;
|
|
} //ForceMasterMerge
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: AbortMerges, public
|
|
//
|
|
// Synopsis: Aborts any merge in progress in the specified partid.
|
|
//
|
|
// Arguments: [wcsDrive] -- Drive to force merge on
|
|
// [partId] -- PartitionID to force merge on
|
|
//
|
|
// History: 01-Nov-95 DwightKr Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE AbortMerges(
|
|
WCHAR const * wcsDrive,
|
|
WCHAR const * pwcsCat,
|
|
WCHAR const * pwcsMachine,
|
|
ULONG partId )
|
|
{
|
|
SCODE status = S_OK;
|
|
|
|
//
|
|
// Verify that we have legal parameters
|
|
//
|
|
|
|
if ( (0==wcsDrive) || (1!=partId) )
|
|
return E_INVALIDARG;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( pwcsCat,
|
|
pwcsMachine,
|
|
wcsDrive ) );
|
|
Win4Assert( 0 != pwcsMachine );
|
|
CSvcCatProxy cat( pwcsMachine, xDbProps.GetPointer() );
|
|
cat.AbortMerge( partId );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return status;
|
|
} //AbortMerges
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: CIState, public
|
|
//
|
|
// Synopsis: Returns the state of the CI for the drive specified.
|
|
//
|
|
// Arguments: [pwcsCat] -- Catalog
|
|
// [pwcsMachine] -- Machine name
|
|
// [pCiState] -- Current state of the CI
|
|
//
|
|
// History: 01-Nov-95 DwightKr Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE CIState( WCHAR const * pwcsCat,
|
|
WCHAR const * pwcsMachine,
|
|
CI_STATE * pCiState )
|
|
{
|
|
// Verify that we have legal parameters
|
|
|
|
if ( 0 == pCiState ||
|
|
0 == pwcsCat ||
|
|
pCiState->cbStruct < sizeof pCiState->cbStruct )
|
|
return E_INVALIDARG;
|
|
|
|
if ( 0 == pwcsMachine )
|
|
pwcsMachine = L".";
|
|
|
|
SCODE status = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( pwcsCat, pwcsMachine ) );
|
|
|
|
CSvcCatProxy cat( pwcsMachine, xDbProps.GetPointer() );
|
|
cat.CiState( *pCiState );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return status;
|
|
} //CiState
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: UpdateContentIndex, public
|
|
//
|
|
// Synopsis: Registers documents for indexing.
|
|
//
|
|
// Arguments: [wcsRoot] -- Root of scope to scan for updates
|
|
// [wcsCat] -- Override for catalog location
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 23-Jun-93 KyleP Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
ULONG UpdateContentIndex(
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine,
|
|
BOOL fFull )
|
|
{
|
|
SCODE status = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
IDBProperties * pDbProps = CreateDbProperties( wcsCat, wcsMachine );
|
|
XInterface<IDBProperties> xProps( pDbProps );
|
|
|
|
CSvcCatProxy cat( wcsMachine, pDbProps );
|
|
cat.UpdateDocuments( wcsRoot, fFull ? UPD_FULL : UPD_INCREM );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return (ULONG) status;
|
|
} //UpdateContentIndex
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: AddScopeToCI
|
|
//
|
|
// Synopsis: Adds a scope for down level ContentIndex. All documents in
|
|
// the specified scope will be indexed.
|
|
//
|
|
// Arguments: [wcsRoot] - Scope to add
|
|
// [wcsCat] - Alternate location for catalog
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// Returns: Status code
|
|
//
|
|
// History: 1-21-96 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE AddScopeToCI (
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
IDBProperties * pDbProps = CreateDbProperties( wcsCat, wcsMachine );
|
|
XInterface<IDBProperties> xProps( pDbProps );
|
|
|
|
CSvcCatProxy cat( wcsMachine, pDbProps );
|
|
cat.AddScopeToCI( wcsRoot );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = GetOleError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return sc;
|
|
} //AddScopeToCI
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: RemoveScopeFromCI
|
|
//
|
|
// Synopsis: Removes a scope for down level ContentIndex. All documents in
|
|
// the specified scope will be deleted.
|
|
//
|
|
// Arguments: [wcsRoot] - Scope to remove
|
|
// [wcsCat] - Alternate location for catalog
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// Returns: Status code
|
|
//
|
|
// History: 1-21-96 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE RemoveScopeFromCI(
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
IDBProperties * pDbProps = CreateDbProperties( wcsCat, wcsMachine );
|
|
XInterface<IDBProperties> xProps( pDbProps );
|
|
|
|
CSvcCatProxy cat( wcsMachine, pDbProps );
|
|
cat.RemoveScopeFromCI( wcsRoot );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = GetOleError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return sc;
|
|
} //RemoveScopeFromCI
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: BeginCacheTransaction, public
|
|
//
|
|
// Synopsis: Begin a cache update session.
|
|
//
|
|
// Arguments: [pulToken] - Token representing transaction returned here.
|
|
// [wcsRoot] - Root of scope to scan for updates
|
|
// [wcsCat] - Override for catalog location
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// History: 20-Jun-96 KyleP Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE BeginCacheTransaction(
|
|
ULONG_PTR * pulToken,
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( wcsCat,
|
|
wcsMachine ) );
|
|
|
|
CSvcCatProxy cat( wcsMachine, xDbProps.GetPointer() );
|
|
*pulToken = 0; // Catch access violation
|
|
*pulToken = cat.BeginCacheTransaction();
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return sc;
|
|
} //BeginCacheTransaction
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetupCacheEx, public
|
|
//
|
|
// Synopsis: Modify cache to store (or not store) property.
|
|
//
|
|
// Arguments: [ps] - Property to cache.
|
|
// [vt] - Datatype of property. VT_VARIANT if unknown.
|
|
// [cbMaxLen] - Soft-maximum length for variable length
|
|
// properties. This much space is pre-allocated
|
|
// in original record. A length of 0 will remove
|
|
// property from cache.
|
|
// [ulToken] - Token indentifying open transaction
|
|
// [fModifiable]- Is meta info modifiable?
|
|
// [dwLevel] - Primary or secondary store?
|
|
// [wcsRoot] - Root of scope to scan for updates
|
|
// [wcsCat] - Override for catalog location
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// History: 18-Nov-97 KrishnaN Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE SetupCacheEx(
|
|
FULLPROPSPEC const * ps,
|
|
ULONG vt,
|
|
ULONG cbMaxLen,
|
|
ULONG_PTR ulToken,
|
|
BOOL fModifiable,
|
|
DWORD dwStoreLevel,
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
Win4Assert(PRIMARY_STORE == dwStoreLevel ||
|
|
SECONDARY_STORE == dwStoreLevel);
|
|
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( wcsCat,
|
|
wcsMachine ) );
|
|
CSvcCatProxy cat( wcsMachine, xDbProps.GetPointer() );
|
|
cat.SetupCache( *(CFullPropSpec const *)(ULONG_PTR)ps,
|
|
vt,
|
|
cbMaxLen,
|
|
ulToken,
|
|
fModifiable,
|
|
dwStoreLevel );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return sc;
|
|
} //SetupCacheEx
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetupCache, public
|
|
//
|
|
// Synopsis: Modify cache to store (or not store) property.
|
|
//
|
|
// Arguments: [ps] - Property to cache.
|
|
// [vt] - Datatype of property. VT_VARIANT if unknown.
|
|
// [cbMaxLen] - Soft-maximum length for variable length
|
|
// properties. This much space is pre-allocated
|
|
// in original record. A length of 0 will remove
|
|
// property from cache.
|
|
// [ulToken] - Token indentifying open transaction
|
|
// [wcsRoot] - Root of scope to scan for updates
|
|
// [wcsCat] - Override for catalog location
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// History: 20-Jun-96 KyleP Created.
|
|
// 18-Nov-97 KrishnaN Used SetupCacheEx.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE SetupCache(
|
|
FULLPROPSPEC const * ps,
|
|
ULONG vt,
|
|
ULONG cbMaxLen,
|
|
ULONG_PTR ulToken,
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
// Default fModifiable = TRUE and storeLevel = PRIMARY
|
|
return SetupCacheEx(ps, vt, cbMaxLen, ulToken, TRUE,
|
|
PRIMARY_STORE, wcsRoot, wcsCat, wcsMachine);
|
|
} //SetupCache
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: EndCacheTransaction, public
|
|
//
|
|
// Synopsis: Ends a cache update session.
|
|
//
|
|
// Arguments: [ulToken] - Token representing transaction.
|
|
// [fCommit] - TRUE if transaction should be commited.
|
|
// [wcsRoot] - Root of scope to scan for updates
|
|
// [wcsCat] - Override for catalog location
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// History: 20-Jun-96 KyleP Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE EndCacheTransaction(
|
|
ULONG_PTR ulToken,
|
|
BOOL fCommit,
|
|
WCHAR const * wcsRoot,
|
|
WCHAR const * wcsCat,
|
|
WCHAR const * wcsMachine )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( wcsCat,
|
|
wcsMachine ) );
|
|
CSvcCatProxy cat( wcsMachine, xDbProps.GetPointer() );
|
|
cat.EndCacheTransaction( ulToken, fCommit );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return sc;
|
|
} //EndCacheTransaction
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: DumpWorkId, public
|
|
//
|
|
// Synopsis: Dump all data for a particular workid
|
|
//
|
|
// Arguments: [wcsDrive] - Drive to query
|
|
// [wid] - Wid to search for
|
|
// [pb] - Buffer provided for writing results
|
|
// [cb] - Size of [pb]
|
|
// [pwcsCat] - Override for catalog location
|
|
// [wcsMachine] - Machine on which catalog resides, L"." for
|
|
// the local machine
|
|
//
|
|
// History: 03-Apr-95 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE DumpWorkId(
|
|
WCHAR const * wcsDrive,
|
|
ULONG wid,
|
|
BYTE * pb,
|
|
ULONG & cb,
|
|
WCHAR const * pwcsCat,
|
|
WCHAR const * pwcsMachine,
|
|
ULONG iid )
|
|
{
|
|
|
|
#if 0
|
|
|
|
#if CIDBG == 1
|
|
SCODE status = S_OK;
|
|
|
|
BYTE * pbStart = pb;
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
PCatalog * pCat = GetOne( wcsDrive, pwcsCat );
|
|
|
|
if ( 0 != pCat )
|
|
{
|
|
ULONG UNALIGNED * pul = (ULONG *)pb;
|
|
pul += 2;
|
|
*pul = 0; // Initial bookmark of zero
|
|
|
|
unsigned const cbBuffer = 1024 * 32;
|
|
|
|
while ( cb >= cbBuffer )
|
|
{
|
|
pCat->DumpWorkId( wid, iid, pb, cbBuffer );
|
|
|
|
//
|
|
// Find end of buffer.
|
|
//
|
|
|
|
for ( char * psz = (char *)pb; *psz; psz++ )
|
|
continue;
|
|
|
|
//
|
|
// Check for null ulong
|
|
//
|
|
|
|
psz++;
|
|
pul = (ULONG UNALIGNED *)psz;
|
|
if ( *pul == 0 )
|
|
{
|
|
pb = (BYTE *)psz;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
psz--;
|
|
unsigned const cbBookmark = sizeof(ULONG) + sizeof(WORKID) + sizeof(CKeyBuf);
|
|
memmove( psz, psz+1, cbBookmark );
|
|
|
|
cb -= (BYTE *)psz - pb;;
|
|
pb = (BYTE *)psz;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
status = STATUS_NOT_FOUND;
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
cb = pb - pbStart;
|
|
|
|
return( status );
|
|
#else // CIDBG == 1
|
|
return( STATUS_NOT_IMPLEMENTED );
|
|
#endif // CIDBG == 1
|
|
|
|
#endif // 0
|
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
|
|
|
} //DumpWorkId
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIShutdown
|
|
//
|
|
// Synopsis: Calls through to FsCiShutdown
|
|
//
|
|
// History: 3-06-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CIShutdown()
|
|
{
|
|
FsCiShutdown();
|
|
} //CIShutdown
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: SetIDbProperties
|
|
//
|
|
// Synopsis: Sets scope properties on IDBProperties
|
|
//
|
|
// Arguments: [pIDbProp] -- IDBProperties interface to set scope props on.
|
|
// [pwcCatalog] -- catalog name
|
|
// [pwcMachine] -- machine name
|
|
// [clientGuid] -- client guid
|
|
// [pwcScope] -- scope path
|
|
// [eType] -- query type
|
|
//
|
|
// History: 14-May-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void SetIDbProperties( IDBProperties * pIDbProp,
|
|
WCHAR const * pwcCatalog,
|
|
WCHAR const * pwcMachine,
|
|
CLSID & clientGuid,
|
|
WCHAR const * pwcScope,
|
|
CiMetaData eType )
|
|
{
|
|
const unsigned cElements = 1;
|
|
|
|
XBStr pxMachines[cElements];
|
|
XBStr pxCatalogs[cElements];
|
|
XBStr pxScopes [cElements];
|
|
DWORD aDepths [cElements];
|
|
|
|
//
|
|
// set machine name in a BSTR
|
|
//
|
|
|
|
if ( 0 != pwcMachine )
|
|
pxMachines[0].SetText( (WCHAR *)pwcMachine);
|
|
else
|
|
pxMachines[0].SetText(L".");
|
|
|
|
//
|
|
// set catalog name in a BSTR
|
|
//
|
|
if ( pwcCatalog )
|
|
{
|
|
pxCatalogs[0].SetText( (WCHAR *)pwcCatalog);
|
|
}
|
|
else
|
|
{
|
|
Win4Assert( !"No-Catalog set. Fatal Error" );
|
|
THROW ( CException(E_INVALIDARG) );
|
|
}
|
|
|
|
//
|
|
// set scope name in a BSTR
|
|
//
|
|
if ( pwcScope )
|
|
pxScopes[0].SetText( (WCHAR *)pwcScope );
|
|
else
|
|
pxScopes[0].SetText( L"\\" );
|
|
|
|
//
|
|
// set client guid
|
|
//
|
|
WCHAR awcClientGuid[ 40 ]; // 39 is all we need
|
|
|
|
int cb = StringFromGUID2( clientGuid,
|
|
awcClientGuid,
|
|
sizeof awcClientGuid / sizeof WCHAR );
|
|
Win4Assert( 0 != cb );
|
|
|
|
XBStr xbstrClientGuid;
|
|
xbstrClientGuid.SetText( awcClientGuid );
|
|
|
|
//
|
|
// set query type and defualt Depth
|
|
//
|
|
|
|
aDepths[0] = QUERY_DEEP;
|
|
|
|
//
|
|
// assemble safe arrays of the properties to set
|
|
//
|
|
SAFEARRAY saScope = { 1, // Dimension
|
|
FADF_AUTO | FADF_BSTR, // Flags: on stack, contains BSTRs
|
|
sizeof(BSTR), // Size of an element
|
|
1, // Lock count. 1 for safety.
|
|
(void *)pxScopes, // The data
|
|
{ cElements, 0 } }; // Bounds (element count, low bound)
|
|
|
|
SAFEARRAY saDepth = { 1, // Dimension
|
|
FADF_AUTO, // Flags: on stack
|
|
sizeof(LONG), // Size of an element
|
|
1, // Lock count. 1 for safety.
|
|
(void *)aDepths, // The data
|
|
{ cElements, 0 } }; // Bounds (element count, low bound)
|
|
|
|
SAFEARRAY saCatalog = { 1, // Dimension
|
|
FADF_AUTO | FADF_BSTR,// Flags: on stack, contains BSTRs
|
|
sizeof(BSTR), // Size of an element
|
|
1, // Lock count. 1 for safety.
|
|
(void *)pxCatalogs, // The data
|
|
{ cElements, 0 } }; // Bounds (element count, low bound)
|
|
|
|
SAFEARRAY saMachine = { 1, // Dimension
|
|
FADF_AUTO | FADF_BSTR,// Flags: on stack, contains BSTRs
|
|
sizeof(BSTR), // Size of an element
|
|
1, // Lock count. 1 for safety.
|
|
(void *)pxMachines, // The data
|
|
{ cElements, 0 } }; // Bounds (element count, low bound)
|
|
|
|
SAFEARRAY saClientGuid = { 1, // Dimension
|
|
FADF_AUTO | FADF_BSTR,// Flags: on stack, contains BSTRs
|
|
sizeof(BSTR), // Size of an element
|
|
1, // Lock count. 1 for safety.
|
|
(void *)&xbstrClientGuid, // The data
|
|
{ 1, 0 } }; // Bounds (element count, low bound)
|
|
//
|
|
// assemble property sets
|
|
//
|
|
|
|
DBPROP aQueryProps[4] = { { DBPROP_CI_INCLUDE_SCOPES, 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_BSTR | VT_ARRAY, 0, 0, 0, (ULONG_PTR)&saScope } },
|
|
{ DBPROP_CI_DEPTHS , 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_I4 | VT_ARRAY, 0, 0, 0, (ULONG_PTR)&saDepth } },
|
|
{ DBPROP_CI_CATALOG_NAME , 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_BSTR | VT_ARRAY, 0, 0, 0, (ULONG_PTR)&saCatalog } },
|
|
{ DBPROP_CI_QUERY_TYPE , 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_I4 , 0, 0, 0, eType } } };
|
|
|
|
DBPROP aCoreProps[2] = { { DBPROP_MACHINE , 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_BSTR | VT_ARRAY, 0, 0, 0, (ULONG_PTR)&saMachine } },
|
|
{ DBPROP_CLIENT_CLSID , 0, DBPROPSTATUS_OK, {0, 0, 0}, { VT_BSTR | VT_ARRAY, 0, 0, 0, (ULONG_PTR)&saClientGuid } } };
|
|
|
|
DBPROPSET aAllPropsets[2] = { {aQueryProps, 4, DBPROPSET_FSCIFRMWRK_EXT } ,
|
|
{aCoreProps , 2, DBPROPSET_CIFRMWRKCORE_EXT } };
|
|
|
|
//
|
|
// set property sets
|
|
//
|
|
SCODE sc = pIDbProp->SetProperties( 2, aAllPropsets );
|
|
|
|
if ( FAILED( sc ) )
|
|
THROW( CException( sc ) );
|
|
} //SetIDbProperties
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: SetCatalogState, public
|
|
//
|
|
// Synopsis: Change the catalog's state on the partition ID specified
|
|
//
|
|
// Arguments: [pwcsCat] - passed in as ADMINISTRATOR for connection
|
|
// without docstore assocication
|
|
// [pwcsMachine] - Machine on which catalog resides
|
|
// [dwNewState] - The state which catalog's going to be
|
|
// changed into
|
|
// [pdwOldState] - Output, catalog's original state
|
|
//
|
|
// History: 06-May-98 KitmanH Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE SetCatalogState( WCHAR const * pwcsCat,
|
|
WCHAR const * pwcsMachine,
|
|
DWORD dwNewState,
|
|
DWORD * pdwOldState )
|
|
{
|
|
SCODE status = S_OK;
|
|
|
|
if ( 0 == pdwOldState )
|
|
return E_INVALIDARG;
|
|
|
|
if ( 0 == pwcsMachine )
|
|
pwcsMachine = L".";
|
|
|
|
//
|
|
// Verify that we have legal parameters
|
|
//
|
|
|
|
CTranslateSystemExceptions xlate;
|
|
TRY
|
|
{
|
|
XInterface<IDBProperties> xDbProps( CreateDbProperties( CIADMIN,
|
|
pwcsMachine ) );
|
|
CSvcCatProxy cat( pwcsMachine, xDbProps.GetPointer() );
|
|
|
|
cat.SetCatState( 1, pwcsCat, dwNewState, pdwOldState );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
status = ProxyErrorToCIError( e );
|
|
}
|
|
END_CATCH
|
|
|
|
return status;
|
|
} //SetCatalogState
|
|
|