From e4173acd69254b950dfeb7663e83a8e338f5df18 Mon Sep 17 00:00:00 2001 From: stroeder Date: Wed, 23 Nov 2011 17:27:46 +0000 Subject: [PATCH] Fixed lock acquire() and release() to use the same lock instance --- Lib/ldap/functions.py | 132 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 Lib/ldap/functions.py diff --git a/Lib/ldap/functions.py b/Lib/ldap/functions.py new file mode 100644 index 0000000..03157fe --- /dev/null +++ b/Lib/ldap/functions.py @@ -0,0 +1,132 @@ +""" +functions.py - wraps functions of module _ldap + +See http://www.python-ldap.org/ for details. + +\$Id: functions.py,v 1.28 2011/11/23 17:27:46 stroeder Exp $ + +Compability: +- Tested with Python 2.0+ but should work with Python 1.5.x +- functions should behave exactly the same like in _ldap + +Usage: +Directly imported by ldap/__init__.py. The symbols of _ldap are +overridden. + +Thread-lock: +Basically calls into the LDAP lib are serialized by the module-wide +lock _ldapmodule_lock. +""" + +from ldap import __version__ + +__all__ = [ + 'open','initialize','init', + 'explode_dn','explode_rdn', + 'get_option','set_option', +] + +import sys,pprint,_ldap,ldap + +from ldap import LDAPError + +from ldap.dn import explode_dn,explode_rdn + +from ldap.ldapobject import LDAPObject + +if __debug__: + # Tracing is only supported in debugging mode + import traceback + + +def _ldap_function_call(lock,func,*args,**kwargs): + """ + Wrapper function which locks and logs calls to function + + lock + Instance of threading.Lock or compatible + func + Function to call with arguments passed in via *args and **kwargs + """ + if lock: + lock.acquire() + if __debug__: + if ldap._trace_level>=1: + ldap._trace_file.write('*** %s.%s %s\n' % ( + '_ldap',func.__name__, + pprint.pformat((args,kwargs)) + )) + if ldap._trace_level>=9: + traceback.print_stack(limit=ldap._trace_stack_limit,file=ldap._trace_file) + try: + try: + result = func(*args,**kwargs) + finally: + if lock: + lock.release() + except LDAPError,e: + if __debug__ and ldap._trace_level>=2: + ldap._trace_file.write('=> LDAPError: %s\n' % (str(e))) + raise + if __debug__ and ldap._trace_level>=2: + ldap._trace_file.write('=> result:\n%s\n' % (pprint.pformat(result))) + return result + + +def initialize(uri,trace_level=0,trace_file=sys.stdout,trace_stack_limit=None): + """ + Return LDAPObject instance by opening LDAP connection to + LDAP host specified by LDAP URL + + Parameters: + uri + LDAP URL containing at least connection scheme and hostport, + e.g. ldap://localhost:389 + trace_level + If non-zero a trace output of LDAP calls is generated. + trace_file + File object where to write the trace output to. + Default is to use stdout. + """ + return LDAPObject(uri,trace_level,trace_file,trace_stack_limit) + + +def open(host,port=389,trace_level=0,trace_file=sys.stdout,trace_stack_limit=None): + """ + Return LDAPObject instance by opening LDAP connection to + specified LDAP host + + Parameters: + host + LDAP host and port, e.g. localhost + port + integer specifying the port number to use, e.g. 389 + trace_level + If non-zero a trace output of LDAP calls is generated. + trace_file + File object where to write the trace output to. + Default is to use stdout. + """ + import warnings + warnings.warn('ldap.open() is deprecated! Use ldap.initialize() instead.', DeprecationWarning,2) + return initialize('ldap://%s:%d' % (host,port),trace_level,trace_file,trace_stack_limit) + +init = open + + +def get_option(option): + """ + get_option(name) -> value + + Get the value of an LDAP global option. + """ + return _ldap_function_call(None,_ldap.get_option,option) + + +def set_option(option,invalue): + """ + set_option(name, value) + + Set the value of an LDAP global option. + """ + return _ldap_function_call(None,_ldap.set_option,option,invalue)