Changeset 642


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

Legend:

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

    r641 r642  
    8787                        FreeARStatusList(&status, false); 
    8888 
    89                         if (ARGetListEntryWithFields( 
    90                                 &arIn->arControl, 
    91                                 schemaName, 
    92                                 &qualifier, 
    93                                 &fields, 
    94                                 NULL,0,0,0, // sort, first, max, locale, 
    95                                 &values, 
    96                                 0,&status) == AR_RETURN_OK) 
     89                        unsigned int offset = 0; 
     90                        unsigned int numMatches = 0; 
     91 
     92                        do 
    9793                        { 
    98                                 Reserve(values.numItems); 
    99  
    100                                 for (unsigned int row=0; row<values.numItems; ++row) 
     94                                // the matches are just loaded on the first pass 
     95                                unsigned int *numMatchesPtr = (offset == 0 ? &numMatches : NULL); 
     96 
     97                                int callResult = ARGetListEntryWithFields( 
     98                                        &arIn->arControl, 
     99                                        schemaName, 
     100                                        &qualifier, 
     101                                        &fields, 
     102                                        NULL,  // sortList 
     103                                        offset, 
     104                                        0,     // maxRetrieve 
     105                                        0,     // useLocale 
     106                                        &values, 
     107                                        numMatchesPtr, 
     108                                        &status); 
     109 
     110                                if (callResult == AR_RETURN_OK || callResult == AR_RETURN_WARNING) 
    101111                                { 
    102                                         if (values.entryList[row].entryValues->numItems != fields.numItems) 
    103                                                 continue; 
    104  
    105                                         AREntryIdList& entryId = values.entryList[row].entryId; 
    106                                         ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
    107  
    108                                         sortedList.push_back(static_cast<int>(requestId.size())); 
    109                                         requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
    110                                          
    111                                         StoreEntry(rowValues); 
    112                                          
    113                                         // check count and fill-up any missing array items 
    114                                         if (names.size() < requestId.size()) names.resize(requestId.size()); 
    115                                         if (email.size() < requestId.size()) email.resize(requestId.size()); 
    116                                         if (group.size() < requestId.size()) group.resize(requestId.size()); 
    117                                         if (fullName.size() < requestId.size()) fullName.resize(requestId.size()); 
    118                                         if (defaultNotify.size() < requestId.size()) defaultNotify.resize(requestId.size()); 
    119                                         if (licType.size() < requestId.size()) licType.resize(requestId.size()); 
    120                                         if (ftLicType.size() < requestId.size()) ftLicType.resize(requestId.size()); 
    121                                         if (createDate.size() < requestId.size()) createDate.resize(requestId.size()); 
    122                                         if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size()); 
    123                                         while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); } 
    124                                         while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); } 
    125                                          
    126                                         LOG << "User '" << names.back() <<"' [OK]" << endl; 
     112                                        // on the first pass reserve space for the expected users 
     113                                        if (numMatchesPtr != NULL && numMatches > 0) 
     114                                                Reserve(numMatches); 
     115 
     116                                        for (unsigned int row=0; row<values.numItems; ++row) 
     117                                        { 
     118                                                if (values.entryList[row].entryValues->numItems != fields.numItems) 
     119                                                        continue; 
     120 
     121                                                AREntryIdList& entryId = values.entryList[row].entryId; 
     122                                                ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
     123 
     124                                                sortedList.push_back(static_cast<int>(requestId.size())); 
     125                                                requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
     126                                                 
     127                                                StoreEntry(rowValues); 
     128                                                 
     129                                                // check count and fill-up any missing array items 
     130                                                if (names.size() < requestId.size()) names.resize(requestId.size()); 
     131                                                if (email.size() < requestId.size()) email.resize(requestId.size()); 
     132                                                if (group.size() < requestId.size()) group.resize(requestId.size()); 
     133                                                if (fullName.size() < requestId.size()) fullName.resize(requestId.size()); 
     134                                                if (defaultNotify.size() < requestId.size()) defaultNotify.resize(requestId.size()); 
     135                                                if (licType.size() < requestId.size()) licType.resize(requestId.size()); 
     136                                                if (ftLicType.size() < requestId.size()) ftLicType.resize(requestId.size()); 
     137                                                if (createDate.size() < requestId.size()) createDate.resize(requestId.size()); 
     138                                                if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size()); 
     139                                                while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); } 
     140                                                while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); } 
     141                                                 
     142                                                LOG << "User '" << names.back() <<"' [OK]" << endl; 
     143                                        } 
     144 
     145                                        // in case the result set is limited by server, load next chunk 
     146                                        if (values.numItems > 0 && callResult == AR_RETURN_WARNING && status.numItems > 0 && status.statusList[0].messageNum == AR_WARN_MAX_ENTRIES_SERVER) 
     147                                        { 
     148                                                offset += values.numItems; 
     149                                        } 
     150                                        else 
     151                                        { 
     152                                                offset = 0; 
     153                                        } 
     154 
     155                                        FreeAREntryListFieldValueList(&values,false); 
     156                                        if (callResult == AR_RETURN_OK) { result = true; } 
    127157                                } 
    128                                 FreeAREntryListFieldValueList(&values,false); 
    129                                 Sort(); 
    130                                 result = true; 
     158                                else // ARGetListEntryWithFields failed 
     159                                { 
     160                                        cerr << BuildMessageAndFreeStatus(status); 
     161                                } 
    131162                        } 
    132                         else // ARGetListEntryWithFields failed 
    133                         { 
    134                                 cerr << BuildMessageAndFreeStatus(status); 
    135                         } 
     163                        while (offset > 0); 
    136164                        FreeARQualifierStruct(&qualifier, false); 
     165                        Sort(); 
    137166                } 
    138167                else // ARLoadARQualifierStruct failed 
Note: See TracChangeset for help on using the changeset viewer.