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_mindex_c.x 23 * 24 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28 #if RPC_HDR 29 %#ifndef _DB_MINDEX_H 30 %#define _DB_MINDEX_H 31 32 #ifdef USINGC 33 %#include "db_vers_c.h" 34 %#include "db_table_c.h" 35 %#include "db_index_entry_c.h" 36 %#include "db_index_c.h" 37 %#include "db_scheme_c.h" 38 %#include "db_query_c.h" 39 #else 40 %#include "db_vers.h" 41 %#include "db_table.h" 42 %#include "db_index_entry.h" 43 %#include "db_index.h" 44 %#include "db_scheme.h" 45 %#include "db_query.h" 46 #endif /* USINGC */ 47 %#include "ldap_parse.h" 48 %#include "nisdb_rw.h" 49 %#include "ldap_xdr.h" 50 #endif /* RPC_HDR */ 51 52 #if RPC_HDR 53 %struct db_next_index_desc { 54 % entryp location; 55 % struct db_next_index_desc *next; 56 57 #ifndef USINGC 58 % db_next_index_desc( entryp loc, struct db_next_index_desc *n ) 59 % { location = loc; next = n; } 60 #endif /* USINGC */ 61 62 %}; 63 #endif /* RPC_HDR */ 64 65 66 #if RPC_HDR || RPC_XDR 67 #ifdef USINGC 68 69 struct db_mindex { 70 vers rversion; 71 db_index indices<>; /* indices[num_indices] */ 72 db_table *table; 73 db_scheme *scheme; 74 __nisdb_ptr_t objPath; 75 __nisdb_flag_t noWriteThrough; 76 __nisdb_flag_t noLDAPquery; 77 __nisdb_flag_t initialLoad; 78 __nisdb_ptr_t dbptr; 79 __nisdb_rwlock_t mindex_rwlock; 80 }; 81 typedef struct db_mindex * db_mindex_p; 82 83 typedef string strP<>; 84 85 struct xdr_nis_object_s { 86 int xversion; 87 nis_object *obj; 88 strP dirEntry<>; 89 }; 90 typedef struct xdr_nis_object_s xdr_nis_object_t; 91 92 %extern bool_t xdr_nis_object(); 93 #endif /* USINGC */ 94 #endif /* RPC_HDR */ 95 96 #ifndef USINGC 97 #ifdef RPC_HDR 98 % 99 %struct xdr_nis_object_s { 100 % int version; 101 % nis_object *obj; 102 % struct { 103 % uint_t dirEntry_len; 104 % char **dirEntry_val; 105 % } dirEntry; 106 %}; 107 %typedef struct xdr_nis_object_s xdr_nis_object_t; 108 % 109 %extern bool_t xdr_nis_object(); 110 % 111 %class db_mindex { 112 % vers rversion; 113 %// int num_indices; 114 %// db_index * indices; /* indices[num_indices] */ 115 % struct { 116 % int indices_len; 117 % db_index *indices_val; 118 % } indices; 119 % db_table *table; 120 % db_scheme *scheme; 121 % __nisdb_ptr_t objPath; 122 % __nisdb_flag_t noWriteThrough; 123 % __nisdb_flag_t noLDAPquery; 124 % __nisdb_flag_t initialLoad; 125 % __nisdb_ptr_t dbptr; 126 % STRUCTRWLOCK(mindex); 127 % 128 %/* Return a list of index_entries that satsify the given query 'q'. 129 % Return the size of the list in 'count'. Return NULL if list is empty. 130 % Return in 'valid' FALSE if query is not well formed. */ 131 % db_index_entry_p satisfy_query(db_query *, long *, bool_t *valid, 132 % bool_t fromLDAP = FALSE); 133 % db_index_entry_p satisfy_query(db_query *, long *, bool_t *valid = NULL); 134 % 135 %/* Returns a newly db_query containing the index values as 136 % obtained from the given object. The object itself, 137 % along with information on the scheme given, will determine 138 % which values are extracted from the object and placed into the query. 139 % Returns an empty query if 'obj' is not a valid entry. 140 % Note that space is allocated for the query and the index values 141 % (i.e. do not share pointers with strings in 'obj'.) */ 142 % db_query * extract_index_values_from_object( entry_object * ); 143 % 144 %/* Returns a newly created db_query structure containing the index values 145 % as obtained from the record named by 'recnum'. The record itself, along 146 % with information on the schema definition of this table, will determine 147 % which values are extracted from the record and placed into the result. 148 % Returns NULL if recnum is not a valid entry. 149 % Note that space is allocated for the query and the index values 150 % (i.e. do not share pointers with strings in 'obj'.) */ 151 % db_query * extract_index_values_from_record( entryp ); 152 % 153 %/* Returns an array of size 'count' of 'entry_object_p's, pointing to 154 % copies of entry_objects named by the result list of db_index_entries 'res'. 155 %*/ 156 % entry_object_p * prepare_results( int, db_index_entry_p, db_status* ); 157 % 158 %/* Remove the entry identified by 'recloc' from: 159 % 1. all indices, as obtained by extracting the index values from the entry 160 % 2. table where entry is stored. */ 161 % db_status remove_aux( entryp ); 162 % 163 %/* entry_object * get_record( entryp );*/ 164 % public: 165 % 166 %/* Constructor: Create empty table (no scheme, no table or indices). */ 167 % db_mindex(); 168 % 169 %/* Constructor: Create new table using scheme defintion supplied. 170 % (Make copy of scheme and keep it with table.) */ 171 % db_mindex(db_scheme *, char *tablePath); 172 % 173 %/* destructor */ 174 % ~db_mindex(); 175 % 176 % db_index_entry_p satisfy_query_dbonly(db_query *, long *, 177 % bool_t checkExpire, 178 % bool_t *valid = NULL); 179 % 180 %/* Returns whether there table is valid (i.e. has scheme). */ 181 % bool_t good() { return scheme != NULL && table != NULL; } 182 % 183 %/* Change the version of the table to the one given. */ 184 % void change_version( vers *v ) { rversion.assign( v );} 185 % 186 %/* Return the current version of the table. */ 187 % vers *get_version() { return( &rversion ); } 188 % 189 %/* Reset contents of tables by: deleting indice entries, table entries */ 190 % void reset_tables(); 191 % 192 %/* Reset the table by: deleting all the indices, table of entries, and its 193 % scheme. Reset version to 0 */ 194 % void reset(); 195 % 196 %/* Initialize table using information from specified file. 197 % The table is first 'reset', then the attempt to load from the file 198 % is made. If the load failed, the table is again reset. 199 % Therefore, the table will be modified regardless of the success of the 200 % load. Returns TRUE if successful, FALSE otherwise. */ 201 % int load( char * ); 202 % 203 %/* Initialize table using information given in scheme 'how'. 204 % Record the scheme for later use (make copy of it); 205 % create the required number of indices; and create table for storing 206 % entries. 207 % The 'tablePath' is passed on to db_table in order to obtain the 208 % NIS+/LDAP mapping information (if any). */ 209 % void init( db_scheme *); 210 % 211 %/* Write this structure (table, indices, scheme) into the specified file. */ 212 % int dump( char *); 213 % 214 %/* Removes the entry in the table named by given query 'q'. 215 % If a NULL query is supplied, all entries in table are removed. 216 % Returns DB_NOTFOUND if no entry is found. 217 % Returns DB_SUCCESS if one entry is found; this entry is removed from 218 % its record storage, and it is also removed from all the indices of the 219 % table. If more than one entry satisfying 'q' is found, all are removed. */ 220 % db_status remove( db_query *); 221 % 222 %/* Add copy of given entry to table. Entry is identified by query 'q'. 223 % The entry (if any) satisfying the query is first deleted, then 224 % added to the indices (using index values extracted form the given entry) 225 % and the table. 226 % Returns DB_NOTUNIQUE if more than one entry satisfies the query. 227 % Returns DB_NOTFOUND if query is not well-formed. 228 % Returns DB_SUCCESS if entry can be added. */ 229 % db_status add( db_query *, entry_object* ); 230 % 231 % 232 %/* Finds entry that satisfy the query 'q'. Returns the answer by 233 % setting the pointer 'rp' to point to the list of answers. 234 % Note that the answers are pointers to copies of the entries. 235 % Returns the number of answers find in 'count'. 236 % Returns DB_SUCCESS if search found at least one answer; 237 % returns DB_NOTFOUND if none is found. */ 238 % db_status lookup( db_query *, long *, entry_object_p ** ); 239 % 240 %/* Returns the next entry in the table after 'previous' by setting 'answer' to 241 % point to a copy of the entry_object. Returns DB_SUCCESS if 'previous' 242 % is valid and next entry is found; DB_NOTFOUND otherwise. Sets 'where' 243 % to location of where entry is found for input as subsequent 'next' 244 % operation. */ 245 % db_status next( entryp, entryp *, entry_object ** ); 246 % 247 %/* Returns the next entry in the table after 'previous' by setting 'answer' to 248 % point to a copy of the entry_object. Returns DB_SUCCESS if 'previous' 249 % is valid and next entry is found; DB_NOTFOUND otherwise. Sets 'where' 250 % to location of where entry is found for input as subsequent 'next' 251 % operation. */ 252 % db_status next( db_next_index_desc*, db_next_index_desc **, entry_object ** ); 253 % 254 %/* Returns the first entry found in the table by setting 'answer' to 255 % a copy of the entry_object. Returns DB_SUCCESS if found; 256 % DB_NOTFOUND otherwise. */ 257 % db_status first( entryp*, entry_object ** ); 258 % 259 %/* Returns the first entry that satisfies query by setting 'answer' to 260 % a copy of the entry_object. Returns DB_SUCCESS if found; 261 % DB_NOTFOUND otherwise. */ 262 % db_status first( db_query *, db_next_index_desc **, entry_object ** ); 263 % 264 % /* Delete the given list of results; used when no longer interested in 265 % the results of the first/next query that returned this list. */ 266 % db_status reset_next( db_next_index_desc *orig ); 267 % 268 %/* Return all entries within table. Returns the answer by 269 % setting the pointer 'rp' to point to the list of answers. 270 % Note that the answers are pointers to copies of the entries. 271 % Returns the number of answers find in 'count'. 272 % Returns DB_SUCCESS if search found at least one answer; 273 % returns DB_NOTFOUND if none is found. */ 274 % db_status all( long *, entry_object_p ** ); 275 % 276 % /* for debugging */ 277 %/* Prints statistics of the table. This includes the size of the table, 278 % the number of entries, and the index sizes. */ 279 % void print_stats(); 280 % 281 %/* Prints statistics about all indices of table. */ 282 % void print_all_indices(); 283 % 284 % 285 %/* Prints statistics about indices identified by 'n'. */ 286 % void print_index( int n ); 287 % 288 %/* Configure LDAP mapping */ 289 % bool_t configure (char *objName); 290 % 291 %/* Mark this instance deferred */ 292 % void markDeferred(void) { 293 % if (table != NULL) table->markDeferred(); 294 % } 295 %/* Remove deferred mark */ 296 % void unmarkDeferred(void) { 297 % if (table != NULL) table->unmarkDeferred(); 298 % } 299 % 300 %/* Retrieve, remove, or store data from/in/to LDAP */ 301 % int queryLDAP(db_query *, char *, int); 302 % int entriesFromLDAP(__nis_table_mapping_t *, db_query *, db_query *, 303 % char *, nis_object *, int); 304 % 305 % int removeLDAP(db_query *, nis_object *o); 306 % 307 % int storeObjLDAP(__nis_table_mapping_t *t, nis_object *o); 308 % int storeLDAP(db_query *, entry_obj *, nis_object *, entry_obj *, 309 % char *dbId); 310 % 311 %/* Set/clear no-write-through flag */ 312 % void setNoWriteThrough(void); 313 % void clearNoWriteThrough(void); 314 % 315 %/* Set/clear no-LDAP-query flag */ 316 % void setNoLDAPquery(void); 317 % void clearNoLDAPquery(void); 318 % 319 %/* Set/clear initialLoad flag */ 320 % void setInitialLoad(void); 321 % void clearInitialLoad(void); 322 % 323 %/* Store/retrieve pointer to parent 'db' class instance */ 324 % void setDbPtr(void *ptr); 325 % void *getDbPtr(void); 326 % 327 %/* Get pointer to private 'table' field */ 328 % db_table *getTable(void); 329 % 330 %/* 331 % * Update table entry per the (entry_object *). If 'replace' is set, 332 % * the entry is replaced or added; otherwise, it is removed. 333 % */ 334 % int updateTableEntry(entry_object *e, int replace, char *tableName, 335 % nis_object *obj, nis_object *tobj, uint32_t ttime, 336 % int *xid); 337 % 338 %/* Touch the indicated entry */ 339 % bool_t touchEntry(entry_object *e); 340 % bool_t touchEntry(db_query *q); 341 % 342 %/* Return the 'scheme' pointer */ 343 % db_scheme *getScheme(void) {return (scheme);} 344 % 345 %/* RW lock functions */ 346 % 347 % int tryacqexcl(void) { 348 % return (TRYWLOCK(mindex)); 349 % } 350 % 351 % int acqexcl(void) { 352 % return (WLOCK(mindex)); 353 % } 354 % 355 % int relexcl(void) { 356 % return (WULOCK(mindex)); 357 % } 358 % 359 % int acqnonexcl(void) { 360 % return (RLOCK(mindex)); 361 % } 362 % 363 % int relnonexcl(void) { 364 % return (RULOCK(mindex)); 365 % } 366 %}; 367 %#ifdef __cplusplus 368 %extern "C" bool_t xdr_db_mindex(XDR*, db_mindex*); 369 %#elif __STDC__ 370 %extern bool_t xdr_db_mindex(XDR*, db_mindex*); 371 %#endif 372 %typedef class db_mindex * db_mindex_p; 373 #endif /* RPC_HDR */ 374 #endif /* USINGC */ 375 376 #if RPC_HDR 377 %#endif /* _DB_MINDEX_H */ 378 #endif /* RPC_HDR */