//+--------------------------------------------------------------------------- // // 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 #pragma hdrstop #include "svcquery.hxx" #include #include #include #include #include #include #include #include #include #include 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 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 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 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 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 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 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 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 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 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 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 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 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