From 807c3d0d9745e850d08ceb2a1d6c018f8b791706 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Thu, 14 Feb 2013 05:58:28 -0500
Subject: [PATCH] Optimmize memory usage by only fetching the necessary attributes used for contacts listing

---
 program/lib/Roundcube/rcube_ldap.php |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php
index 5896690..c3c0533 100644
--- a/program/lib/Roundcube/rcube_ldap.php
+++ b/program/lib/Roundcube/rcube_ldap.php
@@ -193,8 +193,14 @@
         $rcube = rcube::get_instance();
         $this->cache = $rcube->get_cache('LDAP.' . asciiwords($this->prop['name']), 'db', 600);
 
-        // initialize ldap wrapper object
+        // determine which attributes to fetch
         $this->prop['attributes'] = array_merge(array_values($this->fieldmap), $fetch_attributes);
+        $this->prop['list_attributes'] = $fetch_attributes;
+        foreach ($rcube->config->get('contactlist_fields') as $col) {
+            $this->prop['list_attributes'] = array_merge($this->prop['list_attributes'], $this->_map_field($col));
+        }
+
+        // initialize ldap wrapper object
         $this->ldap = new rcube_ldap_generic($this->prop, true);
         $this->ldap->set_cache($this->cache);
 
@@ -567,7 +573,7 @@
             return $group_members;
 
         // read these attributes for all members
-        $attrib = $count ? array('dn','objectClass') : $this->prop['attributes'];
+        $attrib = $count ? array('dn','objectClass') : $this->prop['list_attributes'];
         $attrib[] = 'member';
         $attrib[] = 'uniqueMember';
         $attrib[] = 'memberURL';
@@ -605,15 +611,14 @@
     {
         $group_members = array();
 
-        for ($i=0; $i < $entry['memberurl']['count']; $i++)
-        {
+        for ($i=0; $i < $entry['memberurl']['count']; $i++) {
             // extract components from url
             if (!preg_match('!ldap:///([^\?]+)\?\?(\w+)\?(.*)$!', $entry['memberurl'][$i], $m))
                 continue;
 
             // add search filter if any
             $filter = $this->filter ? '(&(' . $m[3] . ')(' . $this->filter . '))' : $m[3];
-            $attrs = $count ? array('dn','objectClass') : $this->prop['attributes'];
+            $attrs = $count ? array('dn','objectClass') : $this->prop['list_attributes'];
             if ($result = $this->ldap->search($m[1], $filter, $m[2], $attrs, $this->group_data)) {
                 $entries = $result->entries();
                 for ($j = 0; $j < $entries['count']; $j++) {

--
Gitblit v1.9.1