summaryrefslogtreecommitdiff
path: root/db/log/log_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'db/log/log_debug.c')
-rw-r--r--db/log/log_debug.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/db/log/log_debug.c b/db/log/log_debug.c
new file mode 100644
index 000000000..f142d88f0
--- /dev/null
+++ b/db/log/log_debug.c
@@ -0,0 +1,153 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1999-2006
+ * Oracle Corporation. All rights reserved.
+ *
+ * $Id: log_debug.c,v 1.9 2006/08/24 14:46:12 bostic Exp $
+ */
+
+#include "db_config.h"
+
+#include "db_int.h"
+#include "dbinc/db_page.h"
+#include "dbinc/db_am.h"
+#include "dbinc/log.h"
+
+static int __log_printf_int __P((DB_ENV *, DB_TXN *, const char *, va_list));
+
+/*
+ * __log_printf_capi --
+ * Write a printf-style format string into the DB log.
+ *
+ * PUBLIC: int __log_printf_capi __P((DB_ENV *, DB_TXN *, const char *, ...))
+ * PUBLIC: __attribute__ ((__format__ (__printf__, 3, 4)));
+ */
+int
+#ifdef STDC_HEADERS
+__log_printf_capi(DB_ENV *dbenv, DB_TXN *txnid, const char *fmt, ...)
+#else
+__log_printf_capi(dbenv, txnid, fmt, va_alist)
+ DB_ENV *dbenv;
+ DB_TXN *txnid;
+ const char *fmt;
+ va_dcl
+#endif
+{
+ va_list ap;
+ int ret;
+
+#ifdef STDC_HEADERS
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+ ret = __log_printf_pp(dbenv, txnid, fmt, ap);
+ va_end(ap);
+
+ return (ret);
+}
+
+/*
+ * __log_printf_pp --
+ * Handle the arguments and call an internal routine to do the work.
+ *
+ * The reason this routine isn't just folded into __log_printf_capi
+ * is because the C++ API has to call a C API routine, and you can
+ * only pass variadic arguments to a single routine.
+ *
+ * PUBLIC: int __log_printf_pp
+ * PUBLIC: __P((DB_ENV *, DB_TXN *, const char *, va_list));
+ */
+int
+__log_printf_pp(dbenv, txnid, fmt, ap)
+ DB_ENV *dbenv;
+ DB_TXN *txnid;
+ const char *fmt;
+ va_list ap;
+{
+ DB_THREAD_INFO *ip;
+ int rep_check, ret, t_ret;
+
+ PANIC_CHECK(dbenv);
+ ENV_REQUIRES_CONFIG(dbenv,
+ dbenv->lg_handle, "DB_ENV->log_printf", DB_INIT_LOG);
+
+ ENV_ENTER(dbenv, ip);
+ rep_check = IS_ENV_REPLICATED(dbenv) ? 1 : 0;
+ if (rep_check && (ret = __env_rep_enter(dbenv, 0)) != 0)
+ return (ret);
+
+ ret = __log_printf_int(dbenv, txnid, fmt, ap);
+
+ if (rep_check && (t_ret = __env_db_rep_exit(dbenv)) != 0 && (ret) == 0)
+ ret = t_ret;
+ va_end(ap);
+ ENV_LEAVE(dbenv, ip);
+
+ return (ret);
+}
+
+/*
+ * __log_printf --
+ * Write a printf-style format string into the DB log.
+ *
+ * PUBLIC: int __log_printf __P((DB_ENV *, DB_TXN *, const char *, ...))
+ * PUBLIC: __attribute__ ((__format__ (__printf__, 3, 4)));
+ */
+int
+#ifdef STDC_HEADERS
+__log_printf(DB_ENV *dbenv, DB_TXN *txnid, const char *fmt, ...)
+#else
+__log_printf(dbenv, txnid, fmt, va_alist)
+ DB_ENV *dbenv;
+ DB_TXN *txnid;
+ const char *fmt;
+ va_dcl
+#endif
+{
+ va_list ap;
+ int ret;
+
+#ifdef STDC_HEADERS
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+ ret = __log_printf_int(dbenv, txnid, fmt, ap);
+ va_end(ap);
+
+ return (ret);
+}
+
+/*
+ * __log_printf_int --
+ * Write a printf-style format string into the DB log (internal).
+ */
+static int
+__log_printf_int(dbenv, txnid, fmt, ap)
+ DB_ENV *dbenv;
+ DB_TXN *txnid;
+ const char *fmt;
+ va_list ap;
+{
+ DBT opdbt, msgdbt;
+ DB_LSN lsn;
+ char __logbuf[2048]; /* !!!: END OF THE STACK DON'T TRUST SPRINTF. */
+
+ if (!DBENV_LOGGING(dbenv)) {
+ __db_errx(dbenv, "Logging not currently permitted");
+ return (EAGAIN);
+ }
+
+ memset(&opdbt, 0, sizeof(opdbt));
+ opdbt.data = "DIAGNOSTIC";
+ opdbt.size = sizeof("DIAGNOSTIC") - 1;
+
+ memset(&msgdbt, 0, sizeof(msgdbt));
+ msgdbt.data = __logbuf;
+ msgdbt.size = (u_int32_t)vsnprintf(__logbuf, sizeof(__logbuf), fmt, ap);
+
+ return (__db_debug_log(
+ dbenv, txnid, &lsn, 0, &opdbt, -1, &msgdbt, NULL, 0));
+}