1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * db_index_c.x 23 * 24 * Copyright 2015 Gary Mills 25 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29 #if RPC_XDR 30 %#include "ldap_xdr.h" 31 #endif /* RPC_XDR */ 32 33 #if RPC_HDR 34 %#ifndef _DB_INDEX_H 35 %#define _DB_INDEX_H 36 37 % 38 %/* db_index is a hash table with separate overflow buckets. */ 39 % 40 41 42 #ifdef USINGC 43 %#include "db_item_c.h" 44 %#include "db_index_entry_c.h" 45 %#include "db_table_c.h" 46 %#include "db_scheme_c.h" 47 #else 48 %#include "db_item.h" 49 %#include "db_index_entry.h" 50 %#include "db_table.h" 51 %#include "db_scheme.h" 52 #endif /* USINGC */ 53 #endif /* RPC_HDR */ 54 % 55 %#include "nisdb_rw.h" 56 % 57 #if RPC_HDR || RPC_XDR 58 #ifdef USINGC 59 struct db_index { 60 db_index_entry_p tab<>; 61 int count; 62 bool case_insens; 63 __nisdb_rwlock_t index_rwlock; 64 }; 65 typedef struct db_index * db_index_p; 66 #endif /* USINGC */ 67 #endif /* RPC_HDR */ 68 69 #ifndef USINGC 70 #ifdef RPC_HDR 71 %class db_index { 72 % long table_size; 73 % db_index_entry_p *tab; 74 % int count; 75 % bool_t case_insens; 76 % STRUCTRWLOCK(index); 77 % 78 %/* Grow the current hashtable upto the next size. 79 % The contents of the existing hashtable is copied to the new one and 80 % relocated according to its hashvalue relative to the new size. 81 % Old table is deleted after the relocation. */ 82 % void grow(); 83 % 84 %/* Clear the chains created in db_index_entrys */ 85 %/* void clear_results();*/ 86 % public: 87 % 88 %/* Constructor: creates empty index. */ 89 % db_index(); 90 % 91 %/* Constructor: creates index by loading it from the specified file. 92 % If loading fails, creates empty index. */ 93 % db_index( char *); 94 % 95 %/* Destructor: deletes index, including all associated db_index_entry. */ 96 % ~db_index(); 97 % 98 %/* Empty table (deletes index, including all associated db_index_entry) */ 99 % void reset(); 100 % 101 %/* Initialize index according to the specification of the key descriptor. 102 % Currently, only affects case_insens flag of index. */ 103 % void init( db_key_desc * ); 104 % 105 %/* Moves an index from an xdr index */ 106 % db_status move_xdr_db_index(db_index *orig); 107 % 108 %/* Dumps this index to named file. */ 109 % int dump( char *); 110 % 111 % 112 %/* Look up given index value in hashtable. 113 % Return pointer to db_index_entries that match the given value, linked 114 % via the 'next_result' pointer. Return in 'how_many_found' the size 115 % of this list. Return NULL if not found. */ 116 % db_index_entry *lookup(item *, long *, db_table *, bool_t); 117 % 118 %/* Remove the entry with the given index value and location 'recnum'. 119 % If successful, return DB_SUCCESS; otherwise DB_NOTUNIQUE if index_value 120 % is null; DB_NOTFOUND if entry is not found. 121 % If successful, decrement count of number of entries in hash table. */ 122 % db_status remove( item*, entryp ); 123 % 124 %/* Add a new index entry with the given index value and location 'recnum'. 125 % Return DB_NOTUNIQUE, if entry with identical index_value and recnum 126 % already exists. If entry is added, return DB_SUCCESS. 127 % Increment count of number of entries in index table and grow table 128 % if table is more than half full. 129 % Note that a copy of index_value is made for new entry. */ 130 % db_status add( item*, entryp ); 131 % 132 %/* Return in 'tsize' the table_size, and 'tcount' the number of entries 133 % in the table. */ 134 % void stats( long* tsize, long* tcount); 135 % 136 % 137 %/* Print all entries in the table. */ 138 % void print(); 139 % 140 %/* Locking methods */ 141 % 142 % int acqexcl(void) { 143 % return (WLOCK(index)); 144 % } 145 % 146 % int relexcl(void) { 147 % return (WULOCK(index)); 148 % } 149 % 150 % int acqnonexcl(void) { 151 % return (RLOCK(index)); 152 % } 153 % 154 % int relnonexcl(void) { 155 % return (RULOCK(index)); 156 % } 157 %}; 158 %#ifdef __cplusplus 159 %extern "C" bool_t xdr_db_index(XDR *, db_index *); 160 %#elif __STDC__ 161 %extern bool_t xdr_db_index(XDR *, db_index *); 162 %#endif 163 %typedef class db_index * db_index_p; 164 #endif /* RPC_HDR */ 165 #endif /* USINGC */ 166 167 #if RPC_HDR 168 %#endif /* _DB_INDEX_H */ 169 #endif /* RPC_HDR */