2 ldb database library utility
4 Copyright (C) Matthieu Patou 2009
6 ** NOTE! The following LGPL license applies to the ldb
7 ** library. This does NOT imply that all of Samba is released
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 3 of the License, or (at your option) any later version.
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; if not, see <http://www.gnu.org/licenses/>.
27 * Description: Common function used by ldb_add/ldb_modify/ldb_delete
29 * Author: Matthieu Patou
33 #include "ldb_module.h"
37 /* autostarts a transacion if none active */
38 static int ldb_do_autotransaction(struct ldb_context
*ldb
,
39 struct ldb_request
*req
)
43 ret
= ldb_transaction_start(ldb
);
44 if (ret
!= LDB_SUCCESS
) {
48 ret
= ldb_request(ldb
, req
);
49 if (ret
== LDB_SUCCESS
) {
50 ret
= ldb_wait(req
->handle
, LDB_WAIT_ALL
);
53 if (ret
== LDB_SUCCESS
) {
54 return ldb_transaction_commit(ldb
);
56 ldb_transaction_cancel(ldb
);
58 if (ldb_errstring(ldb
) == NULL
) {
59 /* no error string was setup by the backend */
60 ldb_asprintf_errstring(ldb
, "%s (%d)", ldb_strerror(ret
), ret
);
66 Same as ldb_add but accept control
68 int ldb_add_ctrl(struct ldb_context
*ldb
,
69 const struct ldb_message
*message
,
70 struct ldb_control
**controls
)
72 struct ldb_request
*req
;
75 ret
= ldb_msg_sanity_check(ldb
, message
);
76 if (ret
!= LDB_SUCCESS
) {
80 ret
= ldb_build_add_req(&req
, ldb
, ldb
,
84 ldb_op_default_callback
,
87 if (ret
!= LDB_SUCCESS
) return ret
;
89 /* do request and autostart a transaction */
90 ret
= ldb_do_autotransaction(ldb
, req
);
97 same as ldb_delete but accept control
99 int ldb_delete_ctrl(struct ldb_context
*ldb
, struct ldb_dn
*dn
,
100 struct ldb_control
**controls
)
102 struct ldb_request
*req
;
105 ret
= ldb_build_del_req(&req
, ldb
, ldb
,
109 ldb_op_default_callback
,
112 if (ret
!= LDB_SUCCESS
) return ret
;
114 /* do request and autostart a transaction */
115 ret
= ldb_do_autotransaction(ldb
, req
);
123 same as ldb_modify, but accepts controls
125 int ldb_modify_ctrl(struct ldb_context
*ldb
,
126 const struct ldb_message
*message
,
127 struct ldb_control
**controls
)
129 struct ldb_request
*req
;
132 ret
= ldb_msg_sanity_check(ldb
, message
);
133 if (ret
!= LDB_SUCCESS
) {
137 ret
= ldb_build_mod_req(&req
, ldb
, ldb
,
141 ldb_op_default_callback
,
144 if (ret
!= LDB_SUCCESS
) return ret
;
146 /* do request and autostart a transaction */
147 ret
= ldb_do_autotransaction(ldb
, req
);
155 ldb_search with controls
157 int ldb_search_ctrl(struct ldb_context
*ldb
, TALLOC_CTX
*mem_ctx
,
158 struct ldb_result
**result
, struct ldb_dn
*base
,
159 enum ldb_scope scope
, const char * const *attrs
,
160 struct ldb_control
**controls
,
161 const char *exp_fmt
, ...)
163 struct ldb_request
*req
;
164 struct ldb_result
*res
;
173 res
= talloc_zero(mem_ctx
, struct ldb_result
);
175 return LDB_ERR_OPERATIONS_ERROR
;
179 va_start(ap
, exp_fmt
);
180 expression
= talloc_vasprintf(mem_ctx
, exp_fmt
, ap
);
185 return LDB_ERR_OPERATIONS_ERROR
;
189 ret
= ldb_build_search_req(&req
, ldb
, mem_ctx
,
190 base
?base
:ldb_get_default_basedn(ldb
),
196 ldb_search_default_callback
,
198 ldb_req_set_location(req
, "ldb_search_ctrl");
200 if (ret
!= LDB_SUCCESS
) goto done
;
202 ret
= ldb_request(ldb
, req
);
204 if (ret
== LDB_SUCCESS
) {
205 ret
= ldb_wait(req
->handle
, LDB_WAIT_ALL
);
209 if (ret
!= LDB_SUCCESS
) {
214 talloc_free(expression
);