Changeset 640


Ignore:
Timestamp:
09/11/14 16:09:13 (3 years ago)
Author:
jls17
Message:
  • added chunk-loading for groups (#139)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/work_312/lists/ARGroupList.cpp

    r639 r640  
    8282                        &status) == AR_RETURN_OK) 
    8383                { 
    84                         if (ARGetListEntryWithFields( 
    85                                 &arIn->arControl, 
    86                                 schemaName, 
    87                                 &qualifier, 
    88                                 &fields, 
    89                                 NULL,0,0,0,  // sort, first, max, locale 
    90                                 &values, 
    91                                 0,&status) == AR_RETURN_OK) 
     84                        unsigned int offset = 0; 
     85                        unsigned int numMatches = 0; 
     86 
     87                        do 
    9288                        { 
    93                                 Reserve(values.numItems); 
    94  
    95                                 for (unsigned int row=0; row<values.numItems; ++row) 
     89                                // the matches are just loaded on the first pass 
     90                                unsigned int *numMatchesPtr = (offset == 0 ? &numMatches : NULL); 
     91 
     92                                int callResult = ARGetListEntryWithFields( 
     93                                        &arIn->arControl, 
     94                                        schemaName, 
     95                                        &qualifier, 
     96                                        &fields, 
     97                                        NULL,  // sortList 
     98                                        offset, 
     99                                        0,     // maxRetrieve 
     100                                        0,     // useLocale 
     101                                        &values, 
     102                                        numMatchesPtr, 
     103                                        &status); 
     104 
     105                                if (callResult == AR_RETURN_OK || callResult == AR_RETURN_WARNING) 
    96106                                { 
    97                                         if (values.entryList[row].entryValues->numItems != fields.numItems) 
    98                                                 continue; 
    99  
    100                                         AREntryIdList& entryId = values.entryList[row].entryId; 
    101                                         ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
    102  
    103                                         sortedList.push_back(static_cast<int>(requestId.size())); 
    104                                         requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
    105  
    106                                         StoreEntry(rowValues); 
    107  
    108                                         if (names.size() < requestId.size()) names.resize(requestId.size()); 
    109                                         if (ids.size() < requestId.size()) ids.resize(requestId.size()); 
    110                                         if (longNames.size() < requestId.size()) longNames.resize(requestId.size()); 
    111                                         if (types.size() < requestId.size()) types.resize(requestId.size()); 
    112                                         if (category.size() < requestId.size()) category.resize(requestId.size()); 
    113                                         if (computedQual.size() < requestId.size()) computedQual.resize(requestId.size()); 
    114                                         if (createDate.size() < requestId.size()) createDate.resize(requestId.size()); 
    115                                         if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size()); 
    116                                         while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); } 
    117                                         while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); } 
    118  
    119                                         LOG << "Group '" << names.back() <<"' [OK]" << endl; 
     107                                        // on the first pass reserve space for the expected groups 
     108                                        if (numMatchesPtr != NULL && numMatches > 0) 
     109                                                Reserve(numMatches); 
     110 
     111                                        for (unsigned int row=0; row<values.numItems; ++row) 
     112                                        { 
     113                                                if (values.entryList[row].entryValues->numItems != fields.numItems) 
     114                                                        continue; 
     115 
     116                                                AREntryIdList& entryId = values.entryList[row].entryId; 
     117                                                ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
     118 
     119                                                sortedList.push_back(static_cast<int>(requestId.size())); 
     120                                                requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
     121 
     122                                                StoreEntry(rowValues); 
     123 
     124                                                if (names.size() < requestId.size()) names.resize(requestId.size()); 
     125                                                if (ids.size() < requestId.size()) ids.resize(requestId.size()); 
     126                                                if (longNames.size() < requestId.size()) longNames.resize(requestId.size()); 
     127                                                if (types.size() < requestId.size()) types.resize(requestId.size()); 
     128                                                if (category.size() < requestId.size()) category.resize(requestId.size()); 
     129                                                if (computedQual.size() < requestId.size()) computedQual.resize(requestId.size()); 
     130                                                if (createDate.size() < requestId.size()) createDate.resize(requestId.size()); 
     131                                                if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size()); 
     132                                                while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); } 
     133                                                while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); } 
     134 
     135                                                LOG << "Group '" << names.back() <<"' [OK]" << endl; 
     136                                        } 
     137 
     138                                        // in case the result set is limited by server, load next chunk 
     139                                        if (values.numItems > 0 && callResult == AR_RETURN_WARNING && status.numItems > 0 && status.statusList[0].messageNum == AR_WARN_MAX_ENTRIES_SERVER) 
     140                                        { 
     141                                                offset += values.numItems; 
     142                                        } 
     143                                        else 
     144                                        { 
     145                                                offset = 0; 
     146                                        } 
     147 
     148                                        FreeAREntryListFieldValueList(&values,false); 
     149                                        if (callResult == AR_RETURN_OK) { result = true; } 
    120150                                } 
    121                                 FreeAREntryListFieldValueList(&values,false); 
    122                                 Sort(); 
    123                                 result = true; 
     151                                else // ARGetListEntryWithFields failed 
     152                                { 
     153                                        cerr << BuildMessageAndFreeStatus(status); 
     154                                } 
    124155                        } 
    125                         else // ARGetListEntryWithFields failed 
    126                         { 
    127                                 cerr << BuildMessageAndFreeStatus(status); 
    128                         } 
     156                        while (offset > 0); 
     157                        Sort(); 
    129158                } 
    130159                else // ARLoadARQualifierStruct failed 
Note: See TracChangeset for help on using the changeset viewer.