diff --git a/lc_ldap.py b/lc_ldap.py index 6309e1b..e2f74df 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -420,24 +420,10 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): # On récupère tous les id 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 - nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] - # On trie pour récupérer le dernier - nonfree.sort() - - try: - last_id = nonfree[-1] - except IndexError: - last_id = 0 - - if plage is None: - # 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) - - if plage != None: + # On extrait seulement les valeurs des id qui nous intêressent, dans un set + # car on n'a pas besoin de trier et que et que i in set c'est O(1) contre O(n) pour les list + nonfree = set(int(r[1].get(attr)[0]) for r in res if r[1].get(attr)) for i in plage: if i in nonfree: continue @@ -456,6 +442,20 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' % (attr, plage[0], i)) else: + # On extrait seulement les valeurs des id qui nous intêressent dans une liste + nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] + # On trie pour récupérer le dernier + nonfree.sort() + try: + last_id = nonfree[-1] + except IndexError: + 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) + i = last_id + 1 while True: try: