X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=lib%2Fldb%2Fldb_tdb%2Fldb_tdb.h;h=4d531208da6f00d9ee7909bf4018ea7c287dd571;hp=93cff6727102354c93e9ff45c3637cb6c79fac29;hb=f04bbd3ec39b9d08df7b6b6596823461aa37fedf;hpb=6db809583563652edba377cae395fbdca9e3ebb3 diff --git a/lib/ldb/ldb_tdb/ldb_tdb.h b/lib/ldb/ldb_tdb/ldb_tdb.h index 93cff672710..4d531208da6 100644 --- a/lib/ldb/ldb_tdb/ldb_tdb.h +++ b/lib/ldb/ldb_tdb/ldb_tdb.h @@ -4,9 +4,38 @@ #include "tdb.h" #include "ldb_module.h" +struct ltdb_private; +typedef int (*ldb_kv_traverse_fn)(struct ltdb_private *ltdb, + struct ldb_val key, struct ldb_val data, + void *ctx); + +struct kv_db_ops { + int (*store)(struct ltdb_private *ltdb, struct ldb_val key, struct ldb_val data, int flags); + int (*delete)(struct ltdb_private *ltdb, struct ldb_val key); + int (*iterate)(struct ltdb_private *ltdb, ldb_kv_traverse_fn fn, void *ctx); + int (*update_in_iterate)(struct ltdb_private *ltdb, struct ldb_val key, + struct ldb_val key2, struct ldb_val data, void *ctx); + int (*fetch_and_parse)(struct ltdb_private *ltdb, struct ldb_val key, + int (*parser)(struct ldb_val key, struct ldb_val data, + void *private_data), + void *ctx); + int (*lock_read)(struct ldb_module *); + int (*unlock_read)(struct ldb_module *); + int (*begin_write)(struct ltdb_private *); + int (*prepare_write)(struct ltdb_private *); + int (*abort_write)(struct ltdb_private *); + int (*finish_write)(struct ltdb_private *); + int (*error)(struct ltdb_private *ltdb); + const char * (*errorstr)(struct ltdb_private *ltdb); + const char * (*name)(struct ltdb_private *ltdb); + bool (*has_changed)(struct ltdb_private *ltdb); + bool (*transaction_active)(struct ltdb_private *ltdb); +}; + /* this private structure is used by the ltdb backend in the ldb_context */ struct ltdb_private { + const struct kv_db_ops *kv_ops; TDB_CONTEXT *tdb; unsigned int connect_flags; @@ -20,9 +49,10 @@ struct ltdb_private { struct ldb_message *indexlist; bool one_level_indexes; bool attribute_indexes; + const char *GUID_index_attribute; + const char *GUID_index_dn_component; } *cache; - int in_transaction; bool check_base; bool disallow_dn_filter; @@ -34,6 +64,17 @@ struct ltdb_private { bool warn_reindex; bool read_only; + + bool reindex_failed; + + const struct ldb_schema_syntax *GUID_index_syntax; + + /* + * Maximum index key length. If non zero keys longer than this length + * will be truncated for non unique indexes. Keys for unique indexes + * greater than this length will be rejected. + */ + unsigned max_key_length; }; struct ltdb_context { @@ -54,6 +95,13 @@ struct ltdb_context { int error; }; +struct ltdb_reindex_context { + struct ldb_module *module; + int error; + uint32_t count; +}; + + /* special record types */ #define LTDB_INDEX "@INDEX" #define LTDB_INDEXLIST "@INDEXLIST" @@ -61,6 +109,9 @@ struct ltdb_context { #define LTDB_IDXVERSION "@IDXVERSION" #define LTDB_IDXATTR "@IDXATTR" #define LTDB_IDXONE "@IDXONE" +#define LTDB_IDXDN "@IDXDN" +#define LTDB_IDXGUID "@IDXGUID" +#define LTDB_IDX_DN_GUID "@IDX_DN_GUID" #define LTDB_BASEINFO "@BASEINFO" #define LTDB_OPTIONS "@OPTIONS" #define LTDB_ATTRIBUTES "@ATTRIBUTES" @@ -72,6 +123,11 @@ struct ltdb_context { #define LTDB_MOD_TIMESTAMP "whenChanged" #define LTDB_OBJECTCLASS "objectClass" +/* DB keys */ +#define LTDB_GUID_KEY_PREFIX "GUID=" +#define LTDB_GUID_SIZE 16 +#define LTDB_GUID_KEY_SIZE (LTDB_GUID_SIZE + sizeof(LTDB_GUID_KEY_PREFIX) - 1) + /* The following definitions come from lib/ldb/ldb_tdb/ldb_cache.c */ int ltdb_cache_reload(struct ldb_module *module); @@ -84,18 +140,31 @@ int ltdb_check_at_attributes_values(const struct ldb_val *value); struct ldb_parse_tree; int ltdb_search_indexed(struct ltdb_context *ctx, uint32_t *); -int ltdb_index_add_new(struct ldb_module *module, const struct ldb_message *msg); +int ltdb_index_add_new(struct ldb_module *module, + struct ltdb_private *ltdb, + const struct ldb_message *msg); int ltdb_index_delete(struct ldb_module *module, const struct ldb_message *msg); -int ltdb_index_del_element(struct ldb_module *module, struct ldb_dn *dn, +int ltdb_index_del_element(struct ldb_module *module, + struct ltdb_private *ltdb, + const struct ldb_message *msg, struct ldb_message_element *el); -int ltdb_index_add_element(struct ldb_module *module, struct ldb_dn *dn, +int ltdb_index_add_element(struct ldb_module *module, + struct ltdb_private *ltdb, + const struct ldb_message *msg, struct ldb_message_element *el); -int ltdb_index_del_value(struct ldb_module *module, struct ldb_dn *dn, +int ltdb_index_del_value(struct ldb_module *module, + struct ltdb_private *ltdb, + const struct ldb_message *msg, struct ldb_message_element *el, unsigned int v_idx); int ltdb_reindex(struct ldb_module *module); int ltdb_index_transaction_start(struct ldb_module *module); int ltdb_index_transaction_commit(struct ldb_module *module); int ltdb_index_transaction_cancel(struct ldb_module *module); +int ltdb_key_dn_from_idx(struct ldb_module *module, + struct ltdb_private *ltdb, + TALLOC_CTX *mem_ctx, + struct ldb_dn *dn, + TDB_DATA *tdb_key); /* The following definitions come from lib/ldb/ldb_tdb/ldb_search.c */ @@ -104,6 +173,10 @@ int ltdb_has_wildcard(struct ldb_module *module, const char *attr_name, void ltdb_search_dn1_free(struct ldb_module *module, struct ldb_message *msg); int ltdb_search_dn1(struct ldb_module *module, struct ldb_dn *dn, struct ldb_message *msg, unsigned int unpack_flags); +int ltdb_search_base(struct ldb_module *module, + TALLOC_CTX *mem_ctx, + struct ldb_dn *dn, + struct ldb_dn **ret_dn); int ltdb_search_key(struct ldb_module *module, struct ltdb_private *ltdb, struct TDB_DATA tdb_key, struct ldb_message *msg, @@ -114,21 +187,39 @@ int ltdb_filter_attrs(TALLOC_CTX *mem_ctx, int ltdb_search(struct ltdb_context *ctx); /* The following definitions come from lib/ldb/ldb_tdb/ldb_tdb.c */ -int ltdb_lock_read(struct ldb_module *module); -int ltdb_unlock_read(struct ldb_module *module); /* * Determine if this key could hold a record. We allow the new GUID * index, the old DN index and a possible future ID= */ bool ltdb_key_is_record(TDB_DATA key); -TDB_DATA ltdb_key_dn(struct ldb_module *module, struct ldb_dn *dn); -TDB_DATA ltdb_key_msg(struct ldb_module *module, const struct ldb_message *msg); +TDB_DATA ltdb_key_dn(struct ldb_module *module, TALLOC_CTX *mem_ctx, + struct ldb_dn *dn); +TDB_DATA ltdb_key_msg(struct ldb_module *module, TALLOC_CTX *mem_ctx, + const struct ldb_message *msg); +int ltdb_guid_to_key(struct ldb_module *module, + struct ltdb_private *ltdb, + const struct ldb_val *GUID_val, + TDB_DATA *key); +int ltdb_idx_to_key(struct ldb_module *module, + struct ltdb_private *ltdb, + TALLOC_CTX *mem_ctx, + const struct ldb_val *idx_val, + TDB_DATA *key); +TDB_DATA ltdb_key(struct ldb_module *module, struct ldb_dn *dn); int ltdb_store(struct ldb_module *module, const struct ldb_message *msg, int flgs); int ltdb_modify_internal(struct ldb_module *module, const struct ldb_message *msg, struct ldb_request *req); -int ltdb_delete_noindex(struct ldb_module *module, struct ldb_dn *dn); +int ltdb_delete_noindex(struct ldb_module *module, + const struct ldb_message *msg); int ltdb_err_map(enum TDB_ERROR tdb_code); struct tdb_context *ltdb_wrap_open(TALLOC_CTX *mem_ctx, const char *path, int hash_size, int tdb_flags, int open_flags, mode_t mode, struct ldb_context *ldb); +int init_store(struct ltdb_private *ltdb, const char *name, + struct ldb_context *ldb, const char *options[], + struct ldb_module **_module); + +int ltdb_connect(struct ldb_context *ldb, const char *url, + unsigned int flags, const char *options[], + struct ldb_module **_module);