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);