[lc_ldap/_find_id] C'est bien aussi de ne pas oublier qu'il y a des id qui ne sont pas strictement croissant

This commit is contained in:
Valentin Samir 2014-02-24 17:15:40 +01:00
parent 9aa0de6539
commit 172c1935ce

View file

@ -391,33 +391,43 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
def _find_id(self, attr, realm=None): def _find_id(self, attr, realm=None):
'''Trouve un id libre. Si une plage est fournie, cherche '''Trouve un id libre. Si une plage est fournie, cherche
l'id dans celle-ci, sinon, prend le plus élevé possible.''' l'id dans celle-ci, sinon, prend le plus élevé possible.'''
# On essaye de récupérer le dernier id si on l'a déjà vu passé plage = None
try: # On récupère la plage des ids
last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip() if realm != None:
except IOError: plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]])
last_id = 0
# On récupère tous les id plus grand que le dernier que l'on connait # Si plage vaut None, on veux un id strictement croissant
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s>=%s' % (attr, last_id), attrlist = [attr]) if plage is None:
# Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent) # On essaye de récupérer le dernier id si on l'a déjà vu passer
if res == []: try:
last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip()
except IOError:
last_id = 0
# On récupère tous les id plus grand que le dernier que l'on connait
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s>=%s' % (attr, last_id), attrlist = [attr])
# Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent)
if res == []:
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
else:
# On récupère tous les id
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr]) res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
# On extrait seulement les valeurs des id qui nous intêressent # On extrait seulement les valeurs des id qui nous intêressent
nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ]
# On trie pour récupérer le dernier # On trie pour récupérer le dernier
nonfree.sort() nonfree.sort()
try: try:
last_id = nonfree[-1] last_id = nonfree[-1]
except IndexError: except IndexError:
last_id = 0 last_id = 0
# On écrit le nouveau dernier id connu
f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600)
os.write(f, str(last_id))
os.close(f)
plage = None if plage is None:
# On récupère la plage des mids # On écrit le nouveau dernier id connu
if realm != None: f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600)
plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]]) os.write(f, str(last_id))
os.close(f)
if plage != None: if plage != None:
for i in plage: for i in plage: