searcher/searchserver/src/CCPixAbstractSearcher.cpp
author hgs
Wed, 25 Aug 2010 13:17:41 +0530
changeset 16 2729d20a0010
parent 14 8bd192d47aaa
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * CCPixAbstractSearcher.cpp
hgs
parents:
diff changeset
     3
 *
hgs
parents:
diff changeset
     4
 *  Created on: Oct 8, 2009
hgs
parents:
diff changeset
     5
 *      Author: admin
hgs
parents:
diff changeset
     6
 */
hgs
parents:
diff changeset
     7
#include "CCpixAbstractSearcher.h"
hgs
parents:
diff changeset
     8
hgs
parents:
diff changeset
     9
#include "Common.h"
hgs
parents:
diff changeset
    10
#include "SearchServerHelper.h"
hgs
parents:
diff changeset
    11
#include "CSearchDocument.h"
hgs
parents:
diff changeset
    12
14
hgs
parents: 8
diff changeset
    13
RArray<TInt> CCPixAbstractSearcher::docSizeArray;
hgs
parents: 8
diff changeset
    14
hgs
parents: 8
diff changeset
    15
CCPixAbstractSearcher::~CCPixAbstractSearcher() {
hgs
parents: 8
diff changeset
    16
docSizeArray.Close();
hgs
parents: 8
diff changeset
    17
} 
8
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
namespace {
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
/**
hgs
parents:
diff changeset
    23
 * cpix_DocFieldEnum destroyer for TCleanupItem
hgs
parents:
diff changeset
    24
 * @param aCpixDocFieldEnum CPix document
hgs
parents:
diff changeset
    25
 */
hgs
parents:
diff changeset
    26
void CpixDocFieldEnumDestroyer(TAny* aCpixDocFieldEnum)
hgs
parents:
diff changeset
    27
	{
hgs
parents:
diff changeset
    28
	cpix_DocFieldEnum_destroy( static_cast<cpix_DocFieldEnum*>( aCpixDocFieldEnum ) );
hgs
parents:
diff changeset
    29
	}
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
} // namespace
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
CSearchDocument* CCPixAbstractSearcher::ConvertDocumentL( cpix_Document* aDocument )
hgs
parents:
diff changeset
    34
	{
hgs
parents:
diff changeset
    35
	// Read first the system fields that are passed as constructor parameters 
hgs
parents:
diff changeset
    36
	// 
hgs
parents:
diff changeset
    37
	const wchar_t* documentId = cpix_Document_getFieldValue( aDocument, LCPIX_DOCUID_FIELD);
hgs
parents:
diff changeset
    38
	SearchServerHelper::CheckCpixErrorL(aDocument, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    39
	
hgs
parents:
diff changeset
    40
	TPtrC documentIdPtr(KNullDesC);
hgs
parents:
diff changeset
    41
	if (documentId)
hgs
parents:
diff changeset
    42
		documentIdPtr.Set(reinterpret_cast<const TUint16*>(documentId));
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
	const wchar_t* documentAppClass = cpix_Document_getFieldValue(aDocument, LCPIX_APPCLASS_FIELD);
hgs
parents:
diff changeset
    45
	SearchServerHelper::CheckCpixErrorL(aDocument, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    46
	
hgs
parents:
diff changeset
    47
	TPtrC documentAppClassPtr(KNullDesC);
hgs
parents:
diff changeset
    48
	if (documentAppClass)
hgs
parents:
diff changeset
    49
		documentAppClassPtr.Set(reinterpret_cast<const TUint16*>(documentAppClass));
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
	const wchar_t* documentExcerpt = cpix_Document_getFieldValue(aDocument, LCPIX_EXCERPT_FIELD);
hgs
parents:
diff changeset
    52
	SearchServerHelper::CheckCpixErrorL(aDocument, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    53
	
hgs
parents:
diff changeset
    54
	TPtrC documentExcerptPtr(KNullDesC);
hgs
parents:
diff changeset
    55
	if (documentExcerpt)
hgs
parents:
diff changeset
    56
		documentExcerptPtr.Set(reinterpret_cast<const TUint16*>(documentExcerpt));
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
	// Setup the document
hgs
parents:
diff changeset
    59
	// 
hgs
parents:
diff changeset
    60
	
hgs
parents:
diff changeset
    61
	CSearchDocument* document = CSearchDocument::NewLC(documentIdPtr, documentAppClassPtr, documentExcerptPtr);
hgs
parents:
diff changeset
    62
	
hgs
parents:
diff changeset
    63
	// Enumerate the field of cpix_Document and add each of them 
hgs
parents:
diff changeset
    64
	// into the CSearchDocument object. 
hgs
parents:
diff changeset
    65
	// 
hgs
parents:
diff changeset
    66
	
hgs
parents:
diff changeset
    67
	cpix_DocFieldEnum* docFieldEnum = cpix_Document_fields(aDocument);
hgs
parents:
diff changeset
    68
	SearchServerHelper::CheckCpixErrorL(aDocument, KErrDocumentAccessFailed);
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	CleanupStack::PushL( TCleanupItem(CpixDocFieldEnumDestroyer, docFieldEnum) ); 
hgs
parents:
diff changeset
    71
	
hgs
parents:
diff changeset
    72
	cpix_Field field;
hgs
parents:
diff changeset
    73
	while (cpix_DocFieldEnum_hasMore(docFieldEnum))
hgs
parents:
diff changeset
    74
		{
hgs
parents:
diff changeset
    75
		cpix_DocFieldEnum_next(docFieldEnum, &field);
hgs
parents:
diff changeset
    76
		SearchServerHelper::CheckCpixErrorL(docFieldEnum, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    77
		
hgs
parents:
diff changeset
    78
		const wchar_t* name = cpix_Field_name(&field);
hgs
parents:
diff changeset
    79
		SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
		TPtrC namePtr( reinterpret_cast<const TUint16*>( name ) );
hgs
parents:
diff changeset
    82
		if (    namePtr == TPtrC( (TUint16*)LCPIX_DOCUID_FIELD )
hgs
parents:
diff changeset
    83
			 || namePtr == TPtrC( (TUint16*)LCPIX_APPCLASS_FIELD )
hgs
parents:
diff changeset
    84
			 || namePtr == TPtrC( (TUint16*)LCPIX_EXCERPT_FIELD ) )
hgs
parents:
diff changeset
    85
			{
hgs
parents:
diff changeset
    86
			continue;  // These fields have already been added
hgs
parents:
diff changeset
    87
			}
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
		const wchar_t* value = cpix_Field_stringValue(&field);
hgs
parents:
diff changeset
    90
		SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
hgs
parents:
diff changeset
    91
		
hgs
parents:
diff changeset
    92
		TPtrC stringvalue( reinterpret_cast<const TUint16*>( value ) );
hgs
parents:
diff changeset
    93
		
hgs
parents:
diff changeset
    94
		// NOTE: Also system fields will be iterated. Because  
hgs
parents:
diff changeset
    95
		//       the field name is not checked, all _appclass,
hgs
parents:
diff changeset
    96
		//       _excerpt etc. fields  will be overwritten. 
hgs
parents:
diff changeset
    97
		document->AddFieldL(namePtr, stringvalue);
hgs
parents:
diff changeset
    98
		}
hgs
parents:
diff changeset
    99
	
14
hgs
parents: 8
diff changeset
   100
	CleanupStack::PopAndDestroy(docFieldEnum);	
8
hgs
parents:
diff changeset
   101
	CleanupStack::Pop(document);
14
hgs
parents: 8
diff changeset
   102
	delete aDocument;
8
hgs
parents:
diff changeset
   103
	return document;
hgs
parents:
diff changeset
   104
	}
14
hgs
parents: 8
diff changeset
   105
	
16
hgs
parents: 14
diff changeset
   106
RPointerArray<CSearchDocument> CCPixAbstractSearcher::ConvertBatchDocumentL( cpix_Document**& aDocument, TInt aCount )
14
hgs
parents: 8
diff changeset
   107
	{
hgs
parents: 8
diff changeset
   108
	// Read first the system fields that are passed as constructor parameters 
hgs
parents: 8
diff changeset
   109
	//
hgs
parents: 8
diff changeset
   110
    RPointerArray<CSearchDocument> docArray;
hgs
parents: 8
diff changeset
   111
    docSizeArray.Reset();    
hgs
parents: 8
diff changeset
   112
    //docArray.Reset(); // delete each element
hgs
parents: 8
diff changeset
   113
    
hgs
parents: 8
diff changeset
   114
    for( TInt i= 0;i< aCount;i++ )
hgs
parents: 8
diff changeset
   115
        {
hgs
parents: 8
diff changeset
   116
        cpix_Document* nextDocument = aDocument[i];
hgs
parents: 8
diff changeset
   117
        
hgs
parents: 8
diff changeset
   118
        if( nextDocument->ptr_ )
hgs
parents: 8
diff changeset
   119
            {
hgs
parents: 8
diff changeset
   120
            const wchar_t* documentId = cpix_Document_getFieldValue( nextDocument, LCPIX_DOCUID_FIELD);
hgs
parents: 8
diff changeset
   121
            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   122
            
hgs
parents: 8
diff changeset
   123
            TPtrC documentIdPtr(KNullDesC);
hgs
parents: 8
diff changeset
   124
            if (documentId)
hgs
parents: 8
diff changeset
   125
                documentIdPtr.Set(reinterpret_cast<const TUint16*>(documentId));
hgs
parents: 8
diff changeset
   126
        
hgs
parents: 8
diff changeset
   127
            const wchar_t* documentAppClass = cpix_Document_getFieldValue(nextDocument, LCPIX_APPCLASS_FIELD);
hgs
parents: 8
diff changeset
   128
            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   129
            
hgs
parents: 8
diff changeset
   130
            TPtrC documentAppClassPtr(KNullDesC);
hgs
parents: 8
diff changeset
   131
            if (documentAppClass)
hgs
parents: 8
diff changeset
   132
                documentAppClassPtr.Set(reinterpret_cast<const TUint16*>(documentAppClass));
hgs
parents: 8
diff changeset
   133
        
hgs
parents: 8
diff changeset
   134
            const wchar_t* documentExcerpt = cpix_Document_getFieldValue(nextDocument, LCPIX_EXCERPT_FIELD);
hgs
parents: 8
diff changeset
   135
            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   136
            
hgs
parents: 8
diff changeset
   137
            TPtrC documentExcerptPtr(KNullDesC);
hgs
parents: 8
diff changeset
   138
            if (documentExcerpt)
hgs
parents: 8
diff changeset
   139
                documentExcerptPtr.Set(reinterpret_cast<const TUint16*>(documentExcerpt));
hgs
parents: 8
diff changeset
   140
        
hgs
parents: 8
diff changeset
   141
            // Setup the document
hgs
parents: 8
diff changeset
   142
            // 
hgs
parents: 8
diff changeset
   143
            
hgs
parents: 8
diff changeset
   144
            CSearchDocument* document = CSearchDocument::NewLC(documentIdPtr, documentAppClassPtr, documentExcerptPtr);
hgs
parents: 8
diff changeset
   145
            
hgs
parents: 8
diff changeset
   146
            // Enumerate the field of cpix_Document and add each of them 
hgs
parents: 8
diff changeset
   147
            // into the CSearchDocument object. 
hgs
parents: 8
diff changeset
   148
            // 
hgs
parents: 8
diff changeset
   149
            
hgs
parents: 8
diff changeset
   150
            cpix_DocFieldEnum* docFieldEnum = cpix_Document_fields(nextDocument);
hgs
parents: 8
diff changeset
   151
            SearchServerHelper::CheckCpixErrorL(nextDocument, KErrDocumentAccessFailed);
hgs
parents: 8
diff changeset
   152
        
hgs
parents: 8
diff changeset
   153
            CleanupStack::PushL( TCleanupItem(CpixDocFieldEnumDestroyer, docFieldEnum) ); 
hgs
parents: 8
diff changeset
   154
            
hgs
parents: 8
diff changeset
   155
            cpix_Field field;
hgs
parents: 8
diff changeset
   156
            while (cpix_DocFieldEnum_hasMore(docFieldEnum))
hgs
parents: 8
diff changeset
   157
                {
hgs
parents: 8
diff changeset
   158
                cpix_DocFieldEnum_next(docFieldEnum, &field);
hgs
parents: 8
diff changeset
   159
                SearchServerHelper::CheckCpixErrorL(docFieldEnum, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   160
                
hgs
parents: 8
diff changeset
   161
                const wchar_t* name = cpix_Field_name(&field);
hgs
parents: 8
diff changeset
   162
                SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   163
        
hgs
parents: 8
diff changeset
   164
                TPtrC namePtr( reinterpret_cast<const TUint16*>( name ) );
hgs
parents: 8
diff changeset
   165
                if (    namePtr == TPtrC( (TUint16*)LCPIX_DOCUID_FIELD )
hgs
parents: 8
diff changeset
   166
                     || namePtr == TPtrC( (TUint16*)LCPIX_APPCLASS_FIELD )
hgs
parents: 8
diff changeset
   167
                     || namePtr == TPtrC( (TUint16*)LCPIX_EXCERPT_FIELD ) )
hgs
parents: 8
diff changeset
   168
                    {
hgs
parents: 8
diff changeset
   169
                    continue;  // These fields have already been added
hgs
parents: 8
diff changeset
   170
                    }
hgs
parents: 8
diff changeset
   171
        
hgs
parents: 8
diff changeset
   172
                const wchar_t* value = cpix_Field_stringValue(&field);
hgs
parents: 8
diff changeset
   173
                SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed);
hgs
parents: 8
diff changeset
   174
                
hgs
parents: 8
diff changeset
   175
                TPtrC stringvalue( reinterpret_cast<const TUint16*>( value ) );
hgs
parents: 8
diff changeset
   176
                
hgs
parents: 8
diff changeset
   177
                // NOTE: Also system fields will be iterated. Because  
hgs
parents: 8
diff changeset
   178
                //       the field name is not checked, all _appclass,
hgs
parents: 8
diff changeset
   179
                //       _excerpt etc. fields  will be overwritten. 
hgs
parents: 8
diff changeset
   180
                document->AddFieldL(namePtr, stringvalue);
hgs
parents: 8
diff changeset
   181
                }	
hgs
parents: 8
diff changeset
   182
            CleanupStack::PopAndDestroy(docFieldEnum);	
hgs
parents: 8
diff changeset
   183
            CleanupStack::Pop(document);
hgs
parents: 8
diff changeset
   184
            docSizeArray.AppendL( document->Size());
16
hgs
parents: 14
diff changeset
   185
            docArray.AppendL( document );                                  
14
hgs
parents: 8
diff changeset
   186
            }
16
hgs
parents: 14
diff changeset
   187
        delete nextDocument;
hgs
parents: 14
diff changeset
   188
        nextDocument = NULL;
14
hgs
parents: 8
diff changeset
   189
        }
hgs
parents: 8
diff changeset
   190
	delete aDocument;
hgs
parents: 8
diff changeset
   191
	aDocument = NULL;
hgs
parents: 8
diff changeset
   192
	return docArray;
hgs
parents: 8
diff changeset
   193
	}