4 Copyright (C) Andrew Tridgell 2004
5 Copyright (C) Stefan Metzmacher 2004
8 ** NOTE! The following LGPL license applies to the ldb
9 ** library. This does NOT imply that all of Samba is released
12 This library is free software; you can redistribute it and/or
13 modify it under the terms of the GNU Lesser General Public
14 License as published by the Free Software Foundation; either
15 version 2 of the License, or (at your option) any later version.
17 This library is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 Lesser General Public License for more details.
22 You should have received a copy of the GNU Lesser General Public
23 License along with this library; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 * Component: ldb tdb backend
32 * Description: core functions for tdb backend
34 * Author: Andrew Tridgell
35 * Author: Stefan Metzmacher
39 #include "ldb/include/ldb.h"
40 #include "ldb/include/ldb_private.h"
41 #include "ldb/ldb_tdb/ldb_tdb.h"
43 #define LDBLOCK "INT_LDBLOCK"
47 casefold a dn. We need to uppercase the attribute names, and the
48 attribute values of case insensitive attributes. We also need to remove
49 extraneous spaces between elements
51 static char *ltdb_dn_fold(struct ldb_module *module, const char *dn)
53 const char *dn_orig = dn;
54 struct ldb_context *ldb = module->ldb;
55 TALLOC_CTX *tmp_ctx = talloc_new(ldb);
59 ret = talloc_strdup(tmp_ctx, "");
60 if (ret == NULL) goto failed;
62 while ((len = strcspn(dn, ",")) > 0) {
63 char *p = strchr(dn, '=');
67 if (p == NULL || (p-dn) > len) goto failed;
69 attr = talloc_strndup(tmp_ctx, dn, p-dn);
70 if (attr == NULL) goto failed;
72 /* trim spaces from the attribute name */
73 while (' ' == *attr) attr++;
74 while (' ' == attr[strlen(attr)-1]) {
75 attr[strlen(attr)-1] = 0;
77 if (*attr == 0) goto failed;
79 value = talloc_strndup(tmp_ctx, p+1, len-(p+1-dn));
80 if (value == NULL) goto failed;
82 /* trim spaces from the value */
83 while (' ' == *value) value++;
84 while (' ' == value[strlen(value)-1]) {
85 value[strlen(value)-1] = 0;
87 if (*value == 0) goto failed;
89 flags = ltdb_attribute_flags(module, attr);
91 attr = ldb_casefold(ldb, attr);
92 if (attr == NULL) goto failed;
93 talloc_steal(tmp_ctx, attr);
95 if (flags & LTDB_FLAG_CASE_INSENSITIVE) {
96 value = ldb_casefold(ldb, value);
97 if (value == NULL) goto failed;
98 talloc_steal(tmp_ctx, value);
101 if (dn[len] == ',') {
102 ret = talloc_asprintf_append(ret, "%s=%s,", attr, value);
104 ret = talloc_asprintf_append(ret, "%s=%s", attr, value);
106 if (ret == NULL) goto failed;
109 if (*dn == ',') dn++;
112 talloc_steal(ldb, ret);
113 talloc_free(tmp_ctx);
117 talloc_free(tmp_ctx);
118 return ldb_casefold(ldb, dn_orig);
122 form a TDB_DATA for a record key
125 note that the key for a record can depend on whether the
126 dn refers to a case sensitive index record or not
128 struct TDB_DATA ltdb_key(struct ldb_module *module, const char *dn)
130 struct ldb_context *ldb = module->ldb;
132 char *key_str = NULL;
133 char *dn_folded = NULL;
134 const char *prefix = LTDB_INDEX ":";
139 most DNs are case insensitive. The exception is index DNs for
140 case sensitive attributes
142 there are 3 cases dealt with in this code:
144 1) if the dn doesn't start with @INDEX: then uppercase the attribute
145 names and the attributes values of case insensitive attributes
146 2) if the dn starts with @INDEX:attr and 'attr' is a case insensitive
147 attribute then uppercase whole dn
148 3) if the dn starts with @INDEX:attr and 'attr' is a case sensitive
149 attribute then uppercase up to the value of the attribute, but
152 if (strncmp(dn, prefix, strlen(prefix)) == 0 &&
153 (s = strchr(dn+strlen(prefix), ':'))) {
154 char *attr_name, *attr_name_folded;
155 attr_name = talloc_strndup(ldb, dn+strlen(prefix), (s-(dn+strlen(prefix))));
159 flags = ltdb_attribute_flags(module, attr_name);
161 if (flags & LTDB_FLAG_CASE_INSENSITIVE) {
162 dn_folded = ldb_casefold(ldb, dn);
164 attr_name_folded = ldb_casefold(ldb, attr_name);
165 if (!attr_name_folded) {
168 dn_folded = talloc_asprintf(ldb, "%s:%s:%s",
169 prefix, attr_name_folded,
171 talloc_free(attr_name_folded);
173 talloc_free(attr_name);
175 dn_folded = ltdb_dn_fold(module, dn);
182 key_str = talloc_asprintf(ldb, "DN=%s", dn_folded);
183 talloc_free(dn_folded);
190 key.dsize = strlen(key_str)+1;
202 lock the database for write - currently a single lock is used
204 static int ltdb_lock(struct ldb_module *module, const char *lockname)
206 struct ltdb_private *ltdb = module->private_data;
210 if (lockname == NULL) {
214 key = ltdb_key(module, lockname);
219 ret = tdb_chainlock(ltdb->tdb, key);
221 talloc_free(key.dptr);
227 unlock the database after a ltdb_lock()
229 static int ltdb_unlock(struct ldb_module *module, const char *lockname)
231 struct ltdb_private *ltdb = module->private_data;
234 if (lockname == NULL) {
238 key = ltdb_key(module, lockname);
243 tdb_chainunlock(ltdb->tdb, key);
245 talloc_free(key.dptr);
252 lock the database for read - use by ltdb_search
254 int ltdb_lock_read(struct ldb_module *module)
256 struct ltdb_private *ltdb = module->private_data;
259 key = ltdb_key(module, LDBLOCK);
263 ret = tdb_chainlock_read(ltdb->tdb, key);
264 talloc_free(key.dptr);
269 unlock the database after a ltdb_lock_read()
271 int ltdb_unlock_read(struct ldb_module *module)
273 struct ltdb_private *ltdb = module->private_data;
275 key = ltdb_key(module, LDBLOCK);
279 tdb_chainunlock_read(ltdb->tdb, key);
280 talloc_free(key.dptr);
286 we've made a modification to a dn - possibly reindex and
287 update sequence number
289 static int ltdb_modified(struct ldb_module *module, const char *dn)
293 if (strcmp(dn, LTDB_INDEXLIST) == 0 ||
294 strcmp(dn, LTDB_ATTRIBUTES) == 0) {
295 ret = ltdb_reindex(module);
299 strcmp(dn, LTDB_BASEINFO) != 0) {
300 ret = ltdb_increase_sequence_number(module);
307 store a record into the db
309 int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flgs)
311 struct ltdb_private *ltdb = module->private_data;
312 TDB_DATA tdb_key, tdb_data;
315 tdb_key = ltdb_key(module, msg->dn);
320 ret = ltdb_pack_data(module, msg, &tdb_data);
322 talloc_free(tdb_key.dptr);
326 ret = tdb_store(ltdb->tdb, tdb_key, tdb_data, flgs);
331 ret = ltdb_index_add(module, msg);
333 tdb_delete(ltdb->tdb, tdb_key);
337 talloc_free(tdb_key.dptr);
338 talloc_free(tdb_data.dptr);
345 add a record to the database
347 static int ltdb_add(struct ldb_module *module, const struct ldb_message *msg)
349 struct ltdb_private *ltdb = module->private_data;
352 ltdb->last_err_string = NULL;
354 if (ltdb_lock(module, LDBLOCK) != 0) {
358 if (ltdb_cache_load(module) != 0) {
359 ltdb_unlock(module, LDBLOCK);
363 ret = ltdb_store(module, msg, TDB_INSERT);
366 ltdb_modified(module, msg->dn);
369 ltdb_unlock(module, LDBLOCK);
375 delete a record from the database, not updating indexes (used for deleting
378 int ltdb_delete_noindex(struct ldb_module *module, const char *dn)
380 struct ltdb_private *ltdb = module->private_data;
384 tdb_key = ltdb_key(module, dn);
389 ret = tdb_delete(ltdb->tdb, tdb_key);
390 talloc_free(tdb_key.dptr);
396 delete a record from the database
398 static int ltdb_delete(struct ldb_module *module, const char *dn)
400 struct ltdb_private *ltdb = module->private_data;
402 struct ldb_message *msg = NULL;
404 ltdb->last_err_string = NULL;
406 if (ltdb_lock(module, LDBLOCK) != 0) {
410 if (ltdb_cache_load(module) != 0) {
414 msg = talloc(module, struct ldb_message);
419 /* in case any attribute of the message was indexed, we need
420 to fetch the old record */
421 ret = ltdb_search_dn1(module, dn, msg);
423 /* not finding the old record is an error */
427 ret = ltdb_delete_noindex(module, dn);
432 /* remove any indexed attributes */
433 ret = ltdb_index_del(module, msg);
436 ltdb_modified(module, dn);
440 ltdb_unlock(module, LDBLOCK);
445 ltdb_unlock(module, LDBLOCK);
451 find an element by attribute name. At the moment this does a linear search, it should
452 be re-coded to use a binary search once all places that modify records guarantee
455 return the index of the first matching element if found, otherwise -1
457 static int find_element(const struct ldb_message *msg, const char *name)
460 for (i=0;i<msg->num_elements;i++) {
461 if (ldb_attr_cmp(msg->elements[i].name, name) == 0) {
470 add an element to an existing record. Assumes a elements array that we
471 can call re-alloc on, and assumed that we can re-use the data pointers from the
472 passed in additional values. Use with care!
474 returns 0 on success, -1 on failure (and sets errno)
476 static int msg_add_element(struct ldb_context *ldb,
477 struct ldb_message *msg, struct ldb_message_element *el)
479 struct ldb_message_element *e2;
482 e2 = talloc_realloc(msg, msg->elements, struct ldb_message_element,
483 msg->num_elements+1);
491 e2 = &msg->elements[msg->num_elements];
494 e2->flags = el->flags;
496 if (el->num_values != 0) {
497 e2->values = talloc_array(msg->elements, struct ldb_val, el->num_values);
503 for (i=0;i<el->num_values;i++) {
504 e2->values[i] = el->values[i];
506 e2->num_values = el->num_values;
514 delete all elements having a specified attribute name
516 static int msg_delete_attribute(struct ldb_module *module,
517 struct ldb_context *ldb,
518 struct ldb_message *msg, const char *name)
522 for (i=0;i<msg->num_elements;i++) {
523 if (ldb_attr_cmp(msg->elements[i].name, name) == 0) {
524 for (j=0;j<msg->elements[i].num_values;j++) {
525 ltdb_index_del_value(module, msg->dn, &msg->elements[i], j);
527 talloc_free(msg->elements[i].values);
528 if (msg->num_elements > (i+1)) {
529 memmove(&msg->elements[i],
531 sizeof(struct ldb_message_element)*
532 (msg->num_elements - (i+1)));
536 msg->elements = talloc_realloc(msg, msg->elements,
537 struct ldb_message_element,
546 delete all elements matching an attribute name/value
548 return 0 on success, -1 on failure
550 static int msg_delete_element(struct ldb_module *module,
551 struct ldb_message *msg,
553 const struct ldb_val *val)
555 struct ldb_context *ldb = module->ldb;
558 struct ldb_message_element *el;
560 found = find_element(msg, name);
565 el = &msg->elements[found];
567 for (i=0;i<el->num_values;i++) {
568 if (ltdb_val_equal(module, msg->elements[i].name, &el->values[i], val)) {
569 if (i<el->num_values-1) {
570 memmove(&el->values[i], &el->values[i+1],
571 sizeof(el->values[i])*(el->num_values-(i+1)));
574 if (el->num_values == 0) {
575 return msg_delete_attribute(module, ldb, msg, name);
586 modify a record - internal interface
588 yuck - this is O(n^2). Luckily n is usually small so we probably
589 get away with it, but if we ever have really large attribute lists
590 then we'll need to look at this again
592 int ltdb_modify_internal(struct ldb_module *module, const struct ldb_message *msg)
594 struct ldb_context *ldb = module->ldb;
595 struct ltdb_private *ltdb = module->private_data;
596 TDB_DATA tdb_key, tdb_data;
597 struct ldb_message *msg2;
601 tdb_key = ltdb_key(module, msg->dn);
606 tdb_data = tdb_fetch(ltdb->tdb, tdb_key);
607 if (!tdb_data.dptr) {
608 talloc_free(tdb_key.dptr);
612 msg2 = talloc(tdb_key.dptr, struct ldb_message);
614 talloc_free(tdb_key.dptr);
618 ret = ltdb_unpack_data(module, &tdb_data, msg2);
620 talloc_free(tdb_key.dptr);
629 for (i=0;i<msg->num_elements;i++) {
630 struct ldb_message_element *el = &msg->elements[i];
631 struct ldb_message_element *el2;
632 struct ldb_val *vals;
634 switch (msg->elements[i].flags & LDB_FLAG_MOD_MASK) {
636 case LDB_FLAG_MOD_ADD:
637 /* add this element to the message. fail if it
639 ret = find_element(msg2, el->name);
642 if (msg_add_element(ldb, msg2, el) != 0) {
648 el2 = &msg2->elements[ret];
650 /* An attribute with this name already exists, add all
651 * values if they don't already exist. */
653 for (j=0;j<el->num_values;j++) {
654 if (ldb_msg_find_val(el2, &el->values[j])) {
655 ltdb->last_err_string =
656 "Type or value exists";
661 vals = talloc_realloc(msg2->elements, el2->values, struct ldb_val,
662 el2->num_values + el->num_values);
667 for (j=0;j<el->num_values;j++) {
668 vals[el2->num_values + j] =
669 ldb_val_dup(vals, &el->values[j]);
673 el2->num_values += el->num_values;
677 case LDB_FLAG_MOD_REPLACE:
678 /* replace all elements of this attribute name with the elements
679 listed. The attribute not existing is not an error */
680 msg_delete_attribute(module, ldb, msg2, msg->elements[i].name);
682 /* add the replacement element, if not empty */
683 if (msg->elements[i].num_values != 0 &&
684 msg_add_element(ldb, msg2, &msg->elements[i]) != 0) {
689 case LDB_FLAG_MOD_DELETE:
690 /* we could be being asked to delete all
691 values or just some values */
692 if (msg->elements[i].num_values == 0) {
693 if (msg_delete_attribute(module, ldb, msg2,
694 msg->elements[i].name) != 0) {
695 ltdb->last_err_string = "No such attribute";
700 for (j=0;j<msg->elements[i].num_values;j++) {
701 if (msg_delete_element(module,
703 msg->elements[i].name,
704 &msg->elements[i].values[j]) != 0) {
705 ltdb->last_err_string = "No such attribute";
708 if (ltdb_index_del_value(module, msg->dn, &msg->elements[i], j) != 0) {
716 /* we've made all the mods - save the modified record back into the database */
717 ret = ltdb_store(module, msg2, TDB_MODIFY);
719 talloc_free(tdb_key.dptr);
724 talloc_free(tdb_key.dptr);
732 static int ltdb_modify(struct ldb_module *module, const struct ldb_message *msg)
734 struct ltdb_private *ltdb = module->private_data;
737 ltdb->last_err_string = NULL;
739 if (ltdb_lock(module, LDBLOCK) != 0) {
743 if (ltdb_cache_load(module) != 0) {
744 ltdb_unlock(module, LDBLOCK);
748 ret = ltdb_modify_internal(module, msg);
751 ltdb_modified(module, msg->dn);
754 ltdb_unlock(module, LDBLOCK);
762 static int ltdb_rename(struct ldb_module *module, const char *olddn, const char *newdn)
764 struct ltdb_private *ltdb = module->private_data;
766 struct ldb_message *msg;
767 const char *error_str;
769 ltdb->last_err_string = NULL;
771 if (ltdb_lock(module, LDBLOCK) != 0) {
775 msg = talloc(module, struct ldb_message);
780 /* in case any attribute of the message was indexed, we need
781 to fetch the old record */
782 ret = ltdb_search_dn1(module, olddn, msg);
784 /* not finding the old record is an error */
788 msg->dn = talloc_strdup(msg, newdn);
793 ret = ltdb_add(module, msg);
798 ret = ltdb_delete(module, olddn);
799 error_str = ltdb->last_err_string;
801 ltdb_delete(module, newdn);
804 ltdb->last_err_string = error_str;
807 ltdb_unlock(module, LDBLOCK);
813 ltdb_unlock(module, LDBLOCK);
819 return extended error information
821 static const char *ltdb_errstring(struct ldb_module *module)
823 struct ltdb_private *ltdb = module->private_data;
824 if (ltdb->last_err_string) {
825 return ltdb->last_err_string;
827 return tdb_errorstr(ltdb->tdb);
831 static const struct ldb_module_ops ltdb_ops = {
845 destroy the ltdb context
847 static int ltdb_destructor(void *p)
849 struct ltdb_private *ltdb = p;
850 tdb_close(ltdb->tdb);
855 connect to the database
857 struct ldb_context *ltdb_connect(const char *url,
859 const char *options[])
862 int tdb_flags, open_flags;
863 struct ltdb_private *ltdb;
865 struct ldb_context *ldb;
867 ldb = talloc_zero(NULL, struct ldb_context);
874 if (strchr(url, ':')) {
875 if (strncmp(url, "tdb://", 6) != 0) {
885 tdb_flags = TDB_DEFAULT;
887 if (flags & LDB_FLG_RDONLY) {
888 open_flags = O_RDONLY;
890 open_flags = O_CREAT | O_RDWR;
893 /* note that we use quite a large default hash size */
894 tdb = tdb_open(path, 10000, tdb_flags, open_flags, 0666);
900 ltdb = talloc_zero(ldb, struct ltdb_private);
909 ltdb->sequence_number = 0;
911 talloc_set_destructor(ltdb, ltdb_destructor);
913 ldb->modules = talloc(ldb, struct ldb_module);
919 ldb->modules->ldb = ldb;
920 ldb->modules->prev = ldb->modules->next = NULL;
921 ldb->modules->private_data = ltdb;
922 ldb->modules->ops = <db_ops;