Changeset 638


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

Legend:

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

    r637 r638  
    9999                        &status) == AR_RETURN_OK) 
    100100                { 
    101                         if (ARGetListEntryWithFields( 
    102                                 &arIn->arControl, 
    103                                 schemaName, 
    104                                 &qualifier, 
    105                                 &fields, 
    106                                 NULL,0,0,0, 
    107                                 &values, 
    108                                 0,&status) == AR_RETURN_OK) 
    109                         { 
    110                                 Reserve(values.numItems); 
    111  
    112                                 for (unsigned int row=0; row<values.numItems; ++row) 
     101                        unsigned int offset = 0; 
     102                        unsigned int numMatches = 0; 
     103 
     104                        do 
     105                        { 
     106                                // the matches are just loaded on the first pass 
     107                                unsigned int *numMatchesPtr = (offset == 0 ? &numMatches : NULL); 
     108                                 
     109                                int callResult = ARGetListEntryWithFields( 
     110                                        &arIn->arControl, 
     111                                        schemaName, 
     112                                        &qualifier, 
     113                                        &fields, 
     114                                        NULL, /* sortList */ 
     115                                        offset, 
     116                                        0,    /* maxRetrieve */ 
     117                                        0,    /* useLocale */ 
     118                                        &values, 
     119                                        numMatchesPtr, 
     120                                        &status); 
     121 
     122                                if (callResult == AR_RETURN_OK || callResult == AR_RETURN_WARNING) 
    113123                                { 
    114                                         if (values.entryList[row].entryValues->numItems != fields.numItems) 
    115                                                 continue; 
    116  
    117                                         AREntryIdList& entryId = values.entryList[row].entryId; 
    118                                         ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
    119  
    120                                         sortedList.push_back(static_cast<int>(requestId.size())); 
    121                                         requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
    122  
    123                                         StoreEntry(rowValues); 
    124  
    125                                         if (names.size() < requestId.size()) names.resize(requestId.size()); 
    126                                         if (applicationName.size() < requestId.size()) applicationName.resize(requestId.size()); 
    127                                         if (roleId.size() < requestId.size()) roleId.resize(requestId.size()); 
    128                                         if (groupsTest.size() < requestId.size()) groupsTest.resize(requestId.size()); 
    129                                         if (groupsProd.size() < requestId.size()) groupsProd.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 << "Role '" << names.back() <<"' [OK]" << endl;      
     124                                        // on the first pass reserve space for the expected roles 
     125                                        if (numMatchesPtr != NULL && numMatches > 0) 
     126                                                Reserve(numMatches); 
     127 
     128                                        for (unsigned int row=0; row<values.numItems; ++row) 
     129                                        { 
     130                                                if (values.entryList[row].entryValues->numItems != fields.numItems) 
     131                                                        continue; 
     132 
     133                                                AREntryIdList& entryId = values.entryList[row].entryId; 
     134                                                ARFieldValueList& rowValues = *values.entryList[row].entryValues; 
     135 
     136                                                sortedList.push_back(static_cast<int>(requestId.size())); 
     137                                                requestId.push_back((entryId.numItems == 1 ? entryId.entryIdList[0] : "")); 
     138 
     139                                                StoreEntry(rowValues); 
     140 
     141                                                if (names.size() < requestId.size()) names.resize(requestId.size()); 
     142                                                if (applicationName.size() < requestId.size()) applicationName.resize(requestId.size()); 
     143                                                if (roleId.size() < requestId.size()) roleId.resize(requestId.size()); 
     144                                                if (groupsTest.size() < requestId.size()) groupsTest.resize(requestId.size()); 
     145                                                if (groupsProd.size() < requestId.size()) groupsProd.resize(requestId.size()); 
     146                                                if (createDate.size() < requestId.size()) createDate.resize(requestId.size()); 
     147                                                if (modifiedDate.size() < requestId.size()) modifiedDate.resize(requestId.size()); 
     148                                                while (owners.numItems < requestId.size()) { ARZeroMemory(owners.nameList[owners.numItems++]); } 
     149                                                while (changedUsers.numItems < requestId.size()) { ARZeroMemory(changedUsers.nameList[changedUsers.numItems++]); } 
     150 
     151                                                LOG << "Role '" << names.back() <<"' [OK]" << endl;      
     152                                        } 
     153 
     154                                        // in case the result set is limited by server, load next chunk 
     155                                        if (values.numItems > 0 && callResult == AR_RETURN_WARNING && status.numItems > 0 && status.statusList[0].messageNum == AR_WARN_MAX_ENTRIES_SERVER) 
     156                                        { 
     157                                                offset += values.numItems; 
     158                                        } 
     159                                        else 
     160                                        { 
     161                                                offset = 0; 
     162                                        } 
     163 
     164                                        FreeAREntryListFieldValueList(&values,false); 
     165                                        if (callResult == AR_RETURN_OK) { result = true; } 
    136166                                } 
    137                                 FreeAREntryListFieldValueList(&values,false); 
    138                                 Sort(); 
    139                                 result = true; 
    140                         } 
    141                         else // ARGetListEntryWithFields failed 
    142                         { 
    143                                 cerr << BuildMessageAndFreeStatus(status); 
    144                         } 
     167                                else // ARGetListEntryWithFields failed 
     168                                { 
     169                                        cerr << BuildMessageAndFreeStatus(status); 
     170                                        break; 
     171                                } 
     172                        } 
     173                        while (offset > 0); 
     174                        Sort(); 
    145175                } 
    146176                else // ARLoadARQualifierStruct failed 
Note: See TracChangeset for help on using the changeset viewer.