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

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