1 /* $NetBSD: idl.h,v 1.1.1.1 2014/05/28 09:58:49 tron Exp $ */ 2 3 /* idl.h - ldap mdb back-end ID list header file */ 4 /* $OpenLDAP$ */ 5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 * 7 * Copyright 2000-2014 The OpenLDAP Foundation. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted only as authorized by the OpenLDAP 12 * Public License. 13 * 14 * A copy of this license is available in the file LICENSE in the 15 * top-level directory of the distribution or, alternatively, at 16 * <http://www.OpenLDAP.org/license.html>. 17 */ 18 19 #ifndef _MDB_IDL_H_ 20 #define _MDB_IDL_H_ 21 22 /* IDL sizes - likely should be even bigger 23 * limiting factors: sizeof(ID), thread stack size 24 */ 25 #define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */ 26 #define MDB_IDL_DB_SIZE (1<<MDB_IDL_LOGN) 27 #define MDB_IDL_UM_SIZE (1<<(MDB_IDL_LOGN+1)) 28 #define MDB_IDL_UM_SIZEOF (MDB_IDL_UM_SIZE * sizeof(ID)) 29 30 #define MDB_IDL_DB_MAX (MDB_IDL_DB_SIZE-1) 31 32 #define MDB_IDL_UM_MAX (MDB_IDL_UM_SIZE-1) 33 34 #define MDB_IDL_IS_RANGE(ids) ((ids)[0] == NOID) 35 #define MDB_IDL_RANGE_SIZE (3) 36 #define MDB_IDL_RANGE_SIZEOF (MDB_IDL_RANGE_SIZE * sizeof(ID)) 37 #define MDB_IDL_SIZEOF(ids) ((MDB_IDL_IS_RANGE(ids) \ 38 ? MDB_IDL_RANGE_SIZE : ((ids)[0]+1)) * sizeof(ID)) 39 40 #define MDB_IDL_RANGE_FIRST(ids) ((ids)[1]) 41 #define MDB_IDL_RANGE_LAST(ids) ((ids)[2]) 42 43 #define MDB_IDL_RANGE( ids, f, l ) \ 44 do { \ 45 (ids)[0] = NOID; \ 46 (ids)[1] = (f); \ 47 (ids)[2] = (l); \ 48 } while(0) 49 50 #define MDB_IDL_ZERO(ids) \ 51 do { \ 52 (ids)[0] = 0; \ 53 (ids)[1] = 0; \ 54 (ids)[2] = 0; \ 55 } while(0) 56 57 #define MDB_IDL_IS_ZERO(ids) ( (ids)[0] == 0 ) 58 #define MDB_IDL_IS_ALL( range, ids ) ( (ids)[0] == NOID \ 59 && (ids)[1] <= (range)[1] && (range)[2] <= (ids)[2] ) 60 61 #define MDB_IDL_CPY( dst, src ) (AC_MEMCPY( dst, src, MDB_IDL_SIZEOF( src ) )) 62 63 #define MDB_IDL_ID( mdb, ids, id ) MDB_IDL_RANGE( ids, id, NOID ) 64 #define MDB_IDL_ALL( ids ) MDB_IDL_RANGE( ids, 1, NOID ) 65 66 #define MDB_IDL_FIRST( ids ) ( (ids)[1] ) 67 #define MDB_IDL_LLAST( ids ) ( (ids)[(ids)[0]] ) 68 #define MDB_IDL_LAST( ids ) ( MDB_IDL_IS_RANGE(ids) \ 69 ? (ids)[2] : (ids)[(ids)[0]] ) 70 71 #define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \ 72 ? ((ids)[2]-(ids)[1])+1 : (ids)[0] ) 73 74 /** An ID2 is an ID/value pair. 75 */ 76 typedef struct ID2 { 77 ID mid; /**< The ID */ 78 MDB_val mval; /**< The value */ 79 } ID2; 80 81 /** An ID2L is an ID2 List, a sorted array of ID2s. 82 * The first element's \b mid member is a count of how many actual 83 * elements are in the array. The \b mptr member of the first element is unused. 84 * The array is sorted in ascending order by \b mid. 85 */ 86 typedef ID2 *ID2L; 87 88 typedef struct IdScopes { 89 MDB_txn *mt; 90 MDB_cursor *mc; 91 ID id; 92 ID2L scopes; 93 int numrdns; 94 int nscope; 95 int oscope; 96 struct berval rdns[MAXRDNS]; 97 struct berval nrdns[MAXRDNS]; 98 } IdScopes; 99 100 LDAP_BEGIN_DECL 101 /** Search for an ID in an ID2L. 102 * @param[in] ids The ID2L to search. 103 * @param[in] id The ID to search for. 104 * @return The index of the first ID2 whose \b mid member is greater than or equal to \b id. 105 */ 106 unsigned mdb_id2l_search( ID2L ids, ID id ); 107 108 109 /** Insert an ID2 into a ID2L. 110 * @param[in,out] ids The ID2L to insert into. 111 * @param[in] id The ID2 to insert. 112 * @return 0 on success, -1 if the ID was already present in the MIDL2. 113 */ 114 int mdb_id2l_insert( ID2L ids, ID2 *id ); 115 LDAP_END_DECL 116 117 #endif 118