r14968: Move tdb and ldb swig wrappers in to lib/tdb and lib/ldb directories.
[bbaumbach/samba-autobuild/.git] / source4 / lib / ldb / swig / ldb.i
1 /* 
2    Unix SMB/CIFS implementation.
3
4    Swig interface to ldb.
5
6    Copyright (C) 2005,2006 Tim Potter <tpot@samba.org>
7    Copyright (C) 2006 Simo Sorce <idra@samba.org>
8
9      ** NOTE! The following LGPL license applies to the ldb
10      ** library. This does NOT imply that all of Samba is released
11      ** under the LGPL
12    
13    This library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Lesser General Public
15    License as published by the Free Software Foundation; either
16    version 2 of the License, or (at your option) any later version.
17
18    This library is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    Lesser General Public License for more details.
22
23    You should have received a copy of the GNU Lesser General Public
24    License along with this library; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 */
27
28 %module ldb
29
30 %{
31
32 /* Some typedefs to help swig along */
33
34 typedef unsigned char uint8_t;
35 typedef unsigned long long uint64_t;
36 typedef long long int64_t;
37
38 /* Include headers */
39
40 #include "lib/ldb/include/ldb.h"
41 #include "lib/talloc/talloc.h"
42
43 %}
44
45 %include "carrays.i"
46 %include "exception.i"
47
48 /* 
49  * Wrap struct ldb_context
50  */
51
52 /* The ldb functions will crash if a NULL ldb context is passed so
53    catch this before it happens. */
54
55 %typemap(check) struct ldb_context* {
56         if ($1 == NULL)
57                 SWIG_exception(SWIG_ValueError, 
58                         "ldb context must be non-NULL");
59 }
60
61 /* 
62  * Wrap TALLOC_CTX
63  */
64
65 /* Use talloc_init() to create a parameter to pass to ldb_init().  Don't
66    forget to free it using talloc_free() afterwards. */
67
68 TALLOC_CTX *talloc_init(char *name);
69 int talloc_free(TALLOC_CTX *ptr);
70
71 /*
72  * Wrap struct ldb_val
73  */
74
75 %typemap(in) struct ldb_val {
76         if (!PyString_Check($input)) {
77                 PyErr_SetString(PyExc_TypeError, "string arg expected");
78                 return NULL;
79         }
80         $1.length = PyString_Size($input);
81         $1.data = PyString_AsString($input);
82 }
83
84 %typemap(out) struct ldb_val {
85         if ($1.data == NULL && $1.length == 0) {
86                 $result = Py_None;
87         } else {
88                 $result = PyString_FromStringAndSize($1.data, $1.length);
89         }
90 }
91
92 enum ldb_scope {LDB_SCOPE_DEFAULT=-1, 
93                 LDB_SCOPE_BASE=0, 
94                 LDB_SCOPE_ONELEVEL=1,
95                 LDB_SCOPE_SUBTREE=2};
96
97 /*
98  * Wrap struct ldb_result
99  */
100
101 %typemap(in, numinputs=0) struct ldb_result **OUT (struct ldb_result *temp_ldb_result) {
102         $1 = &temp_ldb_result;
103 }
104
105 %typemap(argout) struct ldb_result ** {
106
107         /* XXX: Check result for error and throw exception if necessary */
108
109         resultobj = SWIG_NewPointerObj(*$1, SWIGTYPE_p_ldb_result, 0);
110 }       
111
112 %types(struct ldb_result *);
113
114 /*
115  * Wrap struct ldb_dn
116  */
117
118 %typemap(in) struct ldb_dn * {
119         if ($input == Py_None) {
120                 $1 = NULL;
121         } else if (!PyString_Check($input)) {
122                 PyErr_SetString(PyExc_TypeError, "string arg expected");
123                 return NULL;
124         } else {
125                 $1 = ldb_dn_explode(NULL, PyString_AsString($input));
126         }
127 }
128
129 %typemap(out) struct ldb_dn * {
130         $result = PyString_FromString(ldb_dn_linearize($1, $1));
131 }
132
133 /*
134  * Wrap struct ldb_message_element
135  */
136
137 %array_functions(struct ldb_val, ldb_val_array);
138
139 struct ldb_message_element {
140         unsigned int flags;
141         const char *name;
142         unsigned int num_values;
143         struct ldb_val *values;
144 };
145
146 /*
147  * Wrap struct ldb_message
148  */
149
150 %array_functions(struct ldb_message_element, ldb_message_element_array);
151
152 struct ldb_message {
153         struct ldb_dn *dn;
154         unsigned int num_elements;
155         struct ldb_message_element *elements;
156         void *private_data; /* private to the backend */
157 };
158
159 %typemap(in) struct ldb_message * {
160         PyObject *obj, *key, *value;
161         int pos;
162
163         $1 = ldb_msg_new(NULL);
164
165         obj = PyObject_GetAttrString($input, "dn");
166         $1->dn = ldb_dn_explode(NULL, PyString_AsString(obj));
167
168         obj = PyObject_GetAttrString($input, "private_data");
169         $1->private_data = PyString_AsString(obj);
170
171         obj = PyObject_GetAttrString($input, "elements");
172
173         pos = 0;
174         while (PyDict_Next(obj, &pos, &key, &value)) {
175                 struct ldb_val v;
176
177                 v.data = PyString_AsString(value);
178                 v.length = PyString_Size(value);
179                 ldb_msg_add_value($1, PyString_AsString(key), &v);
180         }
181 }
182
183 /*
184  * Wrap struct ldb_result
185  */
186
187 %array_functions(struct ldb_message *, ldb_message_ptr_array);
188
189 struct ldb_result {
190         unsigned int count;
191         struct ldb_message **msgs;
192         char **refs;
193         struct ldb_control **controls;
194 };
195
196 /*
197  * Wrap ldb functions 
198  */
199
200 %rename ldb_init init;
201 struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx);
202
203 %rename ldb_errstring errstring;
204 const char *ldb_errstring(struct ldb_context *ldb);
205
206 %rename ldb_connect connect;
207 int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]);
208
209 %rename ldb_search search;
210 int ldb_search(struct ldb_context *ldb, const struct ldb_dn *base, enum ldb_scope scope, const char *expression, const char * const *attrs, struct ldb_result **OUT);
211
212 %rename ldb_delete delete;
213 int ldb_delete(struct ldb_context *ldb, const struct ldb_dn *dn);
214
215 %rename ldb_rename rename;
216 int ldb_rename(struct ldb_context *ldb, const struct ldb_dn *olddn, const struct ldb_dn *newdn);
217
218 %rename ldb_add add;
219 int ldb_add(struct ldb_context *ldb, const struct ldb_message *message);