📄 db_err.c
字号:
va_list ap;{ FILE *fp; fp = dbenv == NULL || dbenv->db_errfile == NULL ? stderr : dbenv->db_errfile; if (dbenv != NULL && dbenv->db_errpfx != NULL) (void)fprintf(fp, "%s: ", dbenv->db_errpfx); if (fmt != NULL) { (void)vfprintf(fp, fmt, ap); if (error_set) (void)fprintf(fp, ": "); } if (error_set) (void)fprintf(fp, "%s", db_strerror(error)); (void)fprintf(fp, "\n"); (void)fflush(fp);}/* * __db_msgadd -- * Aggregate a set of strings into a buffer for the callback API. * * PUBLIC: void __db_msgadd __P((DB_ENV *, DB_MSGBUF *, const char *, ...)) * PUBLIC: __attribute__ ((__format__ (__printf__, 3, 4))); */void#ifdef STDC_HEADERS__db_msgadd(DB_ENV *dbenv, DB_MSGBUF *mbp, const char *fmt, ...)#else__db_msgadd(dbenv, mbp, fmt, va_alist) DB_ENV *dbenv; DB_MSGBUF *mbp; const char *fmt; va_dcl#endif{ va_list ap; size_t len, olen; char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */#ifdef STDC_HEADERS va_start(ap, fmt);#else va_start(ap);#endif len = (size_t)vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); /* * There's a heap buffer in the DB_ENV handle we use to aggregate the * message chunks. We maintain a pointer to the buffer, the next slot * to be filled in in the buffer, and a total buffer length. */ olen = (size_t)(mbp->cur - mbp->buf); if (olen + len >= mbp->len) { if (__os_realloc(dbenv, mbp->len + len + 256, &mbp->buf)) return; mbp->len += (len + 256); mbp->cur = mbp->buf + olen; } memcpy(mbp->cur, buf, len + 1); mbp->cur += len;}/* * __db_msg -- * Standard DB stat message routine. * * PUBLIC: void __db_msg __P((const DB_ENV *, const char *, ...)) * PUBLIC: __attribute__ ((__format__ (__printf__, 2, 3))); */void#ifdef STDC_HEADERS__db_msg(const DB_ENV *dbenv, const char *fmt, ...)#else__db_msg(dbenv, fmt, va_alist) const DB_ENV *dbenv; const char *fmt; va_dcl#endif{ DB_REAL_MSG(dbenv, fmt);}/* * __db_msgcall -- * Do the message work for callback functions. */static void__db_msgcall(dbenv, fmt, ap) const DB_ENV *dbenv; const char *fmt; va_list ap;{ char buf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ (void)vsnprintf(buf, sizeof(buf), fmt, ap); dbenv->db_msgcall(dbenv, buf);}/* * __db_msgfile -- * Do the message work for FILE *s. */static void__db_msgfile(dbenv, fmt, ap) const DB_ENV *dbenv; const char *fmt; va_list ap;{ FILE *fp; fp = dbenv == NULL || dbenv->db_msgfile == NULL ? stdout : dbenv->db_msgfile; (void)vfprintf(fp, fmt, ap); (void)fprintf(fp, "\n"); (void)fflush(fp);}/* * __db_logmsg -- * Write information into the DB log. * * PUBLIC: void __db_logmsg __P((const DB_ENV *, * PUBLIC: DB_TXN *, const char *, u_int32_t, const char *, ...)) * PUBLIC: __attribute__ ((__format__ (__printf__, 5, 6))); */void#ifdef STDC_HEADERS__db_logmsg(const DB_ENV *dbenv, DB_TXN *txnid, const char *opname, u_int32_t flags, const char *fmt, ...)#else__db_logmsg(dbenv, txnid, opname, flags, fmt, va_alist) const DB_ENV *dbenv; DB_TXN *txnid; const char *opname, *fmt; u_int32_t flags; va_dcl#endif{ DBT opdbt, msgdbt; DB_LSN lsn; va_list ap; char __logbuf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */ if (!LOGGING_ON(dbenv)) return;#ifdef STDC_HEADERS va_start(ap, fmt);#else va_start(ap);#endif memset(&opdbt, 0, sizeof(opdbt)); opdbt.data = (void *)opname; opdbt.size = (u_int32_t)(strlen(opname) + 1); memset(&msgdbt, 0, sizeof(msgdbt)); msgdbt.data = __logbuf; msgdbt.size = (u_int32_t)vsnprintf(__logbuf, sizeof(__logbuf), fmt, ap); va_end(ap); /* * XXX * Explicitly discard the const. Otherwise, we have to const DB_ENV * references throughout the logging subsystem. */ (void)__db_debug_log( (DB_ENV *)dbenv, txnid, &lsn, flags, &opdbt, -1, &msgdbt, NULL, 0);}/* * __db_unknown_flag -- report internal error * * PUBLIC: int __db_unknown_flag __P((DB_ENV *, char *, u_int32_t)); */int__db_unknown_flag(dbenv, routine, flag) DB_ENV *dbenv; char *routine; u_int32_t flag;{ __db_err(dbenv, "%s: Unknown flag: %#x", routine, (u_int)flag); DB_ASSERT(0); return (EINVAL);}/* * __db_unknown_type -- report internal error * * PUBLIC: int __db_unknown_type __P((DB_ENV *, char *, DBTYPE)); */int__db_unknown_type(dbenv, routine, type) DB_ENV *dbenv; char *routine; DBTYPE type;{ __db_err(dbenv, "%s: Unexpected DB type: %s", routine, __db_dbtype_to_string(type)); DB_ASSERT(0); return (EINVAL);}/* * __db_check_txn -- * Check for common transaction errors. * * PUBLIC: int __db_check_txn __P((DB *, DB_TXN *, u_int32_t, int)); */int__db_check_txn(dbp, txn, assoc_lid, read_op) DB *dbp; DB_TXN *txn; u_int32_t assoc_lid; int read_op;{ DB_ENV *dbenv; int isp, ret; dbenv = dbp->dbenv; /* * If we are in recovery or aborting a transaction, then we * don't need to enforce the rules about dbp's not allowing * transactional operations in non-transactional dbps and * vica-versa. This happens all the time as the dbp during * an abort may be transactional, but we undo operations * outside a transaction since we're aborting. */ if (IS_RECOVERING(dbenv) || F_ISSET(dbp, DB_AM_RECOVER)) return (0); /* * Check for common transaction errors: * Failure to pass a transaction handle to a DB operation * Failure to configure the DB handle in a proper environment * Operation on a handle whose open commit hasn't completed. * * Read operations don't require a txn even if we've used one before * with this handle, although if they do have a txn, we'd better be * prepared for it. */ if (txn == NULL) { if (!read_op && F_ISSET(dbp, DB_AM_TXN)) { __db_err(dbenv, "DB handle previously used in transaction, missing transaction handle"); return (EINVAL); } if (dbp->cur_lid >= TXN_MINIMUM) goto open_err; } else { if (F_ISSET(txn, TXN_DEADLOCK)) { __db_err(dbenv, "Previous deadlock return not resolved"); return (EINVAL); } if (dbp->cur_lid >= TXN_MINIMUM && dbp->cur_lid != txn->txnid) { if ((ret = __lock_locker_is_parent(dbenv, dbp->cur_lid, txn->txnid, &isp)) != 0) return (ret); if (!isp) goto open_err; } if (!TXN_ON(dbenv)) return (__db_not_txn_env(dbenv)); if (!F_ISSET(dbp, DB_AM_TXN)) { __db_err(dbenv, "Transaction specified for a DB handle opened outside a transaction"); return (EINVAL); } } /* * If dbp->associate_lid is not DB_LOCK_INVALIDID, that means we're in * the middle of a DB->associate with DB_CREATE (i.e., a secondary index * creation). * * In addition to the usual transaction rules, we need to lock out * non-transactional updates that aren't part of the associate (and * thus are using some other locker ID). * * Transactional updates should simply block; from the time we * decide to build the secondary until commit, we'll hold a write * lock on all of its pages, so it should be safe to attempt to update * the secondary in another transaction (presumably by updating the * primary). */ if (!read_op && dbp->associate_lid != DB_LOCK_INVALIDID && txn != NULL && dbp->associate_lid != assoc_lid) { __db_err(dbenv, "Operation forbidden while secondary index is being created"); return (EINVAL); } return (0);open_err: __db_err(dbenv, "Transaction that opened the DB handle is still active"); return (EINVAL);}/* * __db_not_txn_env -- * DB handle must be in an environment that supports transactions. * * PUBLIC: int __db_not_txn_env __P((DB_ENV *)); */int__db_not_txn_env(dbenv) DB_ENV *dbenv;{ __db_err(dbenv, "DB environment not configured for transactions"); return (EINVAL);}/* * __db_rec_toobig -- * Fixed record length exceeded error message. * * PUBLIC: int __db_rec_toobig __P((DB_ENV *, u_int32_t, u_int32_t)); */int__db_rec_toobig(dbenv, data_len, fixed_rec_len) DB_ENV *dbenv; u_int32_t data_len, fixed_rec_len;{ __db_err(dbenv, "%s: length of %lu larger than database's value of %lu", "Record length error", (u_long)data_len, (u_long)fixed_rec_len); return (EINVAL);}/* * __db_rec_repl -- * Fixed record replacement length error message. * * PUBLIC: int __db_rec_repl __P((DB_ENV *, u_int32_t, u_int32_t)); */int__db_rec_repl(dbenv, data_size, data_dlen) DB_ENV *dbenv; u_int32_t data_size, data_dlen;{ __db_err(dbenv, "%s: replacement length %lu differs from replaced length %lu", "Record length error", (u_long)data_size, (u_long)data_dlen); return (EINVAL);}/* * __db_check_lsn -- * Display the log sequence error message. * * PUBLIC: int __db_check_lsn __P((DB_ENV *, DB_LSN *, DB_LSN *)); */int__db_check_lsn(dbenv, lsn, prev) DB_ENV *dbenv; DB_LSN *lsn, *prev;{ __db_err(dbenv, "Log sequence error: page LSN %lu %lu; previous LSN %lu %lu", (u_long)(lsn)->file, (u_long)(lsn)->offset, (u_long)(prev)->file, (u_long)(prev)->offset); return (EINVAL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -