1/* init.c - initialize bdb backend */ 2/* $OpenLDAP$ */ 3/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 4 * 5 * Copyright 2000-2011 The OpenLDAP Foundation. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted only as authorized by the OpenLDAP 10 * Public License. 11 * 12 * A copy of this license is available in the file LICENSE in the 13 * top-level directory of the distribution or, alternatively, at 14 * <http://www.OpenLDAP.org/license.html>. 15 */ 16 17#include "portable.h" 18 19#include <stdio.h> 20#include <ac/string.h> 21 22#include "back-bdb.h" 23 24int bdb_next_id( BackendDB *be, ID *out ) 25{ 26 struct bdb_info *bdb = (struct bdb_info *) be->be_private; 27 28 ldap_pvt_thread_mutex_lock( &bdb->bi_lastid_mutex ); 29 *out = ++bdb->bi_lastid; 30 ldap_pvt_thread_mutex_unlock( &bdb->bi_lastid_mutex ); 31 32 return 0; 33} 34 35int bdb_last_id( BackendDB *be, DB_TXN *tid ) 36{ 37 struct bdb_info *bdb = (struct bdb_info *) be->be_private; 38 int rc; 39 ID id = 0; 40 unsigned char idbuf[sizeof(ID)]; 41 DBT key, data; 42 DBC *cursor; 43 44 DBTzero( &key ); 45 key.flags = DB_DBT_USERMEM; 46 key.data = (char *) idbuf; 47 key.ulen = sizeof( idbuf ); 48 49 DBTzero( &data ); 50 data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL; 51 52 /* Get a read cursor */ 53 rc = bdb->bi_id2entry->bdi_db->cursor( bdb->bi_id2entry->bdi_db, 54 tid, &cursor, 0 ); 55 56 if (rc == 0) { 57 rc = cursor->c_get(cursor, &key, &data, DB_LAST); 58 cursor->c_close(cursor); 59 } 60 61 switch(rc) { 62 case DB_NOTFOUND: 63 rc = 0; 64 break; 65 case 0: 66 BDB_DISK2ID( idbuf, &id ); 67 break; 68 69 default: 70 Debug( LDAP_DEBUG_ANY, 71 "=> bdb_last_id: get failed: %s (%d)\n", 72 db_strerror(rc), rc, 0 ); 73 goto done; 74 } 75 76 bdb->bi_lastid = id; 77 78done: 79 return rc; 80} 81