On ajoute de la paresse dans la transformation des attributs ldap en attributs python.

Cela permets d'économiser de la mémoire lorsque l'on manipule un nombre important d'objet
This commit is contained in:
Valentin Samir 2013-04-01 22:17:27 +02:00
parent cda292dcdb
commit db32b1d65a
2 changed files with 27 additions and 11 deletions

View file

@ -90,6 +90,22 @@ def attrify(val, attr, ldif, conn, ctxt_check = True):
else: else:
return CRANS_ATTRIBUTES.get(attr, Attr)(val, ldif, conn, ctxt_check) return CRANS_ATTRIBUTES.get(attr, Attr)(val, ldif, conn, ctxt_check)
class AttrsDict(dict) :
def __init__(self, conn, ldif = {}, check_ctxt = True):
super(AttrsDict, self).__init__(ldif)
self._conn = conn
self._ldif = ldif
self._check_ctxt = check_ctxt
def __getitem__(self, attr):
values = super(AttrsDict, self).__getitem__(attr)
if not isinstance(values, list):
values = [ values ]
values = [ attrify(unicode(val, 'utf-8'), attr, self._ldif, self._conn, self._check_ctxt) for val in values]
self[attr] = values
return values
class Attr(object): class Attr(object):
"""Objet représentant un attribut. """Objet représentant un attribut.

View file

@ -206,7 +206,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
elif (dn.startswith('aid=') or dn.startswith('cid=') or dn == base_dn) and not parent.has_key(dn): elif (dn.startswith('aid=') or dn.startswith('cid=') or dn == base_dn) and not parent.has_key(dn):
parent[dn] = new_cransldapobject(self, dn, ldif = attrs) parent[dn] = new_cransldapobject(self, dn, ldif = attrs)
allmachines = [] allmachines = []
for dn,mlist in machines.items(): # on associe propriétaires et machines for dn,mlist in machines.iteritems(): # on associe propriétaires et machines
parent[dn]._machines = mlist parent[dn]._machines = mlist
for m in mlist: for m in mlist:
m._proprio = parent[dn] m._proprio = parent[dn]
@ -452,8 +452,8 @@ class CransLdapObject(object):
self.mode = mode self.mode = mode
self.attrs = {} # Contient un dico uldif qui doit représenter ce qui self.attrs = attributs.AttrsDict(conn) # Contient un dico uldif qui doit représenter ce qui
# est dans la base # est dans la base. On attrify paresseusement au moment où on utilise un attribut
self._modifs = None # C'est là qu'on met les modifications self._modifs = None # C'est là qu'on met les modifications
@ -464,10 +464,10 @@ class CransLdapObject(object):
orig = {} orig = {}
if ldif: if ldif:
self.attrs = ldif
if dn != base_dn: # new_cransldapobject ne donne pas de ldif formaté et utilise un ldif non formaté, donc on formate if dn != base_dn: # new_cransldapobject ne donne pas de ldif formaté et utilise un ldif non formaté, donc on formate
self.attrs = ldif_to_uldif(self.attrs) self.attrs = attributs.AttrsDict(conn, ldif, check_ctxt = False)
self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) else:
self.attrs = ldif
self._modifs = ldif_to_uldif(ldif) self._modifs = ldif_to_uldif(ldif)
self._modifs = ldif_to_cldif(self._modifs, conn, check_ctxt = False) self._modifs = ldif_to_cldif(self._modifs, conn, check_ctxt = False)
orig = ldif orig = ldif
@ -476,15 +476,15 @@ class CransLdapObject(object):
res = conn.search_s(dn, 0) res = conn.search_s(dn, 0)
if not res: if not res:
raise ValueError ('objet inexistant: %s' % dn) raise ValueError ('objet inexistant: %s' % dn)
self.dn, self.attrs = res[0] self.dn, res_attrs = res[0]
# L'objet sortant de la base ldap, on ne fait pas de vérifications sur
# l'état des données.
self.attrs = attributs.AttrsDict(conn, res_attrs, check_ctxt = False)
# Pour test en cas de mode w ou rw # Pour test en cas de mode w ou rw
orig = res[0][1] orig = res[0][1]
self.attrs = ldif_to_uldif(self.attrs)
# L'objet sortant de la base ldap, on ne fait pas de vérifications sur
# l'état des données.
self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False)
self._modifs = ldif_to_cldif(ldif_to_uldif(res[0][1]), conn, check_ctxt = False) self._modifs = ldif_to_cldif(ldif_to_uldif(res[0][1]), conn, check_ctxt = False)
# Je m'interroge sur la pertinence de cette partie, je pense qu'elle n'est # Je m'interroge sur la pertinence de cette partie, je pense qu'elle n'est