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 2004 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