searcher/searchserver/src/ccpixsearch.cpp
changeset 24 65456528cac2
parent 16 2729d20a0010
equal deleted inserted replaced
23:d4d56f5e7c55 24:65456528cac2
    25 #ifdef OST_TRACE_COMPILER_IN_USE
    25 #ifdef OST_TRACE_COMPILER_IN_USE
    26 #include "ccpixsearchTraces.h"
    26 #include "ccpixsearchTraces.h"
    27 #endif
    27 #endif
    28 
    28 
    29 
    29 
    30 
    30 Cpt::Mutex CCPixSearch::hitMutex_;
    31 
    31 
    32 CCPixSearch* CCPixSearch::NewL()
    32 CCPixSearch* CCPixSearch::NewL()
    33 	{
    33 	{
    34 	CCPixSearch* self = CCPixSearch::NewLC();
    34 	CCPixSearch* self = CCPixSearch::NewLC();
    35 	CleanupStack::Pop(self);
    35 	CleanupStack::Pop(self);
   119     }
   119     }
   120 
   120 
   121 void CCPixSearch::CompletionCallback(void *aCookie, cpix_JobId aJobId)
   121 void CCPixSearch::CompletionCallback(void *aCookie, cpix_JobId aJobId)
   122 	{
   122 	{
   123 	CCPixSearch* object = (CCPixSearch*)aCookie;
   123 	CCPixSearch* object = (CCPixSearch*)aCookie;
   124 
   124     {
       
   125     Cpt::SyncRegion
       
   126                 sr(hitMutex_);
   125 	// Sanity check
   127 	// Sanity check
   126 	if (object == NULL || 
   128 	if (object == NULL || 
   127 		object->iPendingJobId != aJobId)
   129 		object->iPendingJobId != aJobId)
   128 		return;
   130 		return;
   129 	
   131 
       
   132     }
   130 	// Call the asyncronizers completion code
   133 	// Call the asyncronizers completion code
   131 	CCPixAsyncronizer* asyncronizer = object->iAsyncronizer;
   134 	CCPixAsyncronizer* asyncronizer = object->iAsyncronizer;
   132 	asyncronizer->CompletionCallback();
   135 	asyncronizer->CompletionCallback();
   133 	}
   136 	}
   134 
   137 
   172     CleanupStack::PopAndDestroy(searchTerms);
   175     CleanupStack::PopAndDestroy(searchTerms);
   173     
   176     
   174     // Commit the search
   177     // Commit the search
   175     if ( iQuery )
   178     if ( iQuery )
   176 	    {
   179 	    {
       
   180         {
       
   181         Cpt::SyncRegion
       
   182                     sr(hitMutex_);
   177 	    iPendingJobId = cpix_IdxSearcher_asyncSearch(iIdxDb, iQuery, (void*)this, &CompletionCallback);
   183 	    iPendingJobId = cpix_IdxSearcher_asyncSearch(iIdxDb, iQuery, (void*)this, &CompletionCallback);
   178 	    SearchServerHelper::CheckCpixErrorL(iIdxDb, KErrDatabaseQueryFailed);
   184 	    SearchServerHelper::CheckCpixErrorL(iIdxDb, KErrDatabaseQueryFailed);
   179     	iPendingTask = EPendingTaskSearch;
   185     	iPendingTask = EPendingTaskSearch;
   180 	    iAsyncronizer->Start(ECPixTaskTypeSearch, aObserver, aMessage);
   186 	    iAsyncronizer->Start(ECPixTaskTypeSearch, aObserver, aMessage);
   181 	    
   187         }
   182         OstTraceFunctionExit0( CCPIXSEARCH_SEARCHL_EXIT );
   188         OstTraceFunctionExit0( CCPIXSEARCH_SEARCHL_EXIT );
   183         return ETrue;
   189         return ETrue;
   184         }
   190         }
   185     
   191     
   186     // Search was not committed
   192     // Search was not committed
   220 	
   226 	
   221     iPendingTask = EPendingTaskDocument;
   227     iPendingTask = EPendingTaskDocument;
   222     
   228     
   223     iCurrentCpixDocument = new cpix_Document;
   229     iCurrentCpixDocument = new cpix_Document;
   224     iCurrentCpixDocument->ptr_ = NULL;
   230     iCurrentCpixDocument->ptr_ = NULL;
       
   231     {
       
   232     Cpt::SyncRegion
       
   233                 sr(hitMutex_);
   225     iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, &iCurrentCpixDocument, (void*)this, &CompletionCallback,1);
   234     iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, &iCurrentCpixDocument, (void*)this, &CompletionCallback,1);
       
   235 
   226     if ( cpix_Failed(iHits) )
   236     if ( cpix_Failed(iHits) )
   227         {
   237         {
   228         SearchServerHelper::LogErrorL(*(iHits->err_));
   238         SearchServerHelper::LogErrorL(*(iHits->err_));
   229         cpix_ClearError(iHits);
   239         cpix_ClearError(iHits);
   230         User::Leave(KErrDocumentAccessFailed);
   240         User::Leave(KErrDocumentAccessFailed);
   231         }
   241         }
   232     iAsyncronizer->Start(ECPixTaskTypeGetDocument, aObserver, aMessage);
   242     iAsyncronizer->Start(ECPixTaskTypeGetDocument, aObserver, aMessage);
       
   243     }
   233 	OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTL_EXIT );
   244 	OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTL_EXIT );
       
   245 
   234 	}
   246 	}
   235 	
   247 	
   236 void CCPixSearch::GetBatchDocumentL(TInt aIndex, MCPixAsyncronizerObserver* aObserver, const RMessage2& aMessage, TInt aCount)
   248 void CCPixSearch::GetBatchDocumentL(TInt aIndex, MCPixAsyncronizerObserver* aObserver, const RMessage2& aMessage, TInt aCount)
   237 	{	
   249 	{	
   238 	PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentL");
   250 	PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentL");
   252             ibatchDocuments[i] = new cpix_Document;
   264             ibatchDocuments[i] = new cpix_Document;
   253             ibatchDocuments[i]->ptr_ = NULL;
   265             ibatchDocuments[i]->ptr_ = NULL;
   254 	    }
   266 	    }
   255 	
   267 	
   256     iPendingTask = EPendingTaskDocument;
   268     iPendingTask = EPendingTaskDocument;
       
   269     {
       
   270     Cpt::SyncRegion
       
   271                 sr(hitMutex_);
   257     iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, ibatchDocuments, (void*)this, &CompletionCallback, aCount);
   272     iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, ibatchDocuments, (void*)this, &CompletionCallback, aCount);
       
   273  
   258     if ( cpix_Failed(iHits) )
   274     if ( cpix_Failed(iHits) )
   259         {
   275         {
   260         SearchServerHelper::LogErrorL(*(iHits->err_));
   276         SearchServerHelper::LogErrorL(*(iHits->err_));
   261         cpix_ClearError(iHits);
   277         cpix_ClearError(iHits);
   262         User::Leave(KErrDocumentAccessFailed);
   278         User::Leave(KErrDocumentAccessFailed);
   263         }
   279         }
   264     iAsyncronizer->Start(ECPixTaskTypeGetBatchDocument, aObserver, aMessage);
   280     iAsyncronizer->Start(ECPixTaskTypeGetBatchDocument, aObserver, aMessage);
       
   281     }
   265 	}
   282 	}
   266 
   283 
   267 CSearchDocument* CCPixSearch::GetDocumentCompleteL()
   284 CSearchDocument* CCPixSearch::GetDocumentCompleteL()
   268 	{
   285 	{
   269 	OstTraceFunctionEntry0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_ENTRY );
   286 	OstTraceFunctionEntry0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_ENTRY );
   274 	
   291 	
   275 	cpix_Hits_asyncDocResults(iHits, iPendingJobId);
   292 	cpix_Hits_asyncDocResults(iHits, iPendingJobId);
   276 	SearchServerHelper::CheckCpixErrorL(iHits, KErrDocumentAccessFailed);
   293 	SearchServerHelper::CheckCpixErrorL(iHits, KErrDocumentAccessFailed);
   277 	
   294 	
   278 	return ConvertDocumentL( iCurrentCpixDocument );
   295 	return ConvertDocumentL( iCurrentCpixDocument );
   279 #if 0 // TODO XXX TIM
       
   280 	const wchar_t* documentId = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_DOCUID_FIELD);
       
   281 	SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed);
       
   282 	
       
   283 	TPtrC documentIdPtr(KNullDesC);
       
   284 	if (documentId)
       
   285 		documentIdPtr.Set(reinterpret_cast<const TUint16*>(documentId));
       
   286 
       
   287 	const wchar_t* documentAppClass = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_APPCLASS_FIELD);
       
   288 	SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed);
       
   289 	
       
   290 	TPtrC documentAppClassPtr(KNullDesC);
       
   291 	if (documentAppClass)
       
   292 		documentAppClassPtr.Set(reinterpret_cast<const TUint16*>(documentAppClass));
       
   293 
       
   294 	const wchar_t* documentExcerpt = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_EXCERPT_FIELD);
       
   295 	SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed);
       
   296 	
       
   297 	TPtrC documentExcerptPtr(KNullDesC);
       
   298 	if (documentExcerpt)
       
   299 		documentExcerptPtr.Set(reinterpret_cast<const TUint16*>(documentExcerpt));
       
   300 
       
   301 	CSearchDocument* document = CSearchDocument::NewLC(documentIdPtr, documentAppClassPtr, documentExcerptPtr);
       
   302 
       
   303 	cpix_DocFieldEnum* docFieldEnum = cpix_Document_fields(&iCurrentCpixDocument);
       
   304 
       
   305 	// push to cleanup stack.
       
   306 	CleanupStack::PushL( TCleanupItem(CpixDocFieldEnumDestroyer, docFieldEnum) );
       
   307 
       
   308 	SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDocumentAccessFailed);
       
   309 
       
   310 	cpix_Field field;
       
   311 
       
   312 	while (cpix_DocFieldEnum_hasMore(docFieldEnum))
       
   313 		{
       
   314 		cpix_DocFieldEnum_next(docFieldEnum, &field);
       
   315 		SearchServerHelper::CheckCpixErrorL(docFieldEnum, KErrDatabaseQueryFailed);
       
   316 		
       
   317 		const wchar_t* name = cpix_Field_name(&field);
       
   318 		SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
       
   319 
       
   320 		TPtrC namePtr( reinterpret_cast<const TUint16*>( name ) );
       
   321 		if (    namePtr == TPtrC( (TUint16*)LCPIX_DOCUID_FIELD )
       
   322 			 || namePtr == TPtrC( (TUint16*)LCPIX_APPCLASS_FIELD )
       
   323 			 || namePtr == TPtrC( (TUint16*)LCPIX_EXCERPT_FIELD ) )
       
   324 			{
       
   325 			continue;  // These fields have already been added
       
   326 			}
       
   327 
       
   328 		const wchar_t* value = cpix_Field_stringValue(&field);
       
   329 		SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
       
   330 		
       
   331 		TPtrC stringvalue( reinterpret_cast<const TUint16*>( value ) );
       
   332 		document->AddFieldL(namePtr, stringvalue);
       
   333 		}
       
   334 
       
   335 	CleanupStack::PopAndDestroy(docFieldEnum);
       
   336 	
       
   337 	CleanupStack::Pop(document);
       
   338 	
       
   339 	OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_EXIT );
       
   340 	return document;
       
   341 #endif // 0
       
   342 	}
   296 	}
   343 	
   297 	
   344 RPointerArray<CSearchDocument> CCPixSearch::GetBatchDocumentCompleteL()
   298 RPointerArray<CSearchDocument> CCPixSearch::GetBatchDocumentCompleteL()
   345 	{
   299 	{
   346 	PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentCompleteL");
   300 	PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentCompleteL");