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