ctdb-failover: Add failover configuration options
[Samba.git] / lib / ldb / _ldb_text.py
blob65d603bf2deeb004362c38e9588dd1bd0be66eac
1 # Text wrapper for ldb bindings
3 # Copyright (C) 2015 Petr Viktorin <pviktori@redhat.com>
4 # Published under the GNU LGPLv3 or later
6 import sys
7 import functools
9 import ldb
12 def _recursive_encode(obj):
13 if isinstance(obj, bytes):
14 return obj
15 elif isinstance(obj, str):
16 return obj.encode('utf-8')
17 else:
18 return [_recursive_encode(o) for o in obj]
21 class _WrapBase(object):
23 @classmethod
24 def _wrap(cls, wrapped):
25 self = cls.__new__(cls)
26 self._wrapped = wrapped
27 return self
29 def __len__(self):
30 return len(self._wrapped)
32 def __eq__(self, other):
33 if hasattr(other, '_wrapped'):
34 return self._wrapped == other._wrapped
35 else:
36 return self._wrapped == other
38 def __ne__(self, other):
39 if hasattr(other, '_wrapped'):
40 return self._wrapped != other._wrapped
41 else:
42 return self._wrapped != other
44 def __lt__(self, other):
45 if hasattr(other, '_wrapped'):
46 return self._wrapped < other._wrapped
47 else:
48 return self._wrapped < other
50 def __le__(self, other):
51 if hasattr(other, '_wrapped'):
52 return self._wrapped >= other._wrapped
53 else:
54 return self._wrapped >= other
56 def __gt__(self, other):
57 if hasattr(other, '_wrapped'):
58 return self._wrapped > other._wrapped
59 else:
60 return self._wrapped > other
62 def __ge__(self, other):
63 if hasattr(other, '_wrapped'):
64 return self._wrapped >= other._wrapped
65 else:
66 return self._wrapped >= other
68 def __repr__(self):
69 return '%s.text' % repr(self._wrapped)
72 class MessageElementTextWrapper(_WrapBase):
74 """Text interface for a LDB message element"""
76 def __iter__(self):
77 for item in self._wrapped:
78 yield item.decode('utf-8')
80 def __getitem__(self, key):
81 result = self._wrapped[key]
82 if result is None:
83 return None
84 else:
85 return result.decode('utf-8')
87 @property
88 def flags(self):
89 return self._wrapped.flags
91 @property
92 def set_flags(self):
93 return self._wrapped.set_flags
96 _wrap_element = MessageElementTextWrapper._wrap
99 class MessageTextWrapper(_WrapBase):
101 """Text interface for a LDB message"""
103 def __getitem__(self, key):
104 result = self._wrapped[key]
105 if result is None:
106 return None
107 else:
108 return _wrap_element(result)
110 def get(self, *args, **kwargs):
111 result = self._wrapped.get(*args, **kwargs)
112 if isinstance(result, ldb.MessageElement):
113 return _wrap_element(result)
114 elif isinstance(result, bytes):
115 return result.decode('utf-8')
116 else:
117 return result
119 def __setitem__(self, key, item):
120 self._wrapped[key] = _recursive_encode(item)
122 def __delitem__(self, key):
123 del self._wrapped[key]
125 def elements(self):
126 return [_wrap_element(el) for el in self._wrapped.elements()]
128 def items(self):
129 return [(attr, _wrap_element(el)) for attr, el in self._wrapped.items()]
131 @property
132 def keys(self):
133 return self._wrapped.keys
135 @property
136 def remove(self):
137 return self._wrapped.remove
139 @property
140 def add(self):
141 return self._wrapped.add
143 @property
144 def dn(self):
145 return self._wrapped.dn
147 @dn.setter
148 def dn(self, new_value):
149 self._wrapped.dn = new_value