svn commit: samba r15178 - in branches/SAMBA_4_0/source/lib/ldb/swig: .

tpot at samba.org tpot at samba.org
Sun Apr 23 15:30:40 GMT 2006


Author: tpot
Date: 2006-04-23 15:30:40 +0000 (Sun, 23 Apr 2006)
New Revision: 15178

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15178

Log:
Fix ldb function calls after big swig rename.

Add close() methods to Ldb and LdbMessage classes.

Start adding dict interface to LdbMessage.

Modified:
   branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py


Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py	2006-04-23 15:29:25 UTC (rev 15177)
+++ branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py	2006-04-23 15:30:40 UTC (rev 15178)
@@ -22,8 +22,13 @@
 
 from ldb import *
 
-ldb_global_init()
+# Global initialisation
 
+result = ldb_global_init()
+
+if result != 0:
+    raise LdbError, (result, 'ldb_global_init failed')
+
 class LdbError(Exception):
     """An exception raised when a ldb error occurs."""
     pass
@@ -31,29 +36,48 @@
 class LdbMessage:
     """A class representing a ldb message as a Python dictionary."""
     
-    def __init__(self, msg = None):
+    def __init__(self):
+        self.mem_ctx = talloc_init(None)
+        self.msg = ldb_msg_new(self.mem_ctx)
 
-        self._msg = msg
-        if self._msg is None:
-            self._msg = ldb_msg_new(None)
-
     def __del__(self):
-        talloc_free(self._msg)
+        self.close()
 
+    def close(self):
+        if self.mem_ctx is not None:
+            talloc_free(self.mem_ctx)
+            self.mem_ctx = None
+            self.msg = None
+
+    def __getattr__(self, attr):
+        if attr == 'dn':
+            return ldb_dn_linearize(None, self.msg.dn)
+        return self.__dict__[attr]
+
+    def __setattr__(self, attr, value):
+        if attr == 'dn':
+            self.msg.dn = ldb_dn_explode(self.msg, value)
+            return
+        self.__dict__[attr] = value
+        
     def len(self):
-        return self._msg.num_elements
+        return self.msg.num_elements
 
     def __getitem__(self, key):
-        elt = ldb_msg_find_element(self._msg, key)
+
+        elt = ldb_msg_find_element(self.msg, key)
+
         if elt is None:
             raise KeyError, "No such attribute '%s'" % key
+
         return [ldb_val_array_getitem(elt.values, i)
                 for i in range(elt.num_values)]
 
     def __setitem__(self, key, value):
-        result = ldb_msg_add_value(self._msg, key, str(value))
-        if result != LDB_SUCCESS:
-            raise LdbError, (result, ldb.strerror(result))
+        if type(value) in (list, tuple):
+            [ldb_msg_add_value(self.msg, key, v) for v in value]
+        else:
+            ldb_msg_add_value(self.msg, key, value)
     
 class Ldb:
     """A class representing a binding to a ldb file."""
@@ -67,29 +91,35 @@
         result =  ldb_connect(self.ldb_ctx, url, flags, None)
 
         if result != LDB_SUCCESS:
-            raise ldbError, (result, ldb.strerror(result))
+            raise LdbError, (result, ldb_strerror(result))
         
     def __del__(self):
-        ldb.talloc_free(self.mem_ctx)
-        self.mem_ctx = None
-        self.ldb_ctx = None
+        """Called when the object is to be garbage collected."""
+        self.close()
 
+    def close(self):
+        """Close down a ldb."""
+        if self.mem_ctx is not None:
+            talloc_free(self.mem_ctx)
+            self.mem_ctx = None
+            self.ldb_ctx = None
+
     def _ldb_call(self, fn, *args):
         """Call a ldb function with args.  Raise a LdbError exception
         if the function returns a non-zero return value."""
         
         result = fn(*args)
 
-        if result != ldb.LDB_SUCCESS:
-            raise LdbError, (result, ldb.strerror(result))
+        if result != LDB_SUCCESS:
+            raise LdbError, (result, ldb_strerror(result))
 
     def search(self, expression):
         """Search a ldb for a given expression."""
 
-        self._ldb_call(ldb.search, self.ldb_ctx, None, ldb.LDB_SCOPE_DEFAULT,
+        self._ldb_call(ldb_search, self.ldb_ctx, None, LDB_SCOPE_DEFAULT,
                        expression, None);
 
-        return [LdbMessage(ldb.ldb_message_ptr_array_getitem(result.msgs, ndx))
+        return [LdbMessage(ldb_message_ptr_array_getitem(result.msgs, ndx))
                 for ndx in range(result.count)]
 
     def delete(self, dn):
@@ -97,7 +127,7 @@
 
         _dn = ldb_dn_explode(self.ldb_ctx, dn)
 
-        self._ldb_call(ldb.delete, self.ldb_ctx, _dn)
+        self._ldb_call(ldb_delete, self.ldb_ctx, _dn)
 
     def rename(self, olddn, newdn):
         """Rename a dn."""
@@ -105,7 +135,7 @@
         _olddn = ldb_dn_explode(self.ldb_ctx, olddn)
         _newdn = ldb_dn_explode(self.ldb_ctx, newdn)
         
-        self._ldb_call(ldb.rename, self.ldb_ctx, _olddn, _newdn)
+        self._ldb_call(ldb_rename, self.ldb_ctx, _olddn, _newdn)
 
-    def add(self, msg):
-        self._ldb_call(ldb.add, self.ldb_ctx, msg)
+    def add(self, m):
+        self._ldb_call(ldb_add, self.ldb_ctx, m.msg)



More information about the samba-cvs mailing list