db_mindex_c.x revision 9519:fc2830e2f3c4
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 69struct 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}; 81typedef struct db_mindex * db_mindex_p; 82 83typedef string strP<>; 84 85struct xdr_nis_object_s { 86 int xversion; 87 nis_object *obj; 88 strP dirEntry<>; 89}; 90typedef 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 */ 379