searcher/searchserver/src/CCPixAbstractSearcher.cpp
changeset 14 8bd192d47aaa
parent 8 6547bf8ca13a
child 16 2729d20a0010
--- a/searcher/searchserver/src/CCPixAbstractSearcher.cpp	Mon Jul 26 12:27:31 2010 +0530
+++ b/searcher/searchserver/src/CCPixAbstractSearcher.cpp	Mon Aug 09 10:51:30 2010 +0530
@@ -10,7 +10,11 @@
 #include "SearchServerHelper.h"
 #include "CSearchDocument.h"
 
-CCPixAbstractSearcher::~CCPixAbstractSearcher() {} 
+RArray<TInt> CCPixAbstractSearcher::docSizeArray;
+
+CCPixAbstractSearcher::~CCPixAbstractSearcher() {
+docSizeArray.Close();
+} 
 
 
 namespace {
@@ -93,9 +97,98 @@
 		document->AddFieldL(namePtr, stringvalue);
 		}
 	
-	CleanupStack::PopAndDestroy(docFieldEnum);
-	
+	CleanupStack::PopAndDestroy(docFieldEnum);	
 	CleanupStack::Pop(document);
-	
+	delete aDocument;
 	return document;
 	}
+	
+RPointerArray<CSearchDocument> CCPixAbstractSearcher::ConvertBatchDocumentL( cpix_Document** aDocument, TInt aCount )
+	{
+	// Read first the system fields that are passed as constructor parameters 
+	//
+    RPointerArray<CSearchDocument> docArray;
+    docSizeArray.Reset();    
+    //docArray.Reset(); // delete each element
+    
+    for( TInt i= 0;i< aCount;i++ )
+        {
+        cpix_Document* nextDocument = aDocument[i];
+        
+        if( nextDocument->ptr_ )
+            {
+            const wchar_t* documentId = cpix_Document_getFieldValue( nextDocument, LCPIX_DOCUID_FIELD);
+            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
+            
+            TPtrC documentIdPtr(KNullDesC);
+            if (documentId)
+                documentIdPtr.Set(reinterpret_cast<const TUint16*>(documentId));
+        
+            const wchar_t* documentAppClass = cpix_Document_getFieldValue(nextDocument, LCPIX_APPCLASS_FIELD);
+            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
+            
+            TPtrC documentAppClassPtr(KNullDesC);
+            if (documentAppClass)
+                documentAppClassPtr.Set(reinterpret_cast<const TUint16*>(documentAppClass));
+        
+            const wchar_t* documentExcerpt = cpix_Document_getFieldValue(nextDocument, LCPIX_EXCERPT_FIELD);
+            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
+            
+            TPtrC documentExcerptPtr(KNullDesC);
+            if (documentExcerpt)
+                documentExcerptPtr.Set(reinterpret_cast<const TUint16*>(documentExcerpt));
+        
+            // Setup the document
+            // 
+            
+            CSearchDocument* document = CSearchDocument::NewLC(documentIdPtr, documentAppClassPtr, documentExcerptPtr);
+            
+            // Enumerate the field of cpix_Document and add each of them 
+            // into the CSearchDocument object. 
+            // 
+            
+            cpix_DocFieldEnum* docFieldEnum = cpix_Document_fields(nextDocument);
+            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDocumentAccessFailed);
+        
+            CleanupStack::PushL( TCleanupItem(CpixDocFieldEnumDestroyer, docFieldEnum) ); 
+            
+            cpix_Field field;
+            while (cpix_DocFieldEnum_hasMore(docFieldEnum))
+                {
+                cpix_DocFieldEnum_next(docFieldEnum, &field);
+                SearchServerHelper::CheckCpixErrorL(docFieldEnum, KErrDatabaseQueryFailed);
+                
+                const wchar_t* name = cpix_Field_name(&field);
+                SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
+        
+                TPtrC namePtr( reinterpret_cast<const TUint16*>( name ) );
+                if (    namePtr == TPtrC( (TUint16*)LCPIX_DOCUID_FIELD )
+                     || namePtr == TPtrC( (TUint16*)LCPIX_APPCLASS_FIELD )
+                     || namePtr == TPtrC( (TUint16*)LCPIX_EXCERPT_FIELD ) )
+                    {
+                    continue;  // These fields have already been added
+                    }
+        
+                const wchar_t* value = cpix_Field_stringValue(&field);
+                SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
+                
+                TPtrC stringvalue( reinterpret_cast<const TUint16*>( value ) );
+                
+                // NOTE: Also system fields will be iterated. Because  
+                //       the field name is not checked, all _appclass,
+                //       _excerpt etc. fields  will be overwritten. 
+                document->AddFieldL(namePtr, stringvalue);
+                }	
+            CleanupStack::PopAndDestroy(docFieldEnum);	
+            CleanupStack::Pop(document);
+            docSizeArray.AppendL( document->Size());
+            docArray.AppendL( document );
+            delete nextDocument;
+            nextDocument = NULL;                      
+            }
+        else break;
+        }
+	delete aDocument;
+	aDocument = NULL;
+	return docArray;
+	}