1/* $NetBSD: idl.h,v 1.3 2021/08/14 16:15:00 christos 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-2021 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 */ 26extern unsigned int MDB_idl_logn; 27extern unsigned int MDB_idl_db_size; 28extern unsigned int MDB_idl_um_size; 29extern unsigned int MDB_idl_db_max; 30extern unsigned int MDB_idl_um_max; 31 32#define MDB_IDL_IS_RANGE(ids) ((ids)[0] == NOID) 33#define MDB_IDL_RANGE_SIZE (3) 34#define MDB_IDL_RANGE_SIZEOF (MDB_IDL_RANGE_SIZE * sizeof(ID)) 35#define MDB_IDL_SIZEOF(ids) ((MDB_IDL_IS_RANGE(ids) \ 36 ? MDB_IDL_RANGE_SIZE : ((ids)[0]+1)) * sizeof(ID)) 37 38#define MDB_IDL_RANGE_FIRST(ids) ((ids)[1]) 39#define MDB_IDL_RANGE_LAST(ids) ((ids)[2]) 40 41#define MDB_IDL_RANGE( ids, f, l ) \ 42 do { \ 43 (ids)[0] = NOID; \ 44 (ids)[1] = (f); \ 45 (ids)[2] = (l); \ 46 } while(0) 47 48#define MDB_IDL_ZERO(ids) \ 49 do { \ 50 (ids)[0] = 0; \ 51 (ids)[1] = 0; \ 52 (ids)[2] = 0; \ 53 } while(0) 54 55#define MDB_IDL_IS_ZERO(ids) ( (ids)[0] == 0 ) 56#define MDB_IDL_IS_ALL( range, ids ) ( (ids)[0] == NOID \ 57 && (ids)[1] <= (range)[1] && (range)[2] <= (ids)[2] ) 58 59#define MDB_IDL_CPY( dst, src ) (AC_MEMCPY( dst, src, MDB_IDL_SIZEOF( src ) )) 60 61#define MDB_IDL_ID( mdb, ids, id ) MDB_IDL_RANGE( ids, id, NOID ) 62#define MDB_IDL_ALL( ids ) MDB_IDL_RANGE( ids, 1, NOID ) 63 64#define MDB_IDL_FIRST( ids ) ( (ids)[1] ) 65#define MDB_IDL_LLAST( ids ) ( (ids)[(ids)[0]] ) 66#define MDB_IDL_LAST( ids ) ( MDB_IDL_IS_RANGE(ids) \ 67 ? (ids)[2] : (ids)[(ids)[0]] ) 68 69#define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \ 70 ? ((ids)[2]-(ids)[1])+1 : (ids)[0] ) 71 72 /** An ID2 is an ID/value pair. 73 */ 74typedef struct ID2 { 75 ID mid; /**< The ID */ 76 MDB_val mval; /**< The value */ 77} ID2; 78 79 /** An ID2L is an ID2 List, a sorted array of ID2s. 80 * The first element's \b mid member is a count of how many actual 81 * elements are in the array. The \b mptr member of the first element is unused. 82 * The array is sorted in ascending order by \b mid. 83 */ 84typedef ID2 *ID2L; 85 86typedef struct IdScopes { 87 MDB_txn *mt; 88 MDB_cursor *mc; 89 ID id; 90 ID2L scopes; 91 ID2L sctmp; 92 int numrdns; 93 int nscope; 94 int oscope; 95 struct berval rdns[MAXRDNS]; 96 struct berval nrdns[MAXRDNS]; 97} IdScopes; 98 99LDAP_BEGIN_DECL 100 /** Reset IDL params after changing logn */ 101void mdb_idl_reset(); 102 103 104 /** Search for an ID in an ID2L. 105 * @param[in] ids The ID2L to search. 106 * @param[in] id The ID to search for. 107 * @return The index of the first ID2 whose \b mid member is greater than or equal to \b id. 108 */ 109unsigned mdb_id2l_search( ID2L ids, ID id ); 110 111 112 /** Insert an ID2 into a ID2L. 113 * @param[in,out] ids The ID2L to insert into. 114 * @param[in] id The ID2 to insert. 115 * @return 0 on success, -1 if the ID was already present in the MIDL2. 116 */ 117int mdb_id2l_insert( ID2L ids, ID2 *id ); 118LDAP_END_DECL 119 120#endif 121