📄 db_err.c
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996-2004 * Sleepycat Software. All rights reserved. * * $Id: db_err.c,v 11.123 2004/09/22 03:07:50 bostic Exp $ */#include "db_config.h"#ifndef NO_SYSTEM_INCLUDES#include <sys/types.h>#include <stdlib.h>#include <string.h>#endif#include "db_int.h"#include "dbinc/db_page.h"#include "dbinc/db_am.h"#include "dbinc/db_shash.h"#include "dbinc/lock.h"#include "dbinc/log.h"#include "dbinc/txn.h"static void __db_msgcall __P((const DB_ENV *, const char *, va_list));static void __db_msgfile __P((const DB_ENV *, const char *, va_list));/* * __db_fchk -- * General flags checking routine. * * PUBLIC: int __db_fchk __P((DB_ENV *, const char *, u_int32_t, u_int32_t)); */int__db_fchk(dbenv, name, flags, ok_flags) DB_ENV *dbenv; const char *name; u_int32_t flags, ok_flags;{ return (LF_ISSET(~ok_flags) ? __db_ferr(dbenv, name, 0) : 0);}/* * __db_fcchk -- * General combination flags checking routine. * * PUBLIC: int __db_fcchk * PUBLIC: __P((DB_ENV *, const char *, u_int32_t, u_int32_t, u_int32_t)); */int__db_fcchk(dbenv, name, flags, flag1, flag2) DB_ENV *dbenv; const char *name; u_int32_t flags, flag1, flag2;{ return (LF_ISSET(flag1) && LF_ISSET(flag2) ? __db_ferr(dbenv, name, 1) : 0);}/* * __db_ferr -- * Common flag errors. * * PUBLIC: int __db_ferr __P((const DB_ENV *, const char *, int)); */int__db_ferr(dbenv, name, iscombo) const DB_ENV *dbenv; const char *name; int iscombo;{ __db_err(dbenv, "illegal flag %sspecified to %s", iscombo ? "combination " : "", name); return (EINVAL);}/* * __db_fnl -- * Common flag-needs-locking message. * * PUBLIC: int __db_fnl __P((const DB_ENV *, const char *)); */int__db_fnl(dbenv, name) const DB_ENV *dbenv; const char *name;{ __db_err(dbenv, "%s: the DB_DIRTY_READ, DB_DEGREE_2 and DB_RMW flags require locking", name); return (EINVAL);}/* * __db_pgerr -- * Error when unable to retrieve a specified page. * * PUBLIC: int __db_pgerr __P((DB *, db_pgno_t, int)); */int__db_pgerr(dbp, pgno, errval) DB *dbp; db_pgno_t pgno; int errval;{ /* * Three things are certain: * Death, taxes, and lost data. * Guess which has occurred. */ __db_err(dbp->dbenv, "unable to create/retrieve page %lu", (u_long)pgno); return (__db_panic(dbp->dbenv, errval));}/* * __db_pgfmt -- * Error when a page has the wrong format. * * PUBLIC: int __db_pgfmt __P((DB_ENV *, db_pgno_t)); */int__db_pgfmt(dbenv, pgno) DB_ENV *dbenv; db_pgno_t pgno;{ __db_err(dbenv, "page %lu: illegal page type or format", (u_long)pgno); return (__db_panic(dbenv, EINVAL));}#ifdef DIAGNOSTIC/* * __db_assert -- * Error when an assertion fails. Only checked if #DIAGNOSTIC defined. * * PUBLIC: #ifdef DIAGNOSTIC * PUBLIC: void __db_assert __P((const char *, const char *, int)); * PUBLIC: #endif */void__db_assert(failedexpr, file, line) const char *failedexpr, *file; int line;{ (void)fprintf(stderr, "__db_assert: \"%s\" failed: file \"%s\", line %d\n", failedexpr, file, line); (void)fflush(stderr); /* We want a stack trace of how this could possibly happen. */ abort(); /* NOTREACHED */}#endif/* * __db_panic_msg -- * Just report that someone else paniced. * * PUBLIC: int __db_panic_msg __P((DB_ENV *)); */int__db_panic_msg(dbenv) DB_ENV *dbenv;{ __db_err(dbenv, "PANIC: fatal region error detected; run recovery"); if (dbenv->db_paniccall != NULL) dbenv->db_paniccall(dbenv, DB_RUNRECOVERY); return (DB_RUNRECOVERY);}/* * __db_panic -- * Lock out the tree due to unrecoverable error. * * PUBLIC: int __db_panic __P((DB_ENV *, int)); */int__db_panic(dbenv, errval) DB_ENV *dbenv; int errval;{ if (dbenv != NULL) { PANIC_SET(dbenv, 1); __db_err(dbenv, "PANIC: %s", db_strerror(errval)); if (dbenv->db_paniccall != NULL) dbenv->db_paniccall(dbenv, errval); }#if defined(DIAGNOSTIC) && !defined(CONFIG_TEST) /* * We want a stack trace of how this could possibly happen. * * Don't drop core if it's the test suite -- it's reasonable for the * test suite to check to make sure that DB_RUNRECOVERY is returned * under certain conditions. */ abort();#endif /* * Chaos reigns within. * Reflect, repent, and reboot. * Order shall return. */ return (DB_RUNRECOVERY);}/* * db_strerror -- * ANSI C strerror(3) for DB. * * EXTERN: char *db_strerror __P((int)); */char *db_strerror(error) int error;{ char *p; if (error == 0) return ("Successful return: 0"); if (error > 0) { if ((p = strerror(error)) != NULL) return (p); goto unknown_err; } /* * !!! * The Tcl API requires that some of these return strings be compared * against strings stored in application scripts. So, any of these * errors that do not invariably result in a Tcl exception may not be * altered. */ switch (error) { case DB_BUFFER_SMALL: return ("DB_BUFFER_SMALL: User memory too small for return value"); case DB_DONOTINDEX: return ("DB_DONOTINDEX: Secondary index callback returns null"); case DB_KEYEMPTY: return ("DB_KEYEMPTY: Non-existent key/data pair"); case DB_KEYEXIST: return ("DB_KEYEXIST: Key/data pair already exists"); case DB_LOCK_DEADLOCK: return ("DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock"); case DB_LOCK_NOTGRANTED: return ("DB_LOCK_NOTGRANTED: Lock not granted"); case DB_LOG_BUFFER_FULL: return ("DB_LOG_BUFFER_FULL: In-memory log buffer is full"); case DB_NOSERVER: return ("DB_NOSERVER: Fatal error, no RPC server"); case DB_NOSERVER_HOME: return ("DB_NOSERVER_HOME: Home unrecognized at server"); case DB_NOSERVER_ID: return ("DB_NOSERVER_ID: Identifier unrecognized at server"); case DB_NOTFOUND: return ("DB_NOTFOUND: No matching key/data pair found"); case DB_OLD_VERSION: return ("DB_OLDVERSION: Database requires a version upgrade"); case DB_PAGE_NOTFOUND: return ("DB_PAGE_NOTFOUND: Requested page not found"); case DB_REP_DUPMASTER: return ("DB_REP_DUPMASTER: A second master site appeared"); case DB_REP_HANDLE_DEAD: return ("DB_REP_HANDLE_DEAD: Handle is no longer valid"); case DB_REP_HOLDELECTION: return ("DB_REP_HOLDELECTION: Need to hold an election"); case DB_REP_ISPERM: return ("DB_REP_ISPERM: Permanent record written"); case DB_REP_NEWMASTER: return ("DB_REP_NEWMASTER: A new master has declared itself"); case DB_REP_NEWSITE: return ("DB_REP_NEWSITE: A new site has entered the system"); case DB_REP_NOTPERM: return ("DB_REP_NOTPERM: Permanent log record not written"); case DB_REP_STARTUPDONE: return ("DB_REP_STARTUPDONE: Client completed startup synchronization."); case DB_REP_UNAVAIL: return ("DB_REP_UNAVAIL: Unable to elect a master"); case DB_RUNRECOVERY: return ("DB_RUNRECOVERY: Fatal error, run database recovery"); case DB_SECONDARY_BAD: return ("DB_SECONDARY_BAD: Secondary index inconsistent with primary"); case DB_VERIFY_BAD: return ("DB_VERIFY_BAD: Database verification failed"); case DB_VERSION_MISMATCH: return ("DB_VERSION_MISMATCH: Database environment version mismatch"); default: break; }unknown_err: { /* * !!! * Room for a 64-bit number + slop. This buffer is only used * if we're given an unknown error, which should never happen. * Note, however, we're no longer thread-safe if it does. */ static char ebuf[40]; (void)snprintf(ebuf, sizeof(ebuf), "Unknown error: %d", error); return (ebuf); }}/* * __db_err -- * Standard DB error routine. The same as errx, except we don't write * to stderr if no output mechanism was specified. * * PUBLIC: void __db_err __P((const DB_ENV *, const char *, ...)) * PUBLIC: __attribute__ ((__format__ (__printf__, 2, 3))); */void#ifdef STDC_HEADERS__db_err(const DB_ENV *dbenv, const char *fmt, ...)#else__db_err(dbenv, fmt, va_alist) const DB_ENV *dbenv; const char *fmt; va_dcl#endif{ DB_REAL_ERR(dbenv, 0, 0, 0, fmt);}/* * __db_errcall -- * Do the error message work for callback functions. * * PUBLIC: void __db_errcall * PUBLIC: __P((const DB_ENV *, int, int, const char *, va_list)); */void__db_errcall(dbenv, error, error_set, fmt, ap) const DB_ENV *dbenv; int error, error_set; const char *fmt; va_list ap;{ char *p; char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ p = buf; if (fmt != NULL) p += vsnprintf(buf, sizeof(buf), fmt, ap); if (error_set) p += snprintf(p, sizeof(buf) - (size_t)(p - buf), ": %s", db_strerror(error)); dbenv->db_errcall(dbenv, dbenv->db_errpfx, buf);}/* * __db_errfile -- * Do the error message work for FILE *s. * * PUBLIC: void __db_errfile * PUBLIC: __P((const DB_ENV *, int, int, const char *, va_list)); */void__db_errfile(dbenv, error, error_set, fmt, ap) const DB_ENV *dbenv; int error, error_set; const char *fmt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -