proto-back-ldbm.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. /** BEGIN COPYRIGHT BLOCK
  2. * This Program is free software; you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation; version 2 of the License.
  5. *
  6. * This Program is distributed in the hope that it will be useful, but WITHOUT
  7. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  8. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  9. *
  10. * You should have received a copy of the GNU General Public License along with
  11. * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
  12. * Place, Suite 330, Boston, MA 02111-1307 USA.
  13. *
  14. * In addition, as a special exception, Red Hat, Inc. gives You the additional
  15. * right to link the code of this Program with code not covered under the GNU
  16. * General Public License ("Non-GPL Code") and to distribute linked combinations
  17. * including the two, subject to the limitations in this paragraph. Non-GPL Code
  18. * permitted under this exception must only link to the code of this Program
  19. * through those well defined interfaces identified in the file named EXCEPTION
  20. * found in the source code files (the "Approved Interfaces"). The files of
  21. * Non-GPL Code may instantiate templates or use macros or inline functions from
  22. * the Approved Interfaces without causing the resulting work to be covered by
  23. * the GNU General Public License. Only Red Hat, Inc. may make changes or
  24. * additions to the list of Approved Interfaces. You must obey the GNU General
  25. * Public License in all respects for all of the Program code and other code used
  26. * in conjunction with the Program except the Non-GPL Code covered by this
  27. * exception. If you modify this file, you may extend this exception to your
  28. * version of the file, but you are not obligated to do so. If you do not wish to
  29. * provide this exception without modification, you must delete this exception
  30. * statement from your version and license this file solely under the GPL without
  31. * exception.
  32. *
  33. *
  34. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  35. * Copyright (C) 2005 Red Hat, Inc.
  36. * Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
  37. * All rights reserved.
  38. * END COPYRIGHT BLOCK **/
  39. #ifdef HAVE_CONFIG_H
  40. # include <config.h>
  41. #endif
  42. #ifndef _PROTO_BACK_LDBM
  43. #define _PROTO_BACK_LDBM
  44. /*
  45. * attr.c
  46. */
  47. struct attrinfo * attrinfo_new();
  48. void attrinfo_delete(struct attrinfo **pp);
  49. void ainfo_get( backend *be, char *type, struct attrinfo **at );
  50. void attr_masks( backend *be, char *type, int *indexmask,
  51. int *syntaxmask );
  52. void attr_masks_ex( backend *be, char *type, int *indexmask,
  53. int *syntaxmask, struct attrinfo **at );
  54. void attr_index_config( backend *be, char *fname, int lineno,
  55. int argc, char **argv, int init );
  56. int ldbm_compute_init();
  57. void attrinfo_deletetree(ldbm_instance *inst);
  58. void attr_create_empty(backend *be,char *type,struct attrinfo **ai);
  59. /*
  60. * cache.c
  61. */
  62. int cache_init(struct cache *cache, size_t maxsize, long maxentries, int type);
  63. void cache_clear(struct cache *cache, int type);
  64. void cache_destroy_please(struct cache *cache, int type);
  65. void cache_set_max_size(struct cache *cache, size_t bytes, int type);
  66. void cache_set_max_entries(struct cache *cache, long entries);
  67. size_t cache_get_max_size(struct cache *cache);
  68. long cache_get_max_entries(struct cache *cache);
  69. void cache_get_stats(struct cache *cache, PRUint64 *hits, PRUint64 *tries,
  70. long *entries,long *maxentries,
  71. size_t *size, size_t *maxsize);
  72. void cache_debug_hash(struct cache *cache, char **out);
  73. int cache_remove(struct cache *cache, void *e);
  74. void cache_return(struct cache *cache, void **bep);
  75. struct backentry *cache_find_dn(struct cache *cache, const char *dn, unsigned long ndnlen);
  76. struct backentry *cache_find_id(struct cache *cache, ID id);
  77. struct backentry *cache_find_uuid(struct cache *cache, const char *uuid);
  78. int cache_add(struct cache *cache, void *ptr, void **alt);
  79. int cache_add_tentative(struct cache *cache, struct backentry *e,
  80. struct backentry **alt);
  81. int cache_lock_entry(struct cache *cache, struct backentry *e);
  82. void cache_unlock_entry(struct cache *cache, struct backentry *e);
  83. int cache_replace(struct cache *cache, void *oldptr, void *newptr);
  84. Hashtable *new_hash(u_long size, u_long offset, HashFn hfn,
  85. HashTestFn tfn);
  86. int add_hash(Hashtable *ht, void *key, size_t keylen, void *entry,
  87. void **alt);
  88. int find_hash(Hashtable *ht, const void *key, size_t keylen, void **entry);
  89. int remove_hash(Hashtable *ht, const void *key, size_t keylen);
  90. struct backdn *dncache_find_id(struct cache *cache, ID id);
  91. /*
  92. * dblayer.c
  93. */
  94. int dblayer_init(struct ldbminfo *li);
  95. int dblayer_terminate(struct ldbminfo *li);
  96. int dblayer_start(struct ldbminfo *li, int dbmode);
  97. int dblayer_flush(struct ldbminfo *li );
  98. int dblayer_close(struct ldbminfo *li, int dbmode );
  99. void dblayer_pre_close(struct ldbminfo *li);
  100. int dblayer_post_close(struct ldbminfo *li, int dbmode );
  101. int dblayer_instance_close(backend *be);
  102. int dblayer_get_index_file(backend *be,struct attrinfo *a, DB** ppDB, int create);
  103. int dblayer_release_index_file(backend *be,struct attrinfo *a, DB* pDB);
  104. int dblayer_erase_index_file(backend *be, struct attrinfo *a, int no_force_chkpt);
  105. int dblayer_erase_index_file_nolock(backend *be, struct attrinfo *a, int no_force_chkpt);
  106. int dblayer_get_id2entry(backend *be, DB **ppDB);
  107. int dblayer_release_id2entry(backend *be, DB *pDB);
  108. int dblayer_get_aux_id2entry(backend *be, DB **ppDB, DB_ENV **ppEnv, char **path);
  109. int dblayer_get_aux_id2entry_ext(backend *be, DB **ppDB, DB_ENV **ppEnv, char **path, int flags);
  110. int dblayer_release_aux_id2entry(backend *be, DB *pDB, DB_ENV *pEnv);
  111. int dblayer_txn_init(struct ldbminfo *li, back_txn *txn);
  112. int dblayer_txn_begin(struct ldbminfo *li,back_txnid parent_txn, back_txn *txn);
  113. int dblayer_txn_commit(struct ldbminfo *li, back_txn *txn);
  114. int dblayer_txn_abort(struct ldbminfo *li, back_txn *txn);
  115. int dblayer_read_txn_abort(struct ldbminfo *li, back_txn *txn);
  116. int dblayer_read_txn_begin(struct ldbminfo *li,back_txnid parent_txn, back_txn *txn);
  117. int dblayer_read_txn_commit(struct ldbminfo *li, back_txn *txn);
  118. size_t dblayer_get_optimal_block_size(struct ldbminfo *li);
  119. void dblayer_unlock_backend(backend *be);
  120. void dblayer_lock_backend(backend *be);
  121. int dblayer_plugin_begin(Slapi_PBlock *pb);
  122. int dblayer_plugin_commit(Slapi_PBlock *pb);
  123. int dblayer_plugin_abort(Slapi_PBlock *pb);
  124. int dblayer_memp_stat(struct ldbminfo *li, DB_MPOOL_STAT **gsp,DB_MPOOL_FSTAT ***fsp);
  125. int dblayer_memp_stat_instance(ldbm_instance *inst, DB_MPOOL_STAT **gsp, DB_MPOOL_FSTAT ***fsp);
  126. int dblayer_backup(struct ldbminfo *li, char *destination_directory,
  127. Slapi_Task *task);
  128. int dblayer_restore(struct ldbminfo *li, char* source_directory, Slapi_Task *task, char *bename);
  129. int dblayer_copy_directory(struct ldbminfo *li, Slapi_Task *task,
  130. char *instance_dir, char *destination_dir,
  131. int restore, int *cnt, int instance_dir_flag,
  132. int indexonly, int resetlsns);
  133. int dblayer_copyfile(char* source, char * destination, int overwrite, int mode);
  134. int dblayer_delete_instance_dir(backend *be);
  135. int dblayer_delete_database(struct ldbminfo *li);
  136. int dblayer_database_size(struct ldbminfo *li, unsigned int *size);
  137. int dblayer_terminate(struct ldbminfo *li);
  138. int dblayer_close_indexes(backend *be);
  139. int dblayer_open_file(backend *be, char* indexname, int create, struct attrinfo *ai, DB **ppDB);
  140. int dblayer_close_file(DB *db);
  141. void dblayer_sys_pages(size_t *pagesize, size_t *pages, size_t *procpages, size_t *availpages);
  142. int dblayer_is_cachesize_sane(size_t *cachesize);
  143. void dblayer_remember_disk_filled(struct ldbminfo *li);
  144. int dblayer_open_huge_file(const char *path, int oflag, int mode);
  145. int dblayer_instance_start(backend *be, int normal_mode);
  146. int dblayer_make_new_instance_data_dir(backend *be);
  147. int dblayer_get_instance_data_dir(backend *be);
  148. char *dblayer_strerror(int error);
  149. PRInt64 db_atol(char *str, int *err);
  150. PRInt64 db_atoi(char *str, int *err);
  151. unsigned long db_strtoul(const char *str, int *err);
  152. int dblayer_set_batch_transactions(void *arg, void *value, char *errorbuf, int phase, int apply);
  153. void *dblayer_get_batch_transactions(void *arg);
  154. int dblayer_in_import(ldbm_instance *inst);
  155. int dblayer_update_db_ext(ldbm_instance *inst, char *oldext, char *newext);
  156. void dblayer_set_recovery_required(struct ldbminfo *li);
  157. char *dblayer_get_home_dir(struct ldbminfo *li, int *dbhome);
  158. char *dblayer_get_full_inst_dir(struct ldbminfo *li, ldbm_instance *inst,
  159. char *buf, int buflen);
  160. int check_and_set_import_cache(struct ldbminfo *li);
  161. int dblayer_db_uses_locking(DB_ENV *db_env);
  162. int dblayer_db_uses_transactions(DB_ENV *db_env);
  163. int dblayer_db_uses_mpool(DB_ENV *db_env);
  164. int dblayer_db_uses_logging(DB_ENV *db_env);
  165. int dblayer_bt_compare(DB *db, const DBT *dbt1, const DBT *dbt2);
  166. int dblayer_remove_env(struct ldbminfo *li);
  167. int ldbm_back_get_info(Slapi_Backend *be, int cmd, void **info);
  168. int ldbm_back_set_info(Slapi_Backend *be, int cmd, void *info);
  169. int ldbm_back_ctrl_info(Slapi_Backend *be, int cmd, void *info);
  170. /*
  171. * dn2entry.c
  172. */
  173. struct backentry *dn2entry(Slapi_Backend *be, const Slapi_DN *sdn, back_txn *txn, int *err);
  174. struct backentry *dn2entry_ext(Slapi_Backend *be, const Slapi_DN *sdn, back_txn *txn, int flags, int *err);
  175. struct backentry *dn2entry_or_ancestor(Slapi_Backend *be, const Slapi_DN *sdn, Slapi_DN *ancestor, back_txn *txn, int *err);
  176. struct backentry *dn2ancestor(Slapi_Backend *be,const Slapi_DN *sdn,Slapi_DN *ancestordn,back_txn *txn,int *err);
  177. int get_copy_of_entry(Slapi_PBlock *pb, const entry_address *addr, back_txn *txn, int plock_parameter, int must_exist);
  178. void done_with_pblock_entry(Slapi_PBlock *pb, int plock_parameter);
  179. /*
  180. * uniqueid2entry.c
  181. */
  182. struct backentry * uniqueid2entry(backend *be, const char *uniqueid,
  183. back_txn *txn, int *err);
  184. /*
  185. * filterindex.c
  186. */
  187. IDList * filter_candidates( Slapi_PBlock *pb, backend *be, const char *base, Slapi_Filter *f, Slapi_Filter *nextf, int range, int *err );
  188. IDList * filter_candidates_ext( Slapi_PBlock *pb, backend *be, const char *base, Slapi_Filter *f, Slapi_Filter *nextf, int range, int *err, int allidslimit );
  189. /*
  190. * findentry.c
  191. */
  192. struct backentry * find_entry2modify( Slapi_PBlock *pb, Slapi_Backend *be, const entry_address *addr, back_txn *txn );
  193. struct backentry * find_entry( Slapi_PBlock *pb, Slapi_Backend *be, const entry_address *addr, back_txn *txn );
  194. struct backentry * find_entry2modify_only( Slapi_PBlock *pb, Slapi_Backend *be, const entry_address *addr, back_txn *txn);
  195. struct backentry * find_entry2modify_only_ext( Slapi_PBlock *pb, Slapi_Backend *be, const entry_address *addr, int flags, back_txn *txn);
  196. struct backentry * find_entry_only( Slapi_PBlock *pb, Slapi_Backend *be, const entry_address *addr, back_txn *txn);
  197. int check_entry_for_referral(Slapi_PBlock *pb, Slapi_Entry *entry, char *matched, const char *callingfn);
  198. /*
  199. * haschildren.c
  200. */
  201. int has_children( struct ldbminfo *li, struct backentry *p, back_txn *txn, int *err );
  202. /*
  203. * id2entry.c
  204. */
  205. int id2entry_add( backend *be, struct backentry *e, back_txn *txn );
  206. int id2entry_add_ext( backend *be, struct backentry *e, back_txn *txn, int encrypt );
  207. int id2entry_delete( backend *be, struct backentry *e, back_txn *txn );
  208. struct backentry * id2entry( backend *be, ID id, back_txn *txn, int *err );
  209. /*
  210. * idl.c
  211. */
  212. IDList * idl_alloc( NIDS nids );
  213. void idl_free( IDList *idl );
  214. NIDS idl_length(IDList *idl);
  215. int idl_is_allids(IDList *idl);
  216. int idl_append(IDList *idl, ID id);
  217. int idl_append_extend(IDList **idl, ID id);
  218. void idl_insert(IDList **idl, ID id);
  219. /*
  220. * idl_delete - delete an id from an id list.
  221. * returns 0 id deleted
  222. * 1 id deleted, first id in block has changed
  223. * 2 id deleted, block is empty
  224. * 3 id not there
  225. * 4 cannot delete from allids block
  226. */
  227. int idl_delete( IDList **idl, ID id );
  228. IDList * idl_allids( backend *be );
  229. IDList * idl_fetch( backend *be, DB* db, DBT *key, DB_TXN *txn, struct attrinfo *a, int *err );
  230. IDList * idl_fetch_ext( backend *be, DB* db, DBT *key, DB_TXN *txn, struct attrinfo *a, int *err, int allidslimit );
  231. int idl_insert_key( backend *be, DB* db, DBT *key, ID id, DB_TXN *txn, struct attrinfo *a,int *disposition );
  232. int idl_delete_key( backend *be, DB *db, DBT *key, ID id, DB_TXN *txn, struct attrinfo *a );
  233. IDList * idl_intersection( backend *be, IDList *a, IDList *b );
  234. IDList * idl_union( backend *be, IDList *a, IDList *b );
  235. int idl_notin( backend *be, IDList *a, IDList *b , IDList **new_result);
  236. ID idl_firstid( IDList *idl );
  237. ID idl_nextid( IDList *idl, ID id );
  238. int idl_init_private(backend *be, struct attrinfo *a);
  239. int idl_release_private(struct attrinfo *a);
  240. int idl_id_is_in_idlist(IDList *idl, ID id);
  241. idl_iterator idl_iterator_init(const IDList *idl);
  242. idl_iterator idl_iterator_increment(idl_iterator *i);
  243. idl_iterator idl_iterator_decrement(idl_iterator *i);
  244. ID idl_iterator_dereference(idl_iterator i, const IDList *idl);
  245. ID idl_iterator_dereference_increment(idl_iterator *i, const IDList *idl);
  246. size_t idl_sizeof(IDList *idl);
  247. int idl_store_block(backend *be,DB *db,DBT *key,IDList *idl,DB_TXN *txn,struct attrinfo *a);
  248. void idl_set_tune(int val);
  249. int idl_get_tune();
  250. size_t idl_get_allidslimit(struct attrinfo *a, int allidslimit);
  251. int idl_get_idl_new();
  252. int idl_new_compare_dups(
  253. #if 1000*DB_VERSION_MAJOR + 100*DB_VERSION_MINOR >= 3200
  254. DB *db,
  255. #endif
  256. const DBT *a,
  257. const DBT *b
  258. );
  259. /*
  260. * index.c
  261. */
  262. int index_addordel_entry( backend *be, struct backentry *e, int flags, back_txn *txn );
  263. int index_add_mods( backend *be, /*const*/LDAPMod**mods, struct backentry *olde, struct backentry *newe, back_txn *txn );
  264. int index_addordel_string(backend *be, const char *type, const char *s, ID id, int flags, back_txn *txn);
  265. int index_addordel_values_sv( backend *be, const char *type, Slapi_Value **vals, Slapi_Value **evals, ID id, int flags, back_txn *txn );
  266. int index_addordel_values_ext_sv( backend *be, const char *type, Slapi_Value **vals, Slapi_Value **evals, ID id, int flags, back_txn *txn,int *idl_disposition, void *buffer_handle );
  267. int id_array_init(Id_Array *new_guy, int size);
  268. IDList* index_read( backend *be, char *type, const char* indextype, const struct berval* val, back_txn *txn, int *err );
  269. IDList* index_read_ext( backend *be, char *type, const char* indextype, const struct berval* val, back_txn *txn, int *err, int *unindexed );
  270. IDList* index_read_ext_allids( backend *be, char *type, const char* indextype, const struct berval* val, back_txn *txn, int *err, int *unindexed, int allidslimit );
  271. IDList* index_range_read( Slapi_PBlock *pb, backend *be, char *type, const char* indextype, int ftype, struct berval* val, struct berval* nextval, int range, back_txn *txn, int *err );
  272. IDList* index_range_read_ext( Slapi_PBlock *pb, backend *be, char *type, const char* indextype, int ftype, struct berval* val, struct berval* nextval, int range, back_txn *txn, int *err, int allidslimit );
  273. const char *encode( const struct berval* data, char buf[BUFSIZ] );
  274. extern const char* indextype_PRESENCE;
  275. extern const char* indextype_EQUALITY;
  276. extern const char* indextype_APPROX;
  277. extern const char* indextype_SUB;
  278. int index_buffer_init(size_t size,int flags,void **h);
  279. int index_buffer_flush(void *h,backend *be, DB_TXN *txn,struct attrinfo *a);
  280. int index_buffer_terminate(void *h);
  281. char* index_index2prefix (const char* indextype);
  282. void index_free_prefix (char*);
  283. /*
  284. * instance.c
  285. */
  286. int ldbm_instance_create(backend *be, char *name);
  287. int ldbm_instance_create_default_indexes(backend *be);
  288. int ldbm_instance_start(backend *be);
  289. int ldbm_instance_stop(backend *be);
  290. int ldbm_instance_startall(struct ldbminfo *li);
  291. int ldbm_instance_stopall(struct ldbminfo *li);
  292. ldbm_instance *ldbm_instance_find_by_name(struct ldbminfo *li, char *name);
  293. int ldbm_instance_destroy(ldbm_instance *inst);
  294. /*
  295. * ldif2ldbm.c
  296. */
  297. int import_subcount_mother_init(import_subcount_stuff *mothers,ID parent_id, size_t count);
  298. int import_subcount_mother_count(import_subcount_stuff *mothers,ID parent_id);
  299. void import_subcount_stuff_init(import_subcount_stuff *stuff);
  300. void import_subcount_stuff_term(import_subcount_stuff *stuff);
  301. int update_subordinatecounts(backend *be,import_subcount_stuff *mothers, int isencrypted, DB_TXN *txn);
  302. void import_configure_index_buffer_size(size_t size);
  303. size_t import_get_index_buffer_size();
  304. int ldbm_back_fetch_incl_excl(Slapi_PBlock *pb, char ***include,
  305. char ***exclude);
  306. void ldbm_back_free_incl_excl(char **include, char **exclude);
  307. int ldbm_back_ok_to_dump(const char *dn, char **include, char **exclude);
  308. int ldbm_back_wire_import(Slapi_PBlock *pb);
  309. void *factory_constructor(void *object, void *parent);
  310. void factory_destructor(void *extension, void *object, void *parent);
  311. int get_parent_rdn(DB *db, ID parentid, Slapi_RDN *srdn);
  312. /*
  313. * modify.c
  314. */
  315. int modify_update_all(backend *be, Slapi_PBlock *pb,modify_context *mc,back_txn *txn);
  316. void modify_init(modify_context *mc,struct backentry *old_entry);
  317. int modify_apply_mods(modify_context *mc, Slapi_Mods *smods);
  318. int modify_term(modify_context *mc,backend *be);
  319. int modify_switch_entries(modify_context *mc,backend *be);
  320. /*
  321. * add.c
  322. */
  323. void add_update_entry_operational_attributes(struct backentry *ep, ID pid);
  324. void add_update_entrydn_operational_attributes(struct backentry *ep);
  325. /*
  326. * misc.c
  327. */
  328. void ldbm_nasty(const char* str, int c, int err);
  329. void ldbm_log_access_message(Slapi_PBlock *pblock,char *string);
  330. int return_on_disk_full(struct ldbminfo *li);
  331. int ldbm_attribute_always_indexed(const char *attrtype);
  332. void ldbm_destroy_instance_name(struct ldbminfo *li);
  333. char *compute_entry_tombstone_dn(const char *entrydn, const char *uniqueid);
  334. char *compute_entry_tombstone_rdn(const char *entryrdn, const char *uniqueid);
  335. int instance_set_busy(ldbm_instance *inst);
  336. int instance_set_busy_and_readonly(ldbm_instance *inst);
  337. void instance_set_not_busy(ldbm_instance *inst);
  338. void allinstance_set_busy(struct ldbminfo *li);
  339. void allinstance_set_not_busy(struct ldbminfo *li);
  340. int is_anyinstance_busy(struct ldbminfo *li);
  341. int ldbm_delete_dirs(char *path);
  342. int mkdir_p(char *dir, unsigned int mode);
  343. int is_fullpath(char *path);
  344. char get_sep(char *path);
  345. int ldbm_txn_ruv_modify_context(Slapi_PBlock *pb, modify_context *mc);
  346. int get_value_from_string(const char *string, char *type, char **value);
  347. int get_values_from_string(const char *string, char *type, char ***valuearray);
  348. void normalize_dir(char *dir);
  349. /*
  350. * nextid.c
  351. */
  352. ID next_id( backend *be );
  353. void next_id_return( backend *be, ID id );
  354. ID next_id_get( backend *be );
  355. void id_internal_to_stored(ID,char*);
  356. ID id_stored_to_internal(char*);
  357. void sizeushort_internal_to_stored(size_t i,char *b);
  358. size_t sizeushort_stored_to_internal(char* b);
  359. void get_ids_from_disk(backend *be);
  360. void get_both_ids( struct ldbminfo *li, ID *nextid, ID *nextid2index );
  361. /*
  362. * backentry.c
  363. */
  364. struct backentry *backentry_init( Slapi_Entry *e );
  365. struct backentry *backentry_alloc();
  366. void backentry_free( struct backentry **bep );
  367. struct backentry *backentry_dup( struct backentry * );
  368. void backentry_clear_entry( struct backentry * );
  369. char *backentry_get_ndn(const struct backentry *e);
  370. const Slapi_DN *backentry_get_sdn(const struct backentry *e);
  371. struct backdn *backdn_init( Slapi_DN *sdn, ID id, int to_remove_from_hash );
  372. void backdn_free( struct backdn **bdn );
  373. /*
  374. * parents.c
  375. */
  376. int parent_update_on_childchange(modify_context *mc,int op, size_t *numofchildren);
  377. /*
  378. * perfctrs.c
  379. */
  380. void perfctrs_wait(size_t milliseconds,perfctrs_private *priv,DB_ENV *db_env);
  381. void perfctrs_init(struct ldbminfo *li,perfctrs_private **priv);
  382. void perfctrs_terminate(perfctrs_private **priv, DB_ENV *db_env);
  383. void perfctrs_as_entry( Slapi_Entry *e, perfctrs_private *priv, DB_ENV *db_env );
  384. /*
  385. * rmdb.c
  386. */
  387. int ldbm_back_rmdb( Slapi_PBlock *pb );
  388. /*
  389. * sort.c
  390. */
  391. /*
  392. * Definitions for sort spec object
  393. */
  394. struct sort_spec_thing
  395. {
  396. char *type; /* attribute type */
  397. char *matchrule; /* Matching rule string */
  398. int order; /* 0 == ascending, 1 == decending */
  399. struct sort_spec_thing *next; /* Link to the next one */
  400. Slapi_PBlock *mr_pb; /* For matchrule indexing */
  401. value_compare_fn_type compare_fn; /* For non-matchrule indexing */
  402. Slapi_Attr sattr;
  403. };
  404. typedef struct sort_spec_thing sort_spec_thing;
  405. typedef struct sort_spec_thing sort_spec;
  406. void sort_spec_free(sort_spec *s);
  407. int sort_candidates(backend *be, int lookthrough_limit, time_t time_up, Slapi_PBlock *pb, IDList *candidates, sort_spec_thing *sort_spec, char **sort_error_type) ;
  408. int make_sort_response_control ( Slapi_PBlock *pb, int code, char *error_type);
  409. int parse_sort_spec(struct berval *sort_spec_ber, sort_spec **ps);
  410. struct berval* attr_value_lowest(struct berval **values, value_compare_fn_type compare_fn);
  411. int sort_attr_compare(struct berval ** value_a, struct berval ** value_b, value_compare_fn_type compare_fn);
  412. void sort_log_access(Slapi_PBlock *pb,sort_spec_thing *s,IDList *candidates);
  413. /*
  414. * dbsize.c
  415. */
  416. int ldbm_db_size( Slapi_PBlock *pb );
  417. /*
  418. * external functions
  419. */
  420. int ldbm_back_bind( Slapi_PBlock *pb );
  421. int ldbm_back_unbind( Slapi_PBlock *pb );
  422. int ldbm_back_search( Slapi_PBlock *pb );
  423. int ldbm_back_compare( Slapi_PBlock *pb );
  424. int ldbm_back_modify( Slapi_PBlock *pb );
  425. int ldbm_back_modrdn( Slapi_PBlock *pb );
  426. int ldbm_back_add( Slapi_PBlock *pb );
  427. int ldbm_back_delete( Slapi_PBlock *pb );
  428. int ldbm_back_abandon( Slapi_PBlock *pb );
  429. int ldbm_back_config( Slapi_PBlock *pb );
  430. int ldbm_back_close( Slapi_PBlock *pb );
  431. int ldbm_back_cleanup( Slapi_PBlock *pb );
  432. void ldbm_back_instance_set_destructor(void **arg);
  433. int ldbm_back_flush( Slapi_PBlock *pb );
  434. int ldbm_back_start( Slapi_PBlock *pb );
  435. int ldbm_back_seq( Slapi_PBlock *pb );
  436. int ldbm_back_ldif2ldbm( Slapi_PBlock *pb );
  437. int ldbm_back_ldbm2ldif( Slapi_PBlock *pb );
  438. int ldbm_back_ldbm2ldifalt( Slapi_PBlock *pb );
  439. int ldbm_back_ldbm2index( Slapi_PBlock *pb );
  440. int ldbm_back_upgradednformat( Slapi_PBlock *pb );
  441. int ldbm_back_archive2ldbm( Slapi_PBlock *pb );
  442. int ldbm_back_ldbm2archive( Slapi_PBlock *pb );
  443. int ldbm_back_upgradedb( Slapi_PBlock *pb );
  444. int ldbm_back_dbverify( Slapi_PBlock *pb );
  445. int ldbm_back_next_search_entry( Slapi_PBlock *pb );
  446. int ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension );
  447. int ldbm_back_entry_release( Slapi_PBlock *pb, void *backend_info_ptr );
  448. void ldbm_back_search_results_release( void **search_results );
  449. int ldbm_back_init( Slapi_PBlock *pb );
  450. void ldbm_back_prev_search_results( Slapi_PBlock *pb );
  451. int ldbm_back_isinitialized();
  452. /*
  453. * monitor.c
  454. */
  455. int ldbm_back_monitor_search(Slapi_PBlock *pb, Slapi_Entry* e,
  456. Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  457. int ldbm_back_monitor_instance_search(Slapi_PBlock *pb, Slapi_Entry *e,
  458. Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg);
  459. int ldbm_back_dbmonitor_search(Slapi_PBlock *pb, Slapi_Entry *e,
  460. Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg);
  461. /*
  462. * vlv.c
  463. */
  464. struct vlv_request
  465. {
  466. ber_int_t beforeCount;
  467. ber_int_t afterCount;
  468. ber_tag_t tag;
  469. ber_int_t index;
  470. ber_int_t contentCount;
  471. struct berval value;
  472. };
  473. struct vlv_response
  474. {
  475. ber_int_t targetPosition;
  476. ber_int_t contentCount;
  477. ber_int_t result;
  478. };
  479. int vlv_init(ldbm_instance *inst);
  480. int vlv_remove_callbacks(ldbm_instance *inst);
  481. const Slapi_Entry **vlv_get_search_entries();
  482. struct vlvIndex* vlv_find_searchname(const char * name, backend *be);
  483. struct vlvIndex* vlv_find_indexname(const char * name, backend *be);
  484. char *vlv_getindexnames();
  485. int vlv_search_build_candidate_list(Slapi_PBlock *pb, const Slapi_DN *base, int *rc, const sort_spec* sort_control,
  486. const struct vlv_request *vlv_request_control, IDList** candidates, struct vlv_response *vlv_response_control);
  487. int vlv_update_index(struct vlvIndex* p, back_txn *txn, struct ldbminfo *li, Slapi_PBlock *pb, struct backentry* oldEntry, struct backentry* newEntry);
  488. int vlv_update_all_indexes(back_txn *txn, backend *be, Slapi_PBlock *pb, struct backentry* oldEntry, struct backentry* newEntry);
  489. int vlv_filter_candidates(backend *be, Slapi_PBlock *pb, const IDList *candidates, const Slapi_DN *base, int scope, Slapi_Filter *filter, IDList** filteredCandidates,int lookthrough_limit, time_t time_up);
  490. int vlv_trim_candidates_txn(backend *be, const IDList *candidates, const sort_spec* sort_control, const struct vlv_request *vlv_request_control, IDList** filteredCandidates,struct vlv_response *pResponse, back_txn *txn);
  491. int vlv_trim_candidates(backend *be, const IDList *candidates, const sort_spec* sort_control, const struct vlv_request *vlv_request_control, IDList** filteredCandidates,struct vlv_response *pResponse);
  492. int vlv_parse_request_control(backend *be, struct berval *vlv_spec_ber, struct vlv_request* vlvp);
  493. int vlv_make_response_control(Slapi_PBlock *pb, const struct vlv_response* vlvp);
  494. void vlv_getindices(IFP callback_fn,void *param, backend *be);
  495. void vlv_print_access_log(Slapi_PBlock *pb,struct vlv_request* vlvi, struct vlv_response *vlvo);
  496. void vlv_grok_new_import_entry(const struct backentry *e, backend *be);
  497. IDList *vlv_find_index_by_filter(struct backend *be, const char *base,
  498. Slapi_Filter *f);
  499. IDList *vlv_find_index_by_filter_txn(struct backend *be, const char *base,
  500. Slapi_Filter *f, back_txn *txn);
  501. int vlv_delete_search_entry(Slapi_PBlock *pb, Slapi_Entry* e, ldbm_instance *inst);
  502. void vlv_acquire_lock(backend *be);
  503. void vlv_release_lock(backend *be);
  504. int vlv_isvlv(char *filename);
  505. /*
  506. * Indexfile.c
  507. */
  508. int indexfile_delete_all_keys(backend *be,char* type,back_txn *txn);
  509. int indexfile_primary_modifyall(backend *be, LDAPMod **mods_to_perform,char **indexes_to_update,back_txn *txn);
  510. /*
  511. * bedse.c
  512. */
  513. #if 0
  514. int bedse_init();
  515. int bedse_search(Slapi_PBlock *pb);
  516. struct dse_callback *bedse_register_callback(int operation, const Slapi_DN *base, int scope, const char *filter, int (*fn)(Slapi_PBlock *,Slapi_Entry *,Slapi_Entry *,int*,char*,void *), void *fn_arg);
  517. void bedse_remove_callback(int operation, const Slapi_DN *base, int scope, const char *filter, int (*fn)(Slapi_PBlock *,Slapi_Entry *,Slapi_Entry *,int*,char*,void *));
  518. int bedse_add_index_entry(int argc, char **argv);
  519. #endif
  520. /*
  521. * ldbm_search.c
  522. */
  523. Slapi_Filter* create_onelevel_filter(Slapi_Filter* filter, const struct backentry *e, int managedsait, Slapi_Filter** fid2kids, Slapi_Filter** focref, Slapi_Filter** fand, Slapi_Filter** forr);
  524. Slapi_Filter* create_subtree_filter(Slapi_Filter* filter, int managedsait, Slapi_Filter** focref, Slapi_Filter** forr);
  525. IDList* subtree_candidates(Slapi_PBlock *pb, backend *be, const char *base, const struct backentry *e, Slapi_Filter *filter, int managedsait, int *allids_before_scopingp, int *err);
  526. void search_set_tune(struct ldbminfo *li,int val);
  527. int search_get_tune(struct ldbminfo *li);
  528. int compute_lookthrough_limit( Slapi_PBlock *pb, struct ldbminfo *li );
  529. int compute_allids_limit( Slapi_PBlock *pb, struct ldbminfo *li );
  530. /*
  531. * matchrule.c
  532. */
  533. int create_matchrule_indexer(Slapi_PBlock **pb,char* matchrule,char* type);
  534. int destroy_matchrule_indexer(Slapi_PBlock *pb);
  535. int matchrule_values_to_keys(Slapi_PBlock *pb,struct berval **input_values,struct berval ***output_values);
  536. int matchrule_values_to_keys_sv(Slapi_PBlock *pb,Slapi_Value **input_values, Slapi_Value ***output_values);
  537. /*
  538. * upgrade.c
  539. */
  540. int check_db_version(struct ldbminfo *li, int *action);
  541. int check_db_inst_version(ldbm_instance *inst);
  542. int adjust_idl_switch(char *ldbmversion, struct ldbminfo *li);
  543. int ldbm_upgrade(ldbm_instance *inst, int action);
  544. int lookup_dbversion(char *dbversion, int flag);
  545. /*
  546. * init.c
  547. */
  548. int ldbm_attribute_always_indexed(const char *attrtype);
  549. /*
  550. * dbversion.c
  551. */
  552. int dbversion_write(struct ldbminfo *li, const char *directory, const char *dataversion, PRUint32 flags);
  553. int dbversion_read(struct ldbminfo *li, const char *directory,
  554. char **ldbmversion, char **dataversion);
  555. int dbversion_exists(struct ldbminfo *li, const char *directory);
  556. /*
  557. * config_ldbm.c
  558. */
  559. int ldbm_config_load_dse_info(struct ldbminfo *li);
  560. void ldbm_config_setup_default(struct ldbminfo *li);
  561. void ldbm_config_internal_set(struct ldbminfo *li, char *attrname, char *value);
  562. void ldbm_instance_config_internal_set(ldbm_instance *inst, char *attrname, char *value);
  563. void ldbm_instance_config_setup_default(ldbm_instance *inst);
  564. int ldbm_instance_postadd_instance_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  565. int ldbm_instance_add_instance_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  566. int ldbm_instance_delete_instance_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  567. int ldbm_instance_post_delete_instance_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  568. /* Index config functions */
  569. int ldbm_index_init_entry_callback(Slapi_PBlock *pb, Slapi_Entry* e, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  570. int ldbm_instance_index_config_add_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* e, int *returncode, char *returntext, void *arg);
  571. int ldbm_instance_index_config_delete_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* e, int *returncode, char *returntext, void *arg);
  572. int ldbm_instance_index_config_modify_callback(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg);
  573. /* Attribute Encryption config functions */
  574. int ldbm_attrcrypt_init_entry_callback(Slapi_PBlock *pb, Slapi_Entry* e, Slapi_Entry* entryAfter, int *returncode, char *returntext, void *arg);
  575. int ldbm_instance_attrcrypt_config_add_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* e, int *returncode, char *returntext, void *arg);
  576. int ldbm_instance_attrcrypt_config_delete_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Entry* e, int *returncode, char *returntext, void *arg);
  577. int ldbm_instance_attrcrypt_config_modify_callback(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter, int *returncode, char *returntext, void *arg);
  578. int back_crypt_init(Slapi_Backend *be, const char *dn, const char *encAlgorithm, void **handle);
  579. int back_crypt_encrypt_value(void *handle, struct berval *in, struct berval **out);
  580. int
  581. back_crypt_decrypt_value(void *handle, struct berval *in, struct berval **out);
  582. void replace_ldbm_config_value(char *conftype, char *val, struct ldbminfo *li);
  583. /*
  584. * ancestorid.c
  585. */
  586. int ldbm_ancestorid_create_index(backend *be);
  587. int ldbm_ancestorid_index_entry(backend *be, struct backentry *e, int flags, back_txn *txn);
  588. int ldbm_ancestorid_read(backend *be, back_txn *txn, ID id, IDList **idl);
  589. int ldbm_ancestorid_read_ext(backend *be, back_txn *txn, ID id, IDList **idl, int allidslimit);
  590. int ldbm_ancestorid_move_subtree(
  591. backend *be,
  592. const Slapi_DN *olddn,
  593. const Slapi_DN *newdn,
  594. ID id,
  595. IDList *subtree_idl,
  596. back_txn *txn
  597. );
  598. /*
  599. * import-threads.c
  600. */
  601. int dse_conf_backup(struct ldbminfo *li, char *destination_directory);
  602. int dse_conf_verify(struct ldbminfo *li, char *src_dir, char *bename);
  603. /*
  604. * ldbm_attrcrypt.c
  605. */
  606. int attrcrypt_decrypt_entry(backend *be, struct backentry *e);
  607. int attrcrypt_encrypt_entry_inplace(backend *be, const struct backentry *inout);
  608. int attrcrypt_encrypt_entry(backend *be, const struct backentry *in, struct backentry **out);
  609. int attrcrypt_encrypt_index_key(backend *be, struct attrinfo *ai, const struct berval *in, struct berval **out);
  610. int attrcrypt_decrypt_index_key(backend *be, struct attrinfo *ai, const struct berval *in, struct berval **out);
  611. int attrcrypt_init(ldbm_instance *li);
  612. int attrcrypt_cleanup_private(ldbm_instance *li);
  613. /*
  614. * ldbm_usn.c
  615. */
  616. void ldbm_usn_init(struct ldbminfo *li);
  617. int ldbm_usn_enabled(backend *be);
  618. int ldbm_set_last_usn(Slapi_Backend *be);
  619. /*
  620. * ldbm_entryrdn.c
  621. */
  622. void entryrdn_set_switch(int val);
  623. int entryrdn_get_switch();
  624. void entryrdn_set_noancestorid(int val);
  625. int entryrdn_get_noancestorid();
  626. int entryrdn_compare_dups(DB *db, const DBT *a, const DBT *b);
  627. int entryrdn_index_entry(backend *be, struct backentry *e, int flags, back_txn *txn);
  628. int entryrdn_index_read(backend *be, const Slapi_DN *sdn, ID *id, back_txn *txn);
  629. int
  630. entryrdn_index_read_ext(backend *be, const Slapi_DN *sdn, ID *id, int flags, back_txn *txn);
  631. int entryrdn_rename_subtree(backend *be, const Slapi_DN *oldsdn, Slapi_RDN *newsrdn, const Slapi_DN *newsupsdn, ID id, back_txn *txn);
  632. int entryrdn_get_subordinates(backend *be, const Slapi_DN *sdn, ID id, IDList **subordinates, back_txn *txn);
  633. int entryrdn_lookup_dn(backend *be, const char *rdn, ID id, char **dn, back_txn *txn);
  634. int entryrdn_get_parent(backend *be, const char *rdn, ID id, char **prdn, ID *pid, back_txn *txn);
  635. #endif