diff -r afe194b6b1cd -r cf5c74390b98 searcher/searchserver/src/CCPixAbstractSearcher.cpp --- a/searcher/searchserver/src/CCPixAbstractSearcher.cpp Tue Jul 06 15:30:04 2010 +0300 +++ b/searcher/searchserver/src/CCPixAbstractSearcher.cpp Wed Aug 18 10:53:26 2010 +0300 @@ -10,7 +10,11 @@ #include "SearchServerHelper.h" #include "CSearchDocument.h" -CCPixAbstractSearcher::~CCPixAbstractSearcher() {} +RArray 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 CCPixAbstractSearcher::ConvertBatchDocumentL( cpix_Document** aDocument, TInt aCount ) + { + // Read first the system fields that are passed as constructor parameters + // + RPointerArray 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(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(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(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( 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( 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; + }