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