On 27 January 2016 at 22:41, sebb AT ASF <[email protected]> wrote:
> On 27 January 2016 at 22:35, Sebastian Bazley <[email protected]> wrote:
>> Commit 6c30425b44a9b9bc3a25312b4c8afda20ec412e2:
>> Add Service preload
>>
>>
>> Branch: refs/heads/master
>> Author: Sebb <[email protected]>
>> Committer: Sebb <[email protected]>
>> Pusher: sebb <[email protected]>
>>
>> ------------------------------------------------------------
>> lib/whimsy/asf/ldap.rb | +++++++++++ -
>> ------------------------------------------------------------
>> 24 changes: 22 additions, 2 deletions.
>> ------------------------------------------------------------
>>
>>
>> diff --git a/lib/whimsy/asf/ldap.rb b/lib/whimsy/asf/ldap.rb
>> index a9e2503..11686f0 100644
>> --- a/lib/whimsy/asf/ldap.rb
>> +++ b/lib/whimsy/asf/ldap.rb
>> @@ -456,9 +456,29 @@ def dn
>> "cn=#{id},#{self.class.base}"
>> end
>>
>> + def self.preload
>> + Hash[ASF.search_one(base, "cn=*", %w(dn member modifyTimestamp)).map
>> do |results|
>> + cn = results['dn'].first[/^cn=(.*?),/, 1]
>> + service = ASF::Service.find(cn)
>> + service.modifyTimestamp = results['modifyTimestamp'].first # it is
>> returned as an array of 1 entry
>> + members = results['member'] || []
>> + service.members = members
>
> Note that Group does this instead:
>
> members = results['memberUid']
> group.members = members || []
>
> However it seemed to me that one would want members to be the same as
> group.members, so the alternate should be on the previous line
> - or have I misunderstood?
>
> Note that Committee.preload does not currently check for null -
> perhaps it should ?
See commit
90ca560
Turned out it is necessary to set members to the empty array,
otherwise we don't cache groups with no members.
This is because LDAP search returns no data for empty groups.
>> + [service, members]
>> + end]
>> + end
>> +
>> + attr_accessor :modifyTimestamp
>> +
>> + def members=(members)
>> + @members = WeakRef.new(members)
>> + end
>> +
>> def members
>> - ASF.search_one(base, "cn=#{name}", 'member').flatten.
>> - map {|uid| Person.find uid[/uid=(.*?),/,1]}
>> + members = weakref(:members) do
>> + ASF.search_one(base, "cn=#{name}", 'member').flatten
>> + end
>> +
>> + members.map {|uid| Person.find uid[/uid=(.*?),/,1]}
>> end
>>
>> def remove(people)