Package ldaptor :: Module numberalloc
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.numberalloc

 1  """Find an available uidNumber/gidNumber/other similar number.""" 
 2   
 3  from ldaptor.protocols import pureldap 
 4   
5 -class freeNumberGuesser:
6 - def __init__(self, makeAGuess, min=None, max=None):
7 self.makeAGuess=makeAGuess 8 self.min=min 9 if self.min is None: 10 self.min=0 11 self.max=max
12
13 - def startGuessing(self):
14 d=self.makeAGuess(self.min) 15 d.addCallback(self._nextGuess, self.min) 16 return d
17
18 - def _nextGuess(self, found, lastGuess):
19 if found: 20 self.min=lastGuess 21 else: 22 self.max=lastGuess 23 24 if self.max==self.min \ 25 or self.max==self.min+1: 26 return self.max 27 28 max=self.max 29 if max is None: 30 max=self.min+1000 31 32 guess=(max+self.min)/2 33 d=self.makeAGuess(guess) 34 d.addCallback(self._nextGuess, guess) 35 return d
36
37 -class ldapGuesser:
38 - def __init__(self, ldapObject, numberType):
39 self.numberType=numberType 40 self.ldapObject=ldapObject
41
42 - def guess(self, num):
43 d=self.ldapObject.search( 44 filterObject=pureldap.LDAPFilter_equalityMatch( 45 attributeDesc=pureldap.LDAPAttributeDescription(value=self.numberType), 46 assertionValue=pureldap.LDAPAssertionValue(value=str(num))), 47 sizeLimit=1) 48 d.addCallback(lambda results: len(results)) 49 return d
50
51 -def getFreeNumber(ldapObject, numberType, min=None, max=None):
52 g=freeNumberGuesser(ldapGuesser(ldapObject, numberType).guess, 53 min=min, max=max) 54 return g.startGuessing()
55