backend.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. /* backend.c - Slapi_Backend methods */
  13. #include "slap.h"
  14. #include "nspr.h"
  15. static PRMonitor *global_backend_mutex = NULL;
  16. void
  17. be_init( Slapi_Backend *be, const char *type, const char *name, int isprivate, int logchanges, int sizelimit, int timelimit )
  18. {
  19. slapdFrontendConfig_t *fecfg;
  20. be->be_suffixlist = NULL;
  21. be->be_suffixlock = PR_NewLock();
  22. be->be_suffixcounter = slapi_counter_new();
  23. /* e.g. dn: cn=config,cn=NetscapeRoot,cn=ldbm database,cn=plugins,cn=config */
  24. be->be_basedn = slapi_create_dn_string("cn=%s,cn=%s,cn=plugins,cn=config",
  25. name, type);
  26. if (NULL == be->be_basedn) {
  27. LDAPDebug2Args(LDAP_DEBUG_ANY,
  28. "be_init: failed create instance dn for plugin %s, "
  29. "instance %s\n", type, name);
  30. }
  31. be->be_configdn = slapi_create_dn_string("cn=config,cn=%s,cn=%s,cn=plugins,cn=config",
  32. name, type);
  33. if (NULL == be->be_configdn) {
  34. LDAPDebug2Args(LDAP_DEBUG_ANY,
  35. "be_init: failed create instance config dn for "
  36. "plugin %s, instance %s\n", type, name);
  37. }
  38. be->be_monitordn = slapi_create_dn_string("cn=monitor,cn=%s,cn=%s,cn=plugins,cn=config",
  39. name, type);
  40. if (NULL == be->be_configdn) {
  41. LDAPDebug2Args(LDAP_DEBUG_ANY,
  42. "be_init: failed create instance monitor dn for "
  43. "plugin %s, instance %s\n", type, name);
  44. }
  45. be->be_sizelimit = sizelimit;
  46. be->be_pagedsizelimit = config_get_pagedsizelimit();
  47. be->be_timelimit = timelimit;
  48. /* maximum group nesting level before giving up */
  49. be->be_maxnestlevel = SLAPD_DEFAULT_GROUPNESTLEVEL;
  50. be->be_noacl= 0;
  51. be->be_flags=0;
  52. if (( fecfg = getFrontendConfig()) != NULL )
  53. {
  54. if ( fecfg->backendconfig != NULL && fecfg->backendconfig[ 0 ] != NULL )
  55. {
  56. be->be_backendconfig = slapi_ch_strdup( fecfg->backendconfig[0] );
  57. }
  58. else
  59. {
  60. be->be_backendconfig= NULL;
  61. }
  62. be->be_readonly = fecfg->readonly;
  63. }
  64. else
  65. {
  66. be->be_readonly= 0;
  67. be->be_backendconfig= NULL;
  68. }
  69. be->be_lastmod = LDAP_UNDEFINED;
  70. be->be_type = slapi_ch_strdup(type);
  71. be->be_include = NULL;
  72. be->be_private = isprivate;
  73. be->be_logchanges = logchanges;
  74. be->be_database = NULL;
  75. be->be_writeconfig = NULL;
  76. be->be_delete_on_exit = 0;
  77. be->be_state = BE_STATE_STOPPED;
  78. be->be_state_lock = PR_NewLock();
  79. be->be_name = slapi_ch_strdup(name);
  80. be->be_mapped = 0;
  81. be->be_usn_counter = NULL;
  82. }
  83. void
  84. be_done(Slapi_Backend *be)
  85. {
  86. int i;
  87. int count = slapi_counter_get_value(be->be_suffixcounter);
  88. struct suffixlist *list, *next;
  89. list = be->be_suffixlist;
  90. for(i=0; i < count && list; i++)
  91. {
  92. next = list->next;
  93. slapi_sdn_free(&list->be_suffix);
  94. slapi_ch_free((void **)&list);
  95. list = next;
  96. }
  97. slapi_ch_free((void **)&be->be_basedn);
  98. slapi_ch_free((void **)&be->be_configdn);
  99. slapi_ch_free((void **)&be->be_monitordn);
  100. slapi_ch_free((void **)&be->be_type);
  101. slapi_ch_free((void **)&be->be_backendconfig);
  102. /* JCM char **be_include; ??? */
  103. slapi_ch_free((void **)&be->be_name);
  104. if (!config_get_entryusn_global()) {
  105. slapi_counter_destroy(&be->be_usn_counter);
  106. }
  107. slapi_counter_destroy(&be->be_suffixcounter);
  108. PR_DestroyLock(be->be_suffixlock);
  109. PR_DestroyLock(be->be_state_lock);
  110. if (be->be_lock != NULL)
  111. {
  112. slapi_destroy_rwlock(be->be_lock);
  113. be->be_lock = NULL;
  114. }
  115. }
  116. void
  117. global_backend_lock_init()
  118. {
  119. global_backend_mutex = PR_NewMonitor();
  120. }
  121. int
  122. global_backend_lock_requested()
  123. {
  124. return config_get_global_backend_lock();
  125. }
  126. void
  127. global_backend_lock_lock()
  128. {
  129. if (global_backend_mutex) {
  130. PR_EnterMonitor(global_backend_mutex);
  131. }
  132. }
  133. void
  134. global_backend_lock_unlock() {
  135. if (global_backend_mutex) {
  136. PR_ExitMonitor(global_backend_mutex);
  137. }
  138. }
  139. void
  140. slapi_be_delete_onexit (Slapi_Backend *be)
  141. {
  142. be->be_delete_on_exit = 1;
  143. }
  144. void
  145. slapi_be_set_readonly(Slapi_Backend *be, int readonly)
  146. {
  147. be->be_readonly = readonly;
  148. }
  149. int
  150. slapi_be_get_readonly(Slapi_Backend *be)
  151. {
  152. return be->be_readonly;
  153. }
  154. /*
  155. * Check if suffix, exactly matches a registered
  156. * suffix of this backend.
  157. */
  158. int
  159. slapi_be_issuffix( const Slapi_Backend *be, const Slapi_DN *suffix )
  160. {
  161. struct suffixlist *list;
  162. int r= 0;
  163. /* this backend is no longer valid */
  164. if (be->be_state != BE_STATE_DELETED)
  165. {
  166. int i = 0, count;
  167. count = slapi_counter_get_value(be->be_suffixcounter);
  168. list = be->be_suffixlist;
  169. while(list && i < count){
  170. if ( slapi_sdn_compare( list->be_suffix, suffix ) == 0){
  171. r = 1;
  172. break;
  173. }
  174. i++;
  175. list = list->next;
  176. }
  177. }
  178. return r;
  179. }
  180. int
  181. be_isdeleted( const Slapi_Backend *be )
  182. {
  183. return ((be == NULL) || (BE_STATE_DELETED == be->be_state));
  184. }
  185. void
  186. be_addsuffix(Slapi_Backend *be,const Slapi_DN *suffix)
  187. {
  188. if (be->be_state != BE_STATE_DELETED)
  189. {
  190. struct suffixlist *new_suffix, *list;
  191. new_suffix = (struct suffixlist *)slapi_ch_malloc(sizeof(struct suffixlist));
  192. new_suffix->be_suffix = slapi_sdn_dup(suffix);
  193. new_suffix->next = NULL;
  194. PR_Lock(be->be_suffixlock);
  195. if(be->be_suffixlist == NULL){
  196. be->be_suffixlist = new_suffix;
  197. } else {
  198. list = be->be_suffixlist;
  199. while(list->next != NULL){
  200. list = list->next;
  201. }
  202. list->next = new_suffix;
  203. }
  204. slapi_counter_increment(be->be_suffixcounter);
  205. PR_Unlock(be->be_suffixlock);
  206. }
  207. }
  208. void slapi_be_addsuffix(Slapi_Backend *be,const Slapi_DN *suffix)
  209. {
  210. be_addsuffix(be,suffix);
  211. }
  212. /*
  213. * The Slapi_DN pointer will always be valid even though the array
  214. * itself may be changing due to the addition of a suffix.
  215. */
  216. const Slapi_DN *
  217. slapi_be_getsuffix(Slapi_Backend *be,int n)
  218. {
  219. struct suffixlist *list;
  220. if(NULL == be)
  221. return NULL;
  222. if(be->be_state != BE_STATE_DELETED) {
  223. if (be->be_suffixlist !=NULL && n < slapi_counter_get_value(be->be_suffixcounter)) {
  224. int i = 0;
  225. list = be->be_suffixlist;
  226. while(list != NULL && i <= n){
  227. if(i == n){
  228. return list->be_suffix;
  229. }
  230. list = list->next;
  231. i++;
  232. }
  233. }
  234. }
  235. return NULL;
  236. }
  237. const char *
  238. slapi_be_gettype(Slapi_Backend *be)
  239. {
  240. const char *r= NULL;
  241. if (be->be_state != BE_STATE_DELETED)
  242. {
  243. r= be->be_type;
  244. }
  245. return r;
  246. }
  247. Slapi_DN *
  248. be_getconfigdn(Slapi_Backend *be, Slapi_DN *dn)
  249. {
  250. if (be->be_state == BE_STATE_DELETED)
  251. {
  252. slapi_sdn_set_ndn_byref(dn,NULL);
  253. }
  254. else
  255. {
  256. slapi_sdn_set_ndn_byref(dn,be->be_configdn);
  257. }
  258. return dn;
  259. }
  260. Slapi_DN *
  261. be_getmonitordn(Slapi_Backend *be, Slapi_DN *dn)
  262. {
  263. if (be->be_state == BE_STATE_DELETED)
  264. {
  265. slapi_sdn_set_ndn_byref(dn,NULL);
  266. }
  267. else
  268. {
  269. slapi_sdn_set_ndn_byref(dn,be->be_monitordn);
  270. }
  271. return dn;
  272. }
  273. int
  274. be_writeconfig ( Slapi_Backend *be )
  275. {
  276. Slapi_PBlock *newpb;
  277. if (be->be_state == BE_STATE_DELETED || be->be_private ||
  278. (be->be_writeconfig == NULL) ) {
  279. return -1;
  280. }
  281. else {
  282. newpb = slapi_pblock_new();
  283. slapi_pblock_set ( newpb, SLAPI_PLUGIN, (void *) be->be_database );
  284. slapi_pblock_set ( newpb, SLAPI_BACKEND, (void *) be );
  285. (be->be_writeconfig)(newpb);
  286. slapi_pblock_destroy ( newpb );
  287. return 1;
  288. }
  289. }
  290. /*
  291. * Find out if changes made to entries in this backend
  292. * should be recorded in the changelog.
  293. */
  294. int
  295. slapi_be_logchanges(Slapi_Backend *be)
  296. {
  297. if (be->be_state == BE_STATE_DELETED)
  298. return 0;
  299. return be->be_logchanges;
  300. }
  301. int
  302. slapi_be_private ( Slapi_Backend *be )
  303. {
  304. if ( be!=NULL )
  305. {
  306. return (be->be_private);
  307. }
  308. return 0;
  309. }
  310. void *
  311. slapi_be_get_instance_info(Slapi_Backend * be)
  312. {
  313. PR_ASSERT(NULL != be);
  314. return be->be_instance_info;
  315. }
  316. void
  317. slapi_be_set_instance_info(Slapi_Backend * be, void * data)
  318. {
  319. PR_ASSERT(NULL != be);
  320. be->be_instance_info=data;
  321. }
  322. int
  323. slapi_be_getentrypoint(Slapi_Backend *be, int entrypoint, void **ret_fnptr, Slapi_PBlock *pb)
  324. {
  325. PR_ASSERT(NULL != be);
  326. /* this is something needed for most of the entry points */
  327. if (pb)
  328. {
  329. slapi_pblock_set( pb, SLAPI_PLUGIN, be->be_database );
  330. slapi_pblock_set( pb, SLAPI_BACKEND, be );
  331. }
  332. switch (entrypoint) {
  333. case SLAPI_PLUGIN_DB_BIND_FN:
  334. *ret_fnptr = (void*)be->be_bind;
  335. break;
  336. case SLAPI_PLUGIN_DB_UNBIND_FN:
  337. *ret_fnptr = (void*)be->be_unbind;
  338. break;
  339. case SLAPI_PLUGIN_DB_SEARCH_FN:
  340. *ret_fnptr = (void*)be->be_search;
  341. break;
  342. case SLAPI_PLUGIN_DB_COMPARE_FN:
  343. *ret_fnptr = (void*)be->be_compare;
  344. break;
  345. case SLAPI_PLUGIN_DB_MODIFY_FN:
  346. *ret_fnptr = (void*)be->be_modify;
  347. break;
  348. case SLAPI_PLUGIN_DB_MODRDN_FN:
  349. *ret_fnptr = (void*)be->be_modrdn;
  350. break;
  351. case SLAPI_PLUGIN_DB_ADD_FN:
  352. *ret_fnptr = (void*)be->be_add;
  353. break;
  354. case SLAPI_PLUGIN_DB_DELETE_FN:
  355. *ret_fnptr = (void*)be->be_delete;
  356. break;
  357. case SLAPI_PLUGIN_DB_ABANDON_FN:
  358. *ret_fnptr = (void*)be->be_abandon;
  359. break;
  360. case SLAPI_PLUGIN_DB_CONFIG_FN:
  361. *ret_fnptr = (void*)be->be_config;
  362. break;
  363. case SLAPI_PLUGIN_CLOSE_FN:
  364. *ret_fnptr = (void*)be->be_close;
  365. break;
  366. case SLAPI_PLUGIN_DB_FLUSH_FN:
  367. *ret_fnptr = (void*)be->be_flush;
  368. break;
  369. case SLAPI_PLUGIN_START_FN:
  370. *ret_fnptr = (void*)be->be_start;
  371. break;
  372. case SLAPI_PLUGIN_DB_RESULT_FN:
  373. *ret_fnptr = (void*)be->be_result;
  374. break;
  375. case SLAPI_PLUGIN_DB_LDIF2DB_FN:
  376. *ret_fnptr = (void*)be->be_ldif2db;
  377. break;
  378. case SLAPI_PLUGIN_DB_DB2LDIF_FN:
  379. *ret_fnptr = (void*)be->be_db2ldif;
  380. break;
  381. case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
  382. *ret_fnptr = (void*)be->be_archive2db;
  383. break;
  384. case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
  385. *ret_fnptr = (void*)be->be_db2archive;
  386. break;
  387. case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
  388. *ret_fnptr = (void*)be->be_next_search_entry;
  389. break;
  390. case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN:
  391. *ret_fnptr = (void*)be->be_next_search_entry_ext;
  392. break;
  393. case SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN:
  394. *ret_fnptr = (void*)be->be_entry_release;
  395. break;
  396. case SLAPI_PLUGIN_DB_SEARCH_RESULTS_RELEASE_FN:
  397. *ret_fnptr = (void*)be->be_search_results_release;
  398. break;
  399. case SLAPI_PLUGIN_DB_PREV_SEARCH_RESULTS_FN:
  400. *ret_fnptr = be->be_prev_search_results;
  401. break;
  402. case SLAPI_PLUGIN_DB_SIZE_FN:
  403. *ret_fnptr = (void*)be->be_dbsize;
  404. break;
  405. case SLAPI_PLUGIN_DB_TEST_FN:
  406. *ret_fnptr = (void*)be->be_dbtest;
  407. break;
  408. case SLAPI_PLUGIN_DB_RMDB_FN:
  409. *ret_fnptr = (void*)be->be_rmdb;
  410. break;
  411. case SLAPI_PLUGIN_DB_INIT_INSTANCE_FN:
  412. *ret_fnptr = (void*)be->be_init_instance;
  413. break;
  414. case SLAPI_PLUGIN_DB_SEQ_FN:
  415. *ret_fnptr = (void*)be->be_seq;
  416. break;
  417. case SLAPI_PLUGIN_DB_DB2INDEX_FN:
  418. *ret_fnptr = (void*)be->be_db2index;
  419. break;
  420. case SLAPI_PLUGIN_CLEANUP_FN:
  421. *ret_fnptr = (void*)be->be_cleanup;
  422. break;
  423. default:
  424. slapi_log_error(SLAPI_LOG_FATAL, NULL,
  425. "slapi_be_getentrypoint: unknown entry point %d\n", entrypoint);
  426. return -1;
  427. }
  428. return 0;
  429. }
  430. int
  431. slapi_be_setentrypoint(Slapi_Backend *be, int entrypoint, void *ret_fnptr, Slapi_PBlock *pb)
  432. {
  433. PR_ASSERT(NULL != be);
  434. /* this is something needed for most of the entry points */
  435. if (pb)
  436. {
  437. be->be_database=pb->pb_plugin;
  438. return 0;
  439. }
  440. switch (entrypoint) {
  441. case SLAPI_PLUGIN_DB_BIND_FN:
  442. be->be_bind=(IFP)ret_fnptr;
  443. break;
  444. case SLAPI_PLUGIN_DB_UNBIND_FN:
  445. be->be_unbind=(IFP)ret_fnptr;
  446. break;
  447. case SLAPI_PLUGIN_DB_SEARCH_FN:
  448. be->be_search=(IFP)ret_fnptr;
  449. break;
  450. case SLAPI_PLUGIN_DB_COMPARE_FN:
  451. be->be_compare=(IFP)ret_fnptr;
  452. break;
  453. case SLAPI_PLUGIN_DB_MODIFY_FN:
  454. be->be_modify=(IFP)ret_fnptr;
  455. break;
  456. case SLAPI_PLUGIN_DB_MODRDN_FN:
  457. be->be_modrdn=(IFP)ret_fnptr;
  458. break;
  459. case SLAPI_PLUGIN_DB_ADD_FN:
  460. be->be_add=(IFP)ret_fnptr;
  461. break;
  462. case SLAPI_PLUGIN_DB_DELETE_FN:
  463. be->be_delete=(IFP)ret_fnptr;
  464. break;
  465. case SLAPI_PLUGIN_DB_ABANDON_FN:
  466. be->be_abandon=(IFP)ret_fnptr;
  467. break;
  468. case SLAPI_PLUGIN_DB_CONFIG_FN:
  469. be->be_config=(IFP)ret_fnptr;
  470. break;
  471. case SLAPI_PLUGIN_CLOSE_FN:
  472. be->be_close=(IFP)ret_fnptr;
  473. break;
  474. case SLAPI_PLUGIN_DB_FLUSH_FN:
  475. be->be_flush=(IFP)ret_fnptr;
  476. break;
  477. case SLAPI_PLUGIN_START_FN:
  478. be->be_start=(IFP)ret_fnptr;
  479. break;
  480. case SLAPI_PLUGIN_DB_RESULT_FN:
  481. be->be_result=(IFP)ret_fnptr;
  482. break;
  483. case SLAPI_PLUGIN_DB_LDIF2DB_FN:
  484. be->be_ldif2db=(IFP)ret_fnptr;
  485. break;
  486. case SLAPI_PLUGIN_DB_DB2LDIF_FN:
  487. be->be_db2ldif=(IFP) ret_fnptr;
  488. break;
  489. case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
  490. be->be_archive2db=(IFP) ret_fnptr;
  491. break;
  492. case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
  493. be->be_db2archive=(IFP) ret_fnptr;
  494. break;
  495. case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
  496. be->be_next_search_entry=(IFP) ret_fnptr;
  497. break;
  498. case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN:
  499. be->be_next_search_entry_ext=(IFP) ret_fnptr;
  500. break;
  501. case SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN:
  502. be->be_entry_release=(IFP) ret_fnptr;
  503. break;
  504. case SLAPI_PLUGIN_DB_SEARCH_RESULTS_RELEASE_FN:
  505. be->be_search_results_release=(VFPP) ret_fnptr;
  506. break;
  507. case SLAPI_PLUGIN_DB_PREV_SEARCH_RESULTS_FN:
  508. be->be_prev_search_results = (VFP) ret_fnptr;
  509. break;
  510. case SLAPI_PLUGIN_DB_SIZE_FN:
  511. be->be_dbsize=(IFP) ret_fnptr;
  512. break;
  513. case SLAPI_PLUGIN_DB_TEST_FN:
  514. be->be_dbtest=(IFP)ret_fnptr;
  515. break;
  516. case SLAPI_PLUGIN_DB_RMDB_FN:
  517. be->be_rmdb=(IFP)ret_fnptr;
  518. break;
  519. case SLAPI_PLUGIN_DB_INIT_INSTANCE_FN:
  520. be->be_init_instance=(IFP)ret_fnptr;
  521. break;
  522. case SLAPI_PLUGIN_DB_SEQ_FN:
  523. be->be_seq=(IFP)ret_fnptr;
  524. break;
  525. case SLAPI_PLUGIN_DB_DB2INDEX_FN:
  526. be->be_db2index=(IFP)ret_fnptr;
  527. break;
  528. case SLAPI_PLUGIN_CLEANUP_FN:
  529. be->be_cleanup=(IFP)ret_fnptr;
  530. break;
  531. default:
  532. slapi_log_error(SLAPI_LOG_FATAL, NULL,
  533. "slapi_be_setentrypoint: unknown entry point %d\n", entrypoint);
  534. return -1;
  535. }
  536. return 0;
  537. }
  538. int slapi_be_is_flag_set(Slapi_Backend * be, int flag)
  539. {
  540. return be->be_flags & flag;
  541. }
  542. void slapi_be_set_flag(Slapi_Backend * be, int flag)
  543. {
  544. be->be_flags |= flag;
  545. }
  546. void slapi_be_unset_flag(Slapi_Backend * be, int flag)
  547. {
  548. be->be_flags &= ~flag;
  549. }
  550. char * slapi_be_get_name(Slapi_Backend * be)
  551. {
  552. return be->be_name;
  553. }
  554. void be_set_sizelimit(Slapi_Backend * be, int sizelimit)
  555. {
  556. be->be_sizelimit = sizelimit;
  557. }
  558. void be_set_timelimit(Slapi_Backend * be, int timelimit)
  559. {
  560. be->be_timelimit = timelimit;
  561. }
  562. void be_set_pagedsizelimit(Slapi_Backend * be, int sizelimit)
  563. {
  564. be->be_pagedsizelimit = sizelimit;
  565. }
  566. int
  567. slapi_back_get_info(Slapi_Backend *be, int cmd, void **info)
  568. {
  569. int rc = -1;
  570. if (!be || !be->be_get_info || !info) {
  571. return rc;
  572. }
  573. rc = (*be->be_get_info)(be, cmd, info);
  574. return rc;
  575. }
  576. int
  577. slapi_back_set_info(Slapi_Backend *be, int cmd, void *info)
  578. {
  579. int rc = -1;
  580. if (!be || !be->be_set_info || !info) {
  581. return rc;
  582. }
  583. rc = (*be->be_set_info)(be, cmd, info);
  584. return rc;
  585. }
  586. int
  587. slapi_back_ctrl_info(Slapi_Backend *be, int cmd, void *info)
  588. {
  589. int rc = -1;
  590. if (!be || !be->be_ctrl_info || !info) {
  591. return rc;
  592. }
  593. rc = (*be->be_ctrl_info)(be, cmd, info);
  594. return rc;
  595. }
  596. /* API to expose DB transaction begin */
  597. /* See memberof.c for usage. */
  598. int
  599. slapi_back_transaction_begin(Slapi_PBlock *pb)
  600. {
  601. IFP txn_begin;
  602. if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_BEGIN_FN, (void*)&txn_begin) ||
  603. !txn_begin)
  604. {
  605. return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
  606. } else {
  607. return txn_begin(pb);
  608. }
  609. }
  610. /* API to expose DB transaction commit */
  611. int
  612. slapi_back_transaction_commit(Slapi_PBlock *pb)
  613. {
  614. IFP txn_commit;
  615. if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_COMMIT_FN, (void*)&txn_commit) ||
  616. !txn_commit)
  617. {
  618. return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
  619. } else {
  620. return txn_commit(pb);
  621. }
  622. }
  623. /* API to expose DB transaction abort */
  624. int
  625. slapi_back_transaction_abort(Slapi_PBlock *pb)
  626. {
  627. IFP txn_abort;
  628. if(slapi_pblock_get(pb, SLAPI_PLUGIN_DB_ABORT_FN, (void*)&txn_abort) ||
  629. !txn_abort)
  630. {
  631. return SLAPI_BACK_TRANSACTION_NOT_SUPPORTED;
  632. } else {
  633. return txn_abort(pb);
  634. }
  635. }