db_headers.h revision 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * db_headers.h
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifndef _DB_HEADERS_H
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define _DB_HEADERS_H
ddc0e0b53c661f6e439e3b7072b3ef353eadb4afRichard Lowe
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <rpc/rpc.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <syslog.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <stdlib.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <setjmp.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __cplusplus
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern "C" {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int verbose;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __cplusplus
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern jmp_buf dbenv;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FATAL(msg, fcode) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis syslog(LOG_ERR, "ERROR: %s", (msg)); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalcode = (int)(fcode); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalmsg = msg; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FATAL3(msg, fcode, retval) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis syslog(LOG_ERR, "ERROR: %s", (msg)); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalcode = (int)(fcode); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalmsg = msg; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (retval); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef NISDB_MT_DEBUG
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define LOCKVAL(lockcall, msg, lockcode) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lockcode = lockcall(); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lockcode != 0) { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalcode = lockcode; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalmsg = msg; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis abort(); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define LOCKVAL(lockcall, msg, lockcode) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lockcode = lockcall(); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lockcode != 0) { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalcode = lockcode; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __nisdb_get_tsd()->fatalmsg = msg; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* NISDB_MT_DEBUG */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define LOCKV(lockcall, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int lockcode; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(lockcall, msg, lockcode); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lockcode != 0) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define LOCK(lockcall, retval, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int lockcode; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(lockcall, msg, lockcode); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lockcode != 0) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (retval); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Read lock/unlock 'this', return 'retval' is unsuccessful, and save 'msg' */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READLOCK(this, retval, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCK(this->acqnonexcl, retval, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READUNLOCK(this, retval, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCK(this->relnonexcl, retval, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Ditto, but return without a value (i.e., a "void" function */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READLOCKV(this, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKV(this->acqnonexcl, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READUNLOCKV(this, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKV(this->relnonexcl, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* As READLOCK/READUNLOCK, but set rescode instead of returning on failure */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READLOCKNR(this, rescode, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(this->acqnonexcl, msg, rescode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define READUNLOCKNR(this, rescode, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(this->relnonexcl, msg, rescode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* As READLOCK/READUNLOCK, but use a write lock */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITELOCK(this, retval, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCK(this->acqexcl, retval, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITEUNLOCK(this, retval, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCK(this->relexcl, retval, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Non-blocking write lock */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define TRYWRITELOCK(this, rescode, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(this->tryacqexcl, msg, rescode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Ditto, but return without a value */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITELOCKV(this, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKV(this->acqexcl, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITEUNLOCKV(this, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKV(this->relexcl, msg)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* As WRITELOCK/WRITEUNLOCK, but set rescode instead of returning on failure */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITELOCKNR(this, rescode, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(this->acqexcl, msg, rescode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITEUNLOCKNR(this, rescode, msg) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis LOCKVAL(this->relexcl, msg, rescode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* Apply a second write lock when already holding another write lock */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define WRITELOCK2(this, retval, msg, that) \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (this != 0) { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int lockcode1, lockcode2; \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis WRITELOCKNR(this, lockcode2, msg); \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lockcode2 != 0) { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (that != 0) { \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis WRITEUNLOCKNR(that, lockcode1, msg); \
} \
return (retval); \
} \
}
/* Release two write locks */
#define WRITEUNLOCK2(this, that, retval1, retval2, msg1, msg2) \
{ \
int lockcode1 = 0, lockcode2 = 0; \
if (this != 0) { \
WRITEUNLOCKNR(this, lockcode1, msg1); \
} \
if (that != 0) { \
WRITEUNLOCKNR(that, lockcode2, msg2); \
} \
if (lockcode2 != 0) { \
return (retval2); \
} else if (lockcode1 != 0) { \
return (retval1); \
} \
}
/* Apply a second read lock when already holding another read lock */
#define READLOCK2(this, retval, msg, that) \
if (this != 0) { \
int lockcode1, lockcode2; \
READLOCKNR(this, lockcode2, msg); \
if (lockcode2 != 0) { \
if (that != 0) { \
READUNLOCKNR(that, lockcode1, msg); \
} \
return (retval); \
} \
}
/* Release two read locks */
#define READUNLOCK2(this, that, retval1, retval2, msg1, msg2) \
{ \
int lockcode1 = 0, lockcode2 = 0; \
if (this != 0) { \
READUNLOCKNR(this, lockcode1, msg1); \
} \
if (that != 0) { \
READUNLOCKNR(that, lockcode2, msg2); \
} \
if (lockcode2 != 0) { \
return (retval2); \
} else if (lockcode1 != 0) { \
return (retval1); \
} \
}
#define ASSERTWRITELOCKHELD(lvar, retval, msg) \
{ \
int lc; \
if ((lc = __nisdb_assert_wheld(&lvar ## _rwlock)) != 0) { \
__nisdb_get_tsd()->fatalcode = lc; \
__nisdb_get_tsd()->fatalmsg = msg; \
return (retval); \
} \
}
#define WARNING(x) { syslog(LOG_ERR, "WARNING: %s", (x)); }
#define WARNING_M(x) { syslog(LOG_ERR, "WARNING: %s: %m", (x)); }
enum db_status {DB_SUCCESS, DB_NOTFOUND, DB_NOTUNIQUE,
DB_BADTABLE, DB_BADQUERY, DB_BADOBJECT,
DB_MEMORY_LIMIT, DB_STORAGE_LIMIT, DB_INTERNAL_ERROR,
DB_BADDICTIONARY, DB_SYNC_FAILED, DB_LOCK_ERROR};
typedef enum db_status db_status;
enum db_action {DB_LOOKUP, DB_REMOVE, DB_ADD, DB_FIRST, DB_NEXT, DB_ALL,
DB_RESET_NEXT, DB_ADD_NOLOG,
DB_ADD_NOSYNC, DB_REMOVE_NOSYNC };
typedef enum db_action db_action;
#endif /* _DB_HEADERS_H */