/****************************************************************************** Copyright (c) 1999 Microsoft Corporation Module Name: Updater.cpp Abstract: Handles access to the database. Revision History: ******************************************************************************/ #include "stdafx.h" //////////////////////////////////////////////////////////////////////////////// static const WCHAR s_DB_LOCATION_ENV[] = L"%HELP_LOCATION%"; #define STAT_CREATED( table ) m_stat.m_ent##table.Created() #define STAT_MODIFIED( table ) m_stat.m_ent##table.Modified() #define STAT_DELETED( table ) m_stat.m_ent##table.Deleted() #define STAT_NOOP( table ) m_stat.m_ent##table.NoOp() //////////////////////////////////////////////////////////////////////////////// Taxonomy::Updater::WordSetStatus::WordSetStatus() { m_updater = NULL; // Updater* m_updater; m_def = NULL; // const WordSetDef* m_def; // // WordSet m_set; m_fLoaded = false; // bool m_fLoaded; m_fModified = false; // bool m_fModified; } HRESULT Taxonomy::Updater::WordSetStatus::Close() { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WordSetStatus::Close" ); HRESULT hr; m_updater = NULL; m_def = NULL; m_set.clear(); m_fLoaded = false; m_fModified = false; hr = S_OK; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::WordSetStatus::Init( /*[in]*/ Updater* updater, /*[in]*/ const WordSetDef* def ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WordSetStatus::Init" ); HRESULT hr; __MPC_EXIT_IF_METHOD_FAILS(hr, Close()); m_updater = updater; m_def = def; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////// HRESULT Taxonomy::Updater::WordSetStatus::Load() { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WordSetStatus::Load" ); HRESULT hr; if(m_fLoaded == false) { MPC::wstring strTokenList; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, m_updater->ReadDBParameter( m_def->szName, strTokenList, &fFound )); if(m_def->szDefault && strTokenList.size() == 0) strTokenList = m_def->szDefault; if(m_def->szAlwaysPresent ) strTokenList += m_def->szAlwaysPresent; if(m_def->fSplitAtDelimiter) { std::vector vec; int iLen; int i; __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::SplitAtDelimiter( vec, strTokenList.c_str(), L" ,\t\n", false, true )); iLen = vec.size(); for(i=0; i vec; WordIter it; int i; vec.resize( m_set.size() ); for(i=0, it = m_set.begin(); it != m_set.end(); it++, i++) { vec[i] = *it; } __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::JoinWithDelimiter( vec, strTokenList, m_def->fSplitAtDelimiter ? L"," : L"" )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_updater->WriteDBParameter( m_def->szName, strTokenList.c_str() )); m_fModified = false; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::WordSetStatus::Add( /*[in]*/ LPCWSTR szValue ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WordSetStatus::Add" ); HRESULT hr; __MPC_EXIT_IF_METHOD_FAILS(hr, Load()); m_set.insert( szValue ); m_fModified = true; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::WordSetStatus::Remove( /*[in]*/ LPCWSTR szValue ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WordSetStatus::Remove" ); HRESULT hr; WordIter it; __MPC_EXIT_IF_METHOD_FAILS(hr, Load()); it = m_set.find( szValue ); if(it != m_set.end()) { m_set.erase( it ); m_fModified = true; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// static const Taxonomy::Updater::WordSetDef s_SetDef[] = { { L"SET_STOPSIGNS" , false, L",?" , NULL }, // UPDATER_SET_STOPSIGNS { L"SET_STOPSIGNS_ATENDOFWORD", false, NULL , NULL }, // UPDATER_SET_STOPSIGNS_ATENDOFWORD { L"SET_STOPWORDS" , true , NULL , NULL }, // UPDATER_SET_STOPWORDS { L"SET_OPERATOR_NOT" , true , L"NOT", L",!" }, // UPDATER_SET_OPERATOR_NOT { L"SET_OPERATOR_AND" , true , L"AND", L",&,+" }, // UPDATER_SET_OPERATOR_AND { L"SET_OPERATOR_OR" , true , L"OR" , L",||" } // UPDATER_SET_OPERATOR_OR }; Taxonomy::Updater::Updater() { // Settings m_ts; m_db = NULL; // JetBlue::Database* m_db; m_cache = NULL; // Cache* m_cache; m_fUseCache = false; // bool m_fUseCache; // m_rsDBParameters = NULL; // RS_DBParameters* m_rsDBParameters; m_rsContentOwners = NULL; // RS_ContentOwners* m_rsContentOwners; m_rsSynSets = NULL; // RS_SynSets* m_rsSynSets; m_rsHelpImage = NULL; // RS_HelpImage* m_rsHelpImage; m_rsIndexFiles = NULL; // RS_IndexFiles* m_rsIndexFiles; m_rsFullTextSearch = NULL; // RS_FullTextSearch* m_rsFullTextSearch; m_rsScope = NULL; // RS_Scope* m_rsScope; m_rsTaxonomy = NULL; // RS_Taxonomy* m_rsTaxonomy; m_rsTopics = NULL; // RS_Topics* m_rsTopics; m_rsSynonyms = NULL; // RS_Synonyms* m_rsSynonyms; m_rsKeywords = NULL; // RS_Keywords* m_rsKeywords; m_rsMatches = NULL; // RS_Matches* m_rsMatches; // m_ID_owner = -1; // long m_ID_owner; m_fOEM = false; // bool m_fOEM; // // WordSetStatus m_sets[UPDATER_SET_OPERATOR_MAX]; // JetBlue::Id2Node m_nodes; // JetBlue::Node2Id m_nodes_reverse; // // Updater_Stat m_stat; } Taxonomy::Updater::~Updater() { (void)Close(); } //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::FlushWordSets() { __HCP_FUNC_ENTRY( "Taxonomy::Updater::FlushWordSets" ); HRESULT hr; int i; for(i=UPDATER_SET_STOPSIGNS; iGetTable( "DBParameters", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsDBParameters, new RS_DBParameters( tbl )); } if(pVal) *pVal = m_rsDBParameters; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetContentOwners( /*[out]*/ RS_ContentOwners* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetContentOwners" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsContentOwners == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "ContentOwners", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsContentOwners, new RS_ContentOwners( tbl )); } if(pVal) *pVal = m_rsContentOwners; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetSynSets( /*[out]*/ RS_SynSets* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetSynSets" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsSynSets == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "SynSets", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsSynSets, new RS_SynSets( tbl )); } if(pVal) *pVal = m_rsSynSets; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetHelpImage( /*[out]*/ RS_HelpImage* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetHelpImage" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsHelpImage == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "HelpImage", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsHelpImage, new RS_HelpImage( tbl )); } if(pVal) *pVal = m_rsHelpImage; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetIndexFiles( /*[out]*/ RS_IndexFiles* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetIndexFiles" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsIndexFiles == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "IndexFiles", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsIndexFiles, new RS_IndexFiles( tbl )); } if(pVal) *pVal = m_rsIndexFiles; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetFullTextSearch( /*[out]*/ RS_FullTextSearch* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetFullTextSearch" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsFullTextSearch == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "FullTextSearch", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsFullTextSearch, new RS_FullTextSearch( tbl )); } if(pVal) *pVal = m_rsFullTextSearch; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetScope( /*[out]*/ RS_Scope* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetScope" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsScope == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Scope", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsScope, new RS_Scope( tbl )); } if(pVal) *pVal = m_rsScope; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetTaxonomy( /*[out]*/ RS_Taxonomy* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetTaxonomy" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsTaxonomy == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Taxonomy", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsTaxonomy, new RS_Taxonomy( tbl )); } if(pVal) *pVal = m_rsTaxonomy; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetTopics( /*[out]*/ RS_Topics* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetTopics" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsTopics == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Topics", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsTopics, new RS_Topics( tbl )); } if(pVal) *pVal = m_rsTopics; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetSynonyms( /*[out]*/ RS_Synonyms* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetSynonyms" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsSynonyms == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Synonyms", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsSynonyms, new RS_Synonyms( tbl )); } if(pVal) *pVal = m_rsSynonyms; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetKeywords( /*[out]*/ RS_Keywords* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetKeywords" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsKeywords == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Keywords", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsKeywords, new RS_Keywords( tbl )); } if(pVal) *pVal = m_rsKeywords; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetMatches( /*[out]*/ RS_Matches* *pVal ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetMatches" ); HRESULT hr; if(pVal) *pVal = NULL; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_db); __MPC_PARAMCHECK_END(); if(m_rsMatches == NULL) { JetBlue::Table* tbl; __MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( "Matches", tbl )); __MPC_EXIT_IF_ALLOC_FAILS(hr, m_rsMatches, new RS_Matches( tbl )); } if(pVal) *pVal = m_rsMatches; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteAllTopicsUnderANode( /*[in]*/ RS_Topics* rs , /*[in]*/ long ID_node , /*[in]*/ bool fCheck ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteAllTopicsUnderANode" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Seek_TopicsUnderNode( ID_node, &fFound )); while(fFound && rs->m_ID_node == ID_node) { if(rs->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } if(fCheck == false) { __MPC_EXIT_IF_METHOD_FAILS(hr, GetMatches()); __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllMatchesPointingToTopic( m_rsMatches, rs->m_ID_topic )); __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Delete()); STAT_DELETED( Topics ); } __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::DeleteAllSubNodes( /*[in]*/ RS_Taxonomy* rs , /*[in]*/ long ID_node , /*[in]*/ bool fCheck ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteAllSubNodes" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllTopicsUnderANode( m_rsTopics, ID_node, fCheck )); __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Seek_Children( ID_node, &fFound )); while(fFound) { if(rs->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } { RS_Taxonomy subrs( *rs ); __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllSubNodes( &subrs, rs->m_ID_node, fCheck )); } if(fCheck == false) { // // Keep the node cache in sync. // NodeCache_Remove( rs->m_ID_node ); __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Delete()); STAT_DELETED( Taxonomy ); } __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::DeleteAllMatchesPointingToTopic( /*[in]*/ RS_Matches* rs , /*[in]*/ long ID_topic ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteAllMatchesPointingToTopic" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Seek_ByTopic( ID_topic, &fFound )); while(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Delete()); STAT_DELETED( Matches ); __MPC_EXIT_IF_METHOD_FAILS(hr, rs->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::ReadDBParameter( /*[in] */ LPCWSTR szName , /*[out]*/ MPC::wstring& strValue , /*[out]*/ bool *pfFound ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::ReadDBParameter" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetDBParameters()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsDBParameters->Seek_ByName( szName, &fFound )); if(fFound) { strValue = m_rsDBParameters->m_strValue; } if(pfFound) { *pfFound = fFound; } else if(fFound == false) { __MPC_SET_ERROR_AND_EXIT(hr, JetBlue::JetERRToHRESULT(JET_errRecordNotFound)); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::ReadDBParameter( /*[in] */ LPCWSTR szName , /*[out]*/ long& lValue , /*[out]*/ bool *pfFound ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::ReadDBParameter" ); HRESULT hr; MPC::wstring strValue; __MPC_EXIT_IF_METHOD_FAILS(hr, ReadDBParameter( szName, strValue, pfFound )); lValue = _wtol( strValue.c_str() ); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::WriteDBParameter( /*[in]*/ LPCWSTR szName , /*[in]*/ LPCWSTR szValue ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::WriteDBParameter" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetDBParameters()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsDBParameters->Seek_ByName( szName, &fFound )); JET_SET_FIELD_TRISTATE(m_rsDBParameters,m_strValue,m_fValid__Value,szValue,STRINGISPRESENT(szValue)); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsDBParameters->Update()); } else { m_rsDBParameters->m_strName = szName; __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsDBParameters->Insert()); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::WriteDBParameter( /*[in]*/ LPCWSTR szName , /*[in]*/ long lValue ) { WCHAR rgValue[64]; swprintf( rgValue, L"%ld", lValue ); return WriteDBParameter( szName, rgValue ); } HRESULT Taxonomy::Updater::AddWordToSet( /*[in]*/ Updater_Set id , /*[in]*/ LPCWSTR szValue ) { return m_sets[id].Add( szValue ); } HRESULT Taxonomy::Updater::RemoveWordFromSet( /*[in]*/ Updater_Set id, /*[in]*/ LPCWSTR szValue ) { return m_sets[id].Remove( szValue ); } const MPC::wstring& Taxonomy::Updater::GetHelpLocation() { if(m_strDBLocation.size() == 0) { if(Taxonomy::InstalledInstanceStore::s_GLOBAL) { Taxonomy::LockingHandle handle; Taxonomy::InstalledInstanceIter it; bool fFound; if(SUCCEEDED(Taxonomy::InstalledInstanceStore::s_GLOBAL->GrabControl( handle )) && SUCCEEDED(Taxonomy::InstalledInstanceStore::s_GLOBAL->SKU_Find ( m_ts, fFound, it )) && fFound) { m_strDBLocation = it->m_inst.m_strHelpFiles; } } if(m_strDBLocation.size() == 0) { m_strDBLocation = HC_HELPSVC_HELPFILES_DEFAULT; } } return m_strDBLocation; } HRESULT Taxonomy::Updater::ExpandURL( /*[in/out]*/ MPC::wstring& strURL ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::ExpandURL" ); HRESULT hr; LPCWSTR szEnd; GetHelpLocation(); szEnd = strURL.c_str(); while((szEnd = wcschr( szEnd, '%' ))) { if(!_wcsnicmp( szEnd, s_DB_LOCATION_ENV, MAXSTRLEN( s_DB_LOCATION_ENV ) )) { MPC::wstring::size_type pos = szEnd - strURL.c_str(); strURL.replace( pos, MAXSTRLEN( s_DB_LOCATION_ENV ), m_strDBLocation ); break; } szEnd++; } hr = MPC::SubstituteEnvVariables( strURL ); __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CollapseURL( /*[in/out]*/ MPC::wstring& strURL ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CollapseURL" ); HRESULT hr; MPC::wstring strBASE; CComBSTR bstrBASE; CComBSTR bstrURL; LPCWSTR szEnd; GetHelpLocation(); (void)MPC::SubstituteEnvVariables( strBASE = m_strDBLocation ); bstrBASE = strBASE.c_str(); ::CharUpperW( bstrBASE ); bstrURL = strURL .c_str(); ::CharUpperW( bstrURL ); if(szEnd = wcsstr( bstrURL, bstrBASE )) { MPC::wstring::size_type pos = szEnd - bstrURL; strURL.replace( pos, bstrBASE.Length(), s_DB_LOCATION_ENV ); } hr = S_OK; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::ListAllTheHelpFiles( /*[out]*/ MPC::WStringList& lstFiles ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::ListAllTheHelpFiles" ); HRESULT hr; WordSet setFiles; WordIter it; bool fFound; // // Get all the files from the HelpImage list. // if(SUCCEEDED(GetHelpImage())) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(m_rsHelpImage->m_strFile.empty() == false) setFiles.insert( m_rsHelpImage->m_strFile ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Move( 0, JET_MoveNext, &fFound )); } } // // Get all the CHM and CHQ from the FullTextSearch list. // if(SUCCEEDED(GetFullTextSearch())) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(m_rsFullTextSearch->m_strCHM.empty() == false) setFiles.insert( m_rsFullTextSearch->m_strCHM ); if(m_rsFullTextSearch->m_strCHQ.empty() == false) setFiles.insert( m_rsFullTextSearch->m_strCHQ ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Move( 0, JET_MoveNext, &fFound )); } } // // Get all the CHM from the IndexFiles list. // if(SUCCEEDED(GetIndexFiles())) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(m_rsIndexFiles->m_strStorage.empty() == false) setFiles.insert( m_rsIndexFiles->m_strStorage ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Move( 0, JET_MoveNext, &fFound )); } } // // From a set to a list to a VARIANT. // for(it = setFiles.begin(); it != setFiles.end(); it++) { lstFiles.push_back( *it ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GetIndexInfo( /*[out]*/ MPC::wstring& strLocation, /*[out]*/ MPC::wstring& strDisplayName, /*[in]*/ LPCWSTR szScope ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GetIndexInfo" ); HRESULT hr; long ID_Scope = -1; long lOwner; if(szScope) { __MPC_EXIT_IF_METHOD_FAILS(hr, LocateScope( ID_Scope, lOwner, szScope )); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_ts.IndexFile( strLocation, ID_Scope )); strDisplayName = m_rsScope->m_strName; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteOwner() { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteOwner" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetContentOwners()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(m_rsContentOwners->m_ID_owner == m_ID_owner) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Delete()); STAT_DELETED( ContentOwners ); m_ID_owner = -1; break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateOwner( /*[in] */ LPCWSTR szDN ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateOwner" ); HRESULT hr; bool fFound; m_ID_owner = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetContentOwners()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Seek_ByVendorID( szDN, &fFound )); if(fFound) { m_ID_owner = m_rsContentOwners->m_ID_owner; m_fOEM = m_rsContentOwners->m_fIsOEM; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateOwner( /*[out]*/ long& ID_owner, /*[in] */ LPCWSTR szDN , /*[in] */ bool fIsOEM ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateOwner" ); HRESULT hr; bool fFound; ID_owner = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetContentOwners()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Seek_ByVendorID( szDN, &fFound )); m_rsContentOwners->m_fIsOEM = fIsOEM; if(fFound == true) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Update()); STAT_MODIFIED( ContentOwners ); } else { m_rsContentOwners->m_strDN = szDN; __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsContentOwners->Insert()); STAT_CREATED( ContentOwners ); } ID_owner = m_rsContentOwners->m_ID_owner; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteSynSet( /*[in]*/ LPCWSTR szName ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteSynSet" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynSets()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynSets->Seek_ByPair( szName, m_ID_owner, &fFound )); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynSets->Delete()); STAT_DELETED( SynSets ); } else { STAT_NOOP( SynSets ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateSynSet( /*[out]*/ long& ID_synset , /*[in] */ LPCWSTR szName ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateSynSet" ); HRESULT hr; bool fFound; ID_synset = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynSets()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynSets->Seek_ByPair( szName, m_ID_owner, &fFound )); if(fFound) { ID_synset = m_rsSynSets->m_ID_synset; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateSynSet( /*[out]*/ long& ID_synset , /*[in ]*/ LPCWSTR szName ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateSynSet" ); HRESULT hr; bool fFound; ID_synset = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynSets()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynSets->Seek_ByPair( szName, m_ID_owner, &fFound )); if(!fFound) { m_rsSynSets->m_strName = szName; m_rsSynSets->m_ID_owner = m_ID_owner; __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynSets->Insert()); STAT_CREATED( SynSets ); } else { STAT_NOOP( SynSets ); } ID_synset = m_rsSynSets->m_ID_synset; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteSynonym( /*[in]*/ long ID_synset , /*[in]*/ LPCWSTR szName ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteSynonym" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynonyms()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Seek_ByPair( szName, ID_synset, &fFound )); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Delete()); STAT_DELETED( Synonyms ); } else { STAT_NOOP( Synonyms ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateSynonym( /*[in]*/ long ID_synset , /*[in]*/ LPCWSTR szName ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateSynonym" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynonyms()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Seek_ByPair( szName, ID_synset, &fFound )); if(!fFound) { m_rsSynonyms->m_strKeyword = szName; m_rsSynonyms->m_ID_synset = ID_synset; m_rsSynonyms->m_ID_owner = m_ID_owner; __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Insert()); STAT_CREATED( Synonyms ); } else { STAT_NOOP( Synonyms ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////// HRESULT Taxonomy::Updater::LocateSynonyms( /*[in ]*/ LPCWSTR szName , /*[out]*/ MPC::WStringList& lst , /*[in ]*/ bool fMatchOwner ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateSynonyms" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetSynonyms()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Seek_ByName( szName, &fFound )); while(fFound) { if(fMatchOwner == false || m_rsSynonyms->m_ID_owner == m_ID_owner) { WCHAR rgBuf[64]; swprintf( rgBuf, L"SYNSET_%ld", m_rsSynonyms->m_ID_synset ); lst.push_back( rgBuf ); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsSynonyms->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::AddFile( /*[in]*/ LPCWSTR szFile ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::AddFile" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetHelpImage()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Seek_ByFile( szFile, &fFound )); if(fFound) { if(m_rsHelpImage->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } STAT_NOOP( HelpImage ); } else { JET_SET_FIELD(m_rsHelpImage,m_ID_owner,m_ID_owner); JET_SET_FIELD(m_rsHelpImage,m_strFile , szFile ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Insert()); STAT_CREATED( HelpImage ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::RemoveFile( /*[in]*/ LPCWSTR szFile ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::RemoveFile" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetHelpImage()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Seek_ByFile( szFile, &fFound )); if(fFound) { if(m_rsHelpImage->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsHelpImage->Delete()); STAT_DELETED( HelpImage ); } else { STAT_NOOP( HelpImage ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::AddIndexFile( /*[in]*/ long ID_scope, /*[in]*/ LPCWSTR szStorage, /*[in]*/ LPCWSTR szFile ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::AddIndexFile" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetIndexFiles()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Seek_ByScope( ID_scope, &fFound )); while(fFound) { if(!MPC::StrICmp( m_rsIndexFiles->m_strStorage, szStorage ) && !MPC::StrICmp( m_rsIndexFiles->m_strFile , szFile ) ) { if(m_rsIndexFiles->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Move( 0, JET_MoveNext, &fFound )); } JET_SET_FIELD_TRISTATE(m_rsIndexFiles,m_strStorage,m_fValid__Storage,szStorage,STRINGISPRESENT(szStorage)); JET_SET_FIELD_TRISTATE(m_rsIndexFiles,m_strFile ,m_fValid__File ,szFile ,STRINGISPRESENT(szFile )); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Update()); STAT_MODIFIED( IndexFiles ); } else { JET_SET_FIELD(m_rsIndexFiles,m_ID_owner,m_ID_owner); JET_SET_FIELD(m_rsIndexFiles,m_ID_scope, ID_scope); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Insert()); STAT_CREATED( IndexFiles ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::RemoveIndexFile( /*[in]*/ long ID_scope, /*[in]*/ LPCWSTR szStorage, /*[in]*/ LPCWSTR szFile ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::RemoveIndexFile" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetIndexFiles()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Seek_ByScope( ID_scope, &fFound )); while(fFound) { if(!MPC::StrICmp( m_rsIndexFiles->m_strStorage, szStorage ) && !MPC::StrICmp( m_rsIndexFiles->m_strFile , szFile ) ) { if(m_rsIndexFiles->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Move( 0, JET_MoveNext, &fFound )); } if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsIndexFiles->Delete()); STAT_DELETED( IndexFiles ); } else { STAT_NOOP( IndexFiles ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::AddFullTextSearchQuery( /*[in]*/ long ID_scope, /*[in]*/ LPCWSTR szCHM, /*[in]*/ LPCWSTR szCHQ ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::AddFullTextSearchQuery" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetFullTextSearch()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Seek_ByScope( ID_scope, &fFound )); while(fFound) { if(!MPC::StrICmp( m_rsFullTextSearch->m_strCHM, szCHM )) { if(m_rsFullTextSearch->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Move( 0, JET_MoveNext, &fFound )); } JET_SET_FIELD_TRISTATE(m_rsFullTextSearch,m_strCHM,m_fValid__CHM, szCHM,STRINGISPRESENT(szCHM)); JET_SET_FIELD_TRISTATE(m_rsFullTextSearch,m_strCHQ,m_fValid__CHQ, szCHQ,STRINGISPRESENT(szCHQ)); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Update()); STAT_MODIFIED( FullTextSearch ); } else { JET_SET_FIELD(m_rsFullTextSearch,m_ID_owner,m_ID_owner); JET_SET_FIELD(m_rsFullTextSearch,m_ID_scope, ID_scope); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Insert()); STAT_CREATED( FullTextSearch ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::RemoveFullTextSearchQuery( /*[in]*/ long ID_scope, /*[in]*/ LPCWSTR szCHM ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::RemoveFullTextSearchQuery" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetFullTextSearch()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Seek_ByScope( ID_scope, &fFound )); while(fFound) { if(!MPC::StrICmp( m_rsFullTextSearch->m_strCHM, szCHM )) { if(m_rsFullTextSearch->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Move( 0, JET_MoveNext, &fFound )); } if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsFullTextSearch->Delete()); STAT_DELETED( FullTextSearch ); } else { STAT_NOOP( FullTextSearch ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::RemoveScope( /*[in]*/ long ID_scope ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::RemoveScope" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetScope()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Seek_ByScope( ID_scope, &fFound )); if(fFound) { if(m_rsScope->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Delete()); STAT_DELETED( Scope ); } else { STAT_NOOP( Scope ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateScope( /*[out]*/ long& ID_scope, /*[out]*/ long& ID_owner, /*[in]*/ LPCWSTR szID ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateScope" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetScope()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Seek_ByID( szID, &fFound )); if(fFound) { ID_scope = m_rsScope->m_ID_scope; ID_owner = m_rsScope->m_ID_owner; } else { ID_scope = -1; ID_owner = -1; } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateScope( /*[out]*/ long& ID_scope, /*[in]*/ LPCWSTR szID, /*[in]*/ LPCWSTR szName, /*[in]*/ LPCWSTR szCategory ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateScope" ); HRESULT hr; bool fFound; ID_scope = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetScope()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Seek_ByID( szID, &fFound )); if(fFound) { if(m_rsScope->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } } JET_SET_FIELD (m_rsScope,m_strID , szID ); JET_SET_FIELD (m_rsScope,m_strName , szName ); JET_SET_FIELD_TRISTATE(m_rsScope,m_strCategory,m_fValid__Category,szCategory,STRINGISPRESENT(szCategory)); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Update()); STAT_MODIFIED( Scope ); } else { JET_SET_FIELD(m_rsScope,m_ID_owner, m_ID_owner); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsScope->Insert()); STAT_CREATED( Scope ); } ID_scope = m_rsScope->m_ID_scope; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// bool Taxonomy::Updater::NodeCache_FindNode( /*[in ]*/ MPC::wstringUC& strPathUC, /*[out]*/ JetBlue::Id2NodeIter& itNode ) { itNode = m_nodes.find( strPathUC ); return (itNode != m_nodes.end()); } bool Taxonomy::Updater::NodeCache_FindId( /*[in ]*/ long ID_node, /*[out]*/ JetBlue::Node2IdIter& itId ) { itId = m_nodes_reverse.find( ID_node ); return (itId != m_nodes_reverse.end()); } void Taxonomy::Updater::NodeCache_Add( /*[in]*/ MPC::wstringUC& strPathUC, /*[in]*/ long ID_node ) { m_nodes [ strPathUC ] = ID_node; m_nodes_reverse[ ID_node ] = strPathUC; } void Taxonomy::Updater::NodeCache_Remove( /*[in]*/ long ID_node ) { JetBlue::Node2IdIter itId; JetBlue::Id2NodeIter itNode; itId = m_nodes_reverse.find( ID_node ); if(itId != m_nodes_reverse.end()) { m_nodes .erase( itId->second ); m_nodes_reverse.erase( itId ); } } void Taxonomy::Updater::NodeCache_Clear() { m_nodes .clear(); m_nodes_reverse.clear(); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteTaxonomyNode( /*[in ]*/ long ID_node ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteTaxonomyNode" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetTaxonomy()); __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics ()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Seek_Node( ID_node, &fFound )); if(fFound) { if(m_rsTaxonomy->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } // // Before deleting the node, check everything below it can be deleted, then delete it. // { RS_Taxonomy subrs( *m_rsTaxonomy ); __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllSubNodes( &subrs, ID_node, true )); __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllSubNodes( &subrs, ID_node, false )); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Delete()); STAT_DELETED( Taxonomy ); // // Keep the node cache in sync. // NodeCache_Remove( ID_node ); } else { STAT_NOOP( Taxonomy ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateTaxonomyNode( /*[out]*/ long& ID_node , /*[in ]*/ LPCWSTR szTaxonomyPath , /*[in ]*/ bool fLookForFather ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateTaxonomyNode" ); HRESULT hr; MPC::WStringVector vec; MPC::WStringVectorIter it; MPC::wstring strPath; MPC::wstringUC strPathUC; JetBlue::Id2NodeIter itNode; long idCurrent = -1; int iLast; int i; ID_node = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetTaxonomy()); __MPC_EXIT_IF_METHOD_FAILS(hr, Taxonomy::Settings::SplitNodePath( szTaxonomyPath, vec )); it = vec.begin(); iLast = vec.size (); if(fLookForFather) iLast--; for(i=0; isecond; } else { LPCWSTR szEntry = it->c_str(); if(m_cache == NULL || FAILED(m_cache->LocateNode( m_ts, idCurrent, szEntry, *m_rsTaxonomy ))) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Seek_SubNode( idCurrent, szEntry )); } idCurrent = m_rsTaxonomy->m_ID_node; // // Update cache. // NodeCache_Add( strPathUC, idCurrent ); } } ID_node = idCurrent; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateTaxonomyNode( /*[out]*/ long& ID_node , /*[in ]*/ LPCWSTR szTaxonomyPath , /*[in ]*/ LPCWSTR szTitle , /*[in ]*/ LPCWSTR szDescription , /*[in ]*/ LPCWSTR szURI , /*[in ]*/ LPCWSTR szIconURI , /*[in ]*/ bool fVisible , /*[in ]*/ bool fSubsite , /*[in ]*/ long lNavModel , /*[in ]*/ long lPos ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateTaxonomyNode" ); HRESULT hr; LPCWSTR szEntry; long ID_parent; bool fFound; ID_node = -1; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(szTaxonomyPath); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, GetTaxonomy()); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_parent, szTaxonomyPath, true )); // // Extract the last component of the Category. // if((szEntry = wcsrchr( szTaxonomyPath, '/' ))) { szEntry++; } else { szEntry = szTaxonomyPath; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Seek_SubNode( ID_parent, szEntry, &fFound )); if(fFound && m_rsTaxonomy->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } JET_SET_FIELD (m_rsTaxonomy,m_lPos , lPos ); JET_SET_FIELD_TRISTATE(m_rsTaxonomy,m_ID_parent ,m_fValid__ID_parent , ID_parent ,(ID_parent != -1 )); JET_SET_FIELD (m_rsTaxonomy,m_ID_owner ,m_ID_owner ); JET_SET_FIELD (m_rsTaxonomy,m_strEntry , szEntry ); JET_SET_FIELD_TRISTATE(m_rsTaxonomy,m_strTitle ,m_fValid__Title , szTitle ,STRINGISPRESENT(szTitle )); JET_SET_FIELD_TRISTATE(m_rsTaxonomy,m_strDescription ,m_fValid__Description , szDescription,STRINGISPRESENT(szDescription)); JET_SET_FIELD_TRISTATE(m_rsTaxonomy,m_strDescriptionURI,m_fValid__DescriptionURI, szURI ,STRINGISPRESENT(szURI )); JET_SET_FIELD_TRISTATE(m_rsTaxonomy,m_strIconURI ,m_fValid__IconURI , szIconURI ,STRINGISPRESENT(szIconURI )); JET_SET_FIELD (m_rsTaxonomy,m_fVisible , fVisible ); JET_SET_FIELD (m_rsTaxonomy,m_fSubsite , fSubsite ); JET_SET_FIELD (m_rsTaxonomy,m_lNavModel , lNavModel ); if(fFound) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Update()); STAT_MODIFIED( Taxonomy ); } else { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Insert()); STAT_CREATED( Taxonomy ); } ID_node = m_rsTaxonomy->m_ID_node; { JetBlue::Node2IdIter itId; if(NodeCache_FindId( ID_parent, itId )) { MPC::wstring strPath = itId->second; strPath.append( L"/" ); strPath.append( szEntry ); // // Update cache. // NodeCache_Add( MPC::wstringUC( strPath ), ID_node ); } } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::DeleteTopicEntry( /*[in]*/ long ID_topic ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::DeleteTopicEntry" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics ()); __MPC_EXIT_IF_METHOD_FAILS(hr, GetMatches()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Seek_SingleTopic( ID_topic, &fFound )); if(fFound) { if(m_rsTopics->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } __MPC_EXIT_IF_METHOD_FAILS(hr, DeleteAllMatchesPointingToTopic( m_rsMatches, ID_topic )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Delete()); STAT_DELETED( Topics ); } else { STAT_NOOP( Topics ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateTopicEntry( /*[out]*/ long& ID_topic , /*[in ]*/ long ID_node , /*[in ]*/ LPCWSTR szURI , /*[in ]*/ bool fCheckOwner ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateTopicEntry" ); HRESULT hr; bool fFound; ID_topic = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Seek_TopicsUnderNode( ID_node, &fFound )); while(fFound) { if(!MPC::StrICmp( m_rsTopics->m_strURI, szURI )) { if(fCheckOwner && m_rsTopics->m_ID_owner != m_ID_owner) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_ACCESS_DENIED); } ID_topic = m_rsTopics->m_ID_topic; break; } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Move( 0, JET_MoveNext, &fFound )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::CreateTopicEntry( /*[out]*/ long& ID_topic , /*[in]*/ long ID_node , /*[in]*/ LPCWSTR szTitle , /*[in]*/ LPCWSTR szURI , /*[in]*/ LPCWSTR szDescription , /*[in]*/ LPCWSTR szIconURI , /*[in]*/ long lType , /*[in]*/ bool fVisible , /*[in]*/ long lPos ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateTopicEntry" ); HRESULT hr; bool fFound; ID_topic = -1; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(szTitle); __MPC_PARAMCHECK_NOTNULL(szURI); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics()); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTopicEntry( ID_topic, ID_node, szURI, /*fCheckOwner*/true )); JET_SET_FIELD (m_rsTopics,m_ID_node , ID_node ); JET_SET_FIELD (m_rsTopics,m_ID_owner ,m_ID_owner ); JET_SET_FIELD_TRISTATE(m_rsTopics,m_strTitle ,m_fValid__Title , szTitle ,STRINGISPRESENT(szTitle )); JET_SET_FIELD_TRISTATE(m_rsTopics,m_strURI ,m_fValid__URI , szURI ,STRINGISPRESENT(szURI )); JET_SET_FIELD_TRISTATE(m_rsTopics,m_strDescription,m_fValid__Description, szDescription,STRINGISPRESENT(szDescription)); JET_SET_FIELD_TRISTATE(m_rsTopics,m_strIconURI ,m_fValid__IconURI , szIconURI ,STRINGISPRESENT(szIconURI )); JET_SET_FIELD (m_rsTopics,m_lType , lType ); JET_SET_FIELD (m_rsTopics,m_lPos , lPos ); JET_SET_FIELD (m_rsTopics,m_fVisible , fVisible ); if(ID_topic == -1) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Insert()); STAT_CREATED( Topics ); ID_topic = m_rsTopics->m_ID_topic; } else { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Update()); STAT_MODIFIED( Topics ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::CreateMatch( /*[in]*/ LPCWSTR szKeyword , /*[in]*/ long ID_topic , /*[in]*/ long lPriority , /*[in]*/ bool fHHK ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::CreateMatch" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetKeywords()); __MPC_EXIT_IF_METHOD_FAILS(hr, GetMatches ()); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsKeywords->Seek_ByName( szKeyword, &fFound )); if(fFound == false) { JET_SET_FIELD(m_rsKeywords,m_strKeyword,szKeyword); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsKeywords->Insert()); STAT_CREATED( Keywords ); } JET_SET_FIELD(m_rsMatches,m_ID_topic ,ID_topic ); JET_SET_FIELD(m_rsMatches,m_ID_keyword,m_rsKeywords->m_ID_keyword); JET_SET_FIELD(m_rsMatches,m_lPriority ,lPriority ); JET_SET_FIELD(m_rsMatches,m_fHHK ,fHHK ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsMatches->Seek_Pair( m_rsKeywords->m_ID_keyword, ID_topic, &fFound )); if(fFound) { if(m_rsMatches->m_lPriority != lPriority || m_rsMatches->m_fHHK != fHHK ) { JET_SET_FIELD(m_rsMatches,m_lPriority,lPriority); JET_SET_FIELD(m_rsMatches,m_fHHK ,fHHK ); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsMatches->Update()); STAT_MODIFIED( Matches ); } else { STAT_NOOP( Matches ); } } else { __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsMatches->Insert()); STAT_CREATED( Matches ); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// HRESULT Taxonomy::Updater::MakeRoomForInsert( /*[in ]*/ LPCWSTR szNodeStr , /*[in ]*/ LPCWSTR szMode , /*[in ]*/ LPCWSTR szID , /*[out]*/ long& lPos ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::MakeRoomForInsert" ); HRESULT hr; QueryResults qr( *this ); long ID_node; lPos = -1; __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, false )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.MakeRoomForInsert( szMode, szID, ID_node, lPos )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateSubNodes( /*[in] */ long ID_node , /*[in] */ bool fRecurse , /*[in] */ bool fOnlyVisible , /*[out]*/ MatchSet& res ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateSubNodes" ); HRESULT hr; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_cache); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->LocateSubNodes( m_ts, ID_node, fRecurse, fOnlyVisible, res )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateNodesFromURL( /*[in ]*/ LPCWSTR szURL , /*[out]*/ MatchSet& res ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateNodesFromURL" ); HRESULT hr; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(m_cache); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->LocateNodesFromURL( m_ts, szURL, res )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LookupNode( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LookupNode" ); HRESULT hr; OfflineCache::Entry_Type et = OfflineCache::ET_NODE; QueryResults qr( *this ); long ID_node; MPC::wstring strParent; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); if(m_fUseCache && m_cache && SUCCEEDED(m_cache->RetrieveQuery( m_ts, szNodeStr, et, pColl ))) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } //////////////////// // // Find the father of the node. // if(szNodeStr) { LPCWSTR szEnd = wcsrchr( szNodeStr, '/' ); if(szEnd) { strParent.assign( szNodeStr, szEnd ); } else { ; // Root } } __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, false )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.Append( m_rsTaxonomy, strParent.c_str() )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); //////////////////// if(m_fUseCache && m_cache && FAILED(m_cache->StoreQuery( m_ts, szNodeStr, et, pColl ))) { ; // Cache failures are not fatal, don't abort. } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LookupSubNodes( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ bool fVisibleOnly , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LookupSubNodes" ); HRESULT hr; OfflineCache::Entry_Type et = fVisibleOnly ? OfflineCache::ET_SUBNODES_VISIBLE : OfflineCache::ET_SUBNODES; QueryResults qr( *this ); long ID_node; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); if(m_fUseCache && m_cache && SUCCEEDED(m_cache->RetrieveQuery( m_ts, szNodeStr, et, pColl ))) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } //////////////////// __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, false )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.LookupNodes( szNodeStr, ID_node, fVisibleOnly )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); //////////////////// if(m_fUseCache && m_cache && FAILED(m_cache->StoreQuery( m_ts, szNodeStr, et, pColl ))) { ; // Cache failures are not fatal, don't abort. } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LookupNodesAndTopics( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ bool fVisibleOnly , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LookupNodesAndTopics" ); HRESULT hr; OfflineCache::Entry_Type et = fVisibleOnly ? OfflineCache::ET_NODESANDTOPICS_VISIBLE : OfflineCache::ET_NODESANDTOPICS; QueryResults qr( *this ); long ID_node; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); if(m_fUseCache && m_cache && SUCCEEDED(m_cache->RetrieveQuery( m_ts, szNodeStr, et, pColl ))) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } //////////////////// __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, false )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.LookupNodes ( szNodeStr, ID_node, fVisibleOnly )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.LookupTopics( szNodeStr, ID_node, fVisibleOnly )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); //////////////////// if(m_fUseCache && m_cache && FAILED(m_cache->StoreQuery( m_ts, szNodeStr, et, pColl ))) { ; // Cache failures are not fatal, don't abort. } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LookupTopics( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ bool fVisibleOnly , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LookupTopics" ); HRESULT hr; OfflineCache::Entry_Type et = fVisibleOnly ? OfflineCache::ET_TOPICS_VISIBLE : OfflineCache::ET_TOPICS; QueryResults qr( *this ); long ID_node; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); if(m_fUseCache && m_cache && SUCCEEDED(m_cache->RetrieveQuery( m_ts, szNodeStr, et, pColl ))) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } //////////////////// __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, false )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.LookupTopics( szNodeStr, ID_node, fVisibleOnly )); __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); //////////////////// if(m_fUseCache && m_cache && FAILED(m_cache->StoreQuery( m_ts, szNodeStr, et, pColl ))) { ; // Cache failures are not fatal, don't abort. } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::LocateContext( /*[in]*/ LPCWSTR szURL , /*[in]*/ LPCWSTR szSubSite , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::LocateContext" ); HRESULT hr; QueryResults qr( *this ); Taxonomy::MatchSet setNodes; Taxonomy::MatchSet setNodes2; Taxonomy::MatchIter it2; MPC::wstring strURL; MPC::wstring strPath; long ID_node; bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_STRING_NOT_EMPTY(szURL); __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); SANITIZEWSTR(szSubSite); __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics()); __MPC_EXIT_IF_METHOD_FAILS(hr, CollapseURL( strURL = szURL )); // // Locate the subsite. // __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szSubSite, false )); // // Create the set of nodes in the subsite. // setNodes.insert( ID_node ); // Add the node itself. __MPC_EXIT_IF_METHOD_FAILS(hr, LocateSubNodes( ID_node, /*fRecurse*/true, /*fOnlyVisible*/true, setNodes )); // // Also create the set of nodes matching the URL. // __MPC_EXIT_IF_METHOD_FAILS(hr, LocateNodesFromURL( strURL.c_str(), setNodes2 )); // // For all the topics matching the URL, create an entry. // __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Seek_ByURI( strURL.c_str(), &fFound )); while(fFound) { long ID_node = m_rsTopics->m_ID_node; if(setNodes.find( ID_node ) != setNodes.end()) { if(m_fUseCache && m_cache) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->BuildNodePath( m_ts, ID_node, strPath, /*fParent*/false )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.Append( m_rsTopics, strPath.c_str() )); } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Move( 0, JET_MoveNext, &fFound )); } // // For all the nodes matching the URL, create an entry. // for(it2 = setNodes2.begin(); it2 != setNodes2.end(); it2++) { long ID_node = *it2; if(setNodes.find( ID_node ) != setNodes.end()) { if(m_fUseCache && m_cache) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->BuildNodePath( m_ts, ID_node, strPath, /*fParent*/false )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.Append( m_rsTopics, strPath.c_str() )); } } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::KeywordSearch( /*[in]*/ LPCWSTR szQueryStr , /*[in]*/ LPCWSTR szSubSite , /*[in]*/ CPCHQueryResultCollection* pColl , /*[in]*/ MPC::WStringList* lst ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::KeywordSearch" ); HRESULT hr; Taxonomy::KeywordSearch ks( *this ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_STRING_NOT_EMPTY(szQueryStr); __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, ks.Execute( szQueryStr, szSubSite, pColl, lst )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GatherNodes( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ bool fVisibleOnly , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GatherNodes" ); HRESULT hr; QueryResults qr( *this ); MatchSet setNodes; long ID_node; bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, /*fLookForFather*/false )); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateSubNodes ( ID_node, /*fRecurse */true , fVisibleOnly, setNodes )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(fVisibleOnly == false || m_rsTaxonomy->m_fVisible) { if(setNodes.find( m_rsTaxonomy->m_ID_node ) != setNodes.end()) { MPC::wstring strPath; if(m_fUseCache && m_cache) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->BuildNodePath( m_ts, m_rsTaxonomy->m_ID_node, strPath, /*fParent*/true )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.Append( m_rsTaxonomy, strPath.c_str() )); } } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTaxonomy->Move( 0, JET_MoveNext, &fFound )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT Taxonomy::Updater::GatherTopics( /*[in]*/ LPCWSTR szNodeStr , /*[in]*/ bool fVisibleOnly , /*[in]*/ CPCHQueryResultCollection* pColl ) { __HCP_FUNC_ENTRY( "Taxonomy::Updater::GatherTopics" ); HRESULT hr; Taxonomy::MatchSet setNodes; QueryResults qr( *this ); long ID_node; bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pColl); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, GetTopics()); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateTaxonomyNode( ID_node, szNodeStr, /*fLookForFather*/false )); __MPC_EXIT_IF_METHOD_FAILS(hr, LocateSubNodes ( ID_node, /*fRecurse */true , fVisibleOnly, setNodes )); setNodes.insert( ID_node ); // Add the node itself. // // Create an entry for each topic. // __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Move( 0, JET_MoveFirst, &fFound )); while(fFound) { if(fVisibleOnly == false || m_rsTopics->m_fVisible) { if(setNodes.find( m_rsTopics->m_ID_node ) != setNodes.end()) { MPC::wstring strPath; if(m_fUseCache && m_cache) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_cache->BuildNodePath( m_ts, m_rsTaxonomy->m_ID_node, strPath, /*fParent*/false )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.Append( m_rsTopics, strPath.c_str() )); } } __MPC_EXIT_IF_METHOD_FAILS(hr, m_rsTopics->Move( 0, JET_MoveNext, &fFound )); } __MPC_EXIT_IF_METHOD_FAILS(hr, qr.PopulateCollection( pColl )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); }