xref: /illumos-gate/usr/src/lib/libnisdb/db_c.x (revision a506a34c)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  *	db_c.x
24  *
25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
28 
29 %#pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #if RPC_HDR
32 %#ifndef _DB_DB_H
33 %#define _DB_DB_H
34 
35 #ifdef USINGC
36 %#include "db_mindex_c.h"
37 %#include "db_vers_c.h"
38 %#include "db_entry_c.h"
39 #else
40 %#include "nisdb_rw.h"
41 %#include "db_log.h"
42 %#include "db_mindex.h"
43 %#include "db_vers.h"
44 %#include "db_entry.h"
45 %#include "db_scheme.h"
46 #endif /* USINGC */
47 #endif /* RPC_HDR */
48 
49 #if RPC_HDR || RPC_XDR
50 #ifdef USINGC
51 struct db {
52   char* logfilename;
53   char* dbfilename;
54   char* tmpfilename;
55   db_log *logfile;
56   db_mindex internal_db;
57   bool logfile_opened;
58   bool changed;
59   __nisdb_rwlock_t db_rwlock;
60 };
61 #endif /* USINGC */
62 #endif /* RPC_HDR */
63 
64 #ifndef USINGC
65 #ifdef RPC_HDR
66 %class db {
67 %  char* logfilename;
68 %  char* dbfilename;
69 %  char* tmpfilename;
70 %  db_log *logfile;
71 %  db_mindex internal_db;
72 %  bool_t logfile_opened;
73 %  bool_t changed;
74 %  STRUCTRWLOCK(db);
75 %
76 %/* Delete old log file and descriptor */
77 %  int reset_log();
78 %
79 %/* Open log file (and creates descriptor) if it has not been opened */
80 %  int open_log(bool_t copylog);
81 %
82 %/* Incorporate updates in log to database already loaded.
83 %   Does not affect "logfile" */
84 %  int incorporate_log( char * );
85 %
86 %/* Execute the specified action using the rest of the arguments as input.
87 %   Return  a structure db_result containing the result. */
88 %  db_result * exec_action( db_action, db_query *, entry_object *,
89 %			  db_next_desc *previous );
90 % public:
91 %/*  Log the given action and execute it.
92 %    The minor version of the database is updated after the action has
93 %    been executed and the database is flagged as being changed.
94 %    Return the structure db_result, or NULL if the loggin failed or the
95 %    action is unknown. */
96 %  db_result * log_action( db_action, db_query *, entry_object * );
97 %
98 %  /* closes log file if opened */
99 %  /* removes self from list of dbs have opened files */
100 %  int close_log(int bypass_standby = 0);
101 %
102 %/* Constructor:  Create a database using the given name, 'dbname.'
103 %   The database is stored in a file named 'dbname'.
104 %   The log file is stored in a file named 'dbname'.log.
105 %   A temporary file 'dbname'.tmp is also used.   */
106 %  db( char * );
107 %
108 %/* Destructor:  deletes filenames and logfile descriptor.
109 %   Note that associated files should be removed separately.  */
110 %  ~db();
111 %
112 %/* Write out in-memory copy of database to file.
113 %   1.  Update major version.
114 %   2.  Dump contents to temporary file.
115 %   3.  Rename temporary file to real database file.
116 %   4.  Remove log file.
117 %   A checkpoint is done only if it has changed since the previous checkpoint.
118 %   Returns TRUE if checkpoint was successful; FALSE otherwise. */
119 %  bool_t checkpoint();
120 %
121 %/* Load database and incorporate any logged updates into the loaded copy.
122 %   Return TRUE if load succeeds; FALSE otherwise. */
123 %  bool_t load();
124 %
125 %/* Dump this database to a file.
126 %   Return TRUE if dump succeeds; FALSE otherwise. */
127 %  bool_t dump(char *outfile) {return (internal_db.dump(outfile));};
128 %
129 %/* Initialize the database using table scheme 's'.
130 %   Because the 'scheme' must be 'remembered' between restarts,
131 %   after the initialization, the empty database is checkpointed to record
132 %   the scheme. Returns TRUE if initialization succeeds; FALSE otherwise. */
133 %  bool_t init( db_scheme *s );
134 %
135 %/* Print out the database's statistics. */
136 %  void print()    { internal_db.print_stats();}
137 %
138 %/* Return whether the database has changed since its previous checkpoint. */
139 %  bool_t changedp() { return changed;}
140 %
141 %/* Return the version of the database. */
142 %  vers* get_version() { return internal_db.get_version(); }
143 %
144 %
145 %/* Execute 'action' using the rest of the arguments as input.
146 %   Return the result of the operation in a db_result structure;
147 %   Return NULL if the request is unknown.
148 %   If the action involves updates (ADD and REMOVE), it is logged first. */
149 %  db_result* execute( db_action, db_query *, entry_object *,
150 %			  db_next_desc* previous );
151 %
152 %/* Execute log entry 'j' on this db.  'j' is executed if its version is
153 %   later than that of the database; if executed, the database's version
154 %   will be changed to that of 'j', regardless of the status of the operation.
155 %   Returns TRUE if 'j' was executed;   FALSE if it was not.
156 %   Log entry is added to this database's log if log_entry is applied. */
157 %  bool_t execute_log_entry( db_log_entry * );
158 %
159 %/* Return structure db_log_list containing entries that are later
160 %   than the version 'v' given.  */
161 %  db_log_list * get_log_entries_since( vers * );
162 %
163 %/* Sync the table log file */
164 %  db_status	sync_log();
165 %
166 %/* Delete all files associated with database. */
167 %  int remove_files();
168 %
169 %  /* for debugging */
170 %/* Print information on all indices of the database to stdout. */
171 %  void print_all_indices() {internal_db.print_all_indices();}
172 %
173 %/* Print information on specified index of the the database to stdout. */
174 %  void print_index( int n ) {internal_db.print_index( n ); }
175 %
176 %/* Mark this instance deferred */
177 %  void markDeferred(void) {
178 %	internal_db.markDeferred();
179 %  }
180 %
181 %/* Remove defer marking */
182 %  void unmarkDeferred(void) {
183 %	internal_db.unmarkDeferred();
184 %  }
185 %
186 %/* Exclusive access to this instance */
187 %  int acqexcl(void) {
188 %	return (WLOCK(db));
189 %  }
190 %
191 %/* Non-blocking exclusive access */
192 %  int tryacqexcl(void) {
193 %	return (TRYWLOCK(db));
194 %  }
195 %
196 %/* Release exclusive access */
197 %  int relexcl(void) {
198 %	return (WULOCK(db));
199 %  }
200 %
201 %/* Non-exclusive (readonly) access to this instance */
202 %  int acqnonexcl(void) {
203 %	return (RLOCK(db));
204 %  }
205 %
206 %/* Release non-exlusive access */
207 %  int relnonexcl(void) {
208 %	return (RULOCK(db));
209 %  }
210 %
211 %/* Destroy instance lock */
212 %  int destroylock(void) {
213 %	return (DESTROYRW(db));
214 %  }
215 %
216 %/* Pass configuration information to the db_mindex */
217 %  bool_t configure(char *objName);
218 %
219 %/* Export a pointer to the db_mindex structure */
220 %  db_mindex *mindex(void);
221 %};
222 %
223 %typedef class db * dbp;
224 #endif /* USINGC */
225 #endif /* RPC_HDR */
226 
227 #if RPC_HDR
228 %#endif /* _DB_DB_H */
229 #endif /* RPC_HDR */
230