List:Commits« Previous MessageNext Message »
From:knielsen Date:December 14 2005 12:24pm
Subject:bk commit into 5.1 tree (knielsen:1.1965)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of knielsen. When knielsen does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1965 05/12/14 13:24:26 knielsen@stripped +1 -0
  Merge mysql.com:/usr/local/mysql/mysql-mawk
  into  mysql.com:/usr/local/mysql/mysql-5.1-new

  storage/bdb/dist/gen_rec.awk
    1.7 05/12/14 13:23:59 knielsen@stripped +0 -0
    Auto merged

  storage/bdb/dist/gen_rec.awk
    1.3.1.2 05/12/14 13:23:59 knielsen@stripped +0 -0
    Merge rename: bdb/dist/gen_rec.awk -> storage/bdb/dist/gen_rec.awk

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	knielsen
# Host:	rt.int.sifira.dk
# Root:	/usr/local/mysql/mysql-5.1-new/RESYNC

--- 1.3.1.1/bdb/dist/gen_rec.awk	2005-12-14 13:07:42 +01:00
+++ 1.7/storage/bdb/dist/gen_rec.awk	2005-12-14 13:23:59 +01:00
@@ -2,10 +2,10 @@
 #
 # See the file LICENSE for redistribution information.
 #
-# Copyright (c) 1996-2002
+# Copyright (c) 1996-2005
 #	Sleepycat Software.  All rights reserved.
 #
-# $Id: gen_rec.awk,v 11.70 2002/08/08 15:44:47 bostic Exp $
+# $Id: gen_rec.awk,v 12.6 2005/10/12 18:48:44 ubell Exp $
 #
 
 # This awk script generates all the log, print, and read routines for the DB
@@ -34,35 +34,32 @@
 # DB:
 # 	DBPRIVATE	Indicates that a file will be built as part of DB,
 #			rather than compiled independently, and so can use
-#			DB-private interfaces (such as DB_NOCOPY).
+#			DB-private interfaces (such as DB_LOG_NOCOPY).
 #	DB		A DB handle.  Logs the dbreg fileid for that handle,
 #			and makes the *_log interface take a DB * instead of a
 #			DB_ENV *.
 #	PGDBT		Just like DBT, only we know it stores a page or page
 #			header, so we can byte-swap it (once we write the
 #			byte-swapping code, which doesn't exist yet).
-#	WRLOCK
-#	WRLOCKNZ	An ARG that stores a db_pgno_t, which the getpgnos
-#			function should acquire a lock on.  WRLOCK implies
-#			that we should always get the lock;  WRLOCKNZ implies
-#			that we should do so if and only if the pgno is non-zero
-#			(unfortunately, 0 is both PGNO_INVALID and the main
-#			metadata page number).
+#	LOCKS		Just like DBT, but uses a print function for locks.
 
 BEGIN {
 	if (source_file == "" ||
 	    header_file == "" || template_file == "") {
 	    print "Usage: gen_rec.awk requires three variables to be set:"
-	    print "\tsource_file\t-- the C source file being created"
-	    print "\theader_file\t-- the C #include file being created"
+	    print "\theader_file\t-- the recover #include file being created"
+	    print "\tprint_file\t-- the print source file being created"
+	    print "\tsource_file\t-- the recover source file being created"
 	    print "\ttemplate_file\t-- the template file being created"
 	    exit
 	}
 	FS="[\t ][\t ]*"
 	CFILE=source_file
 	HFILE=header_file
+	PFILE=print_file
 	TFILE=template_file
 	dbprivate = 0
+	buf_only = 1;
 }
 /^[ 	]*DBPRIVATE/ {
 	dbprivate = 1
@@ -71,9 +68,17 @@
 	prefix = $2
 	num_funcs = 0;
 
-	# Start .c file.
-	printf("/* Do not edit: automatically built by gen_rec.awk. */\n") \
+	# Start .c files.
+	printf("/* Do not edit: automatically built by gen_rec.awk. */\n\n") \
 	    > CFILE
+	printf("#include \"db_config.h\"\n\n") >> CFILE
+	printf("/* Do not edit: automatically built by gen_rec.awk. */\n\n") \
+	    > PFILE
+	printf("#include \"db_config.h\"\n\n") >> PFILE
+	if (prefix == "__ham")
+		printf("#ifdef HAVE_HASH\n") >> PFILE
+	if (prefix == "__qam")
+		printf("#ifdef HAVE_QUEUE\n") >> PFILE
 
 	# Start .h file, make the entire file conditional.
 	printf("/* Do not edit: automatically built by gen_rec.awk. */\n\n") \
@@ -94,12 +99,14 @@
 	printf("#include \"dbinc/log.h\"\n\n") >> TFILE
 }
 /^[ 	]*INCLUDE/ {
-	if ($3 == "")
-		printf("%s\n", $2) >> CFILE
-	else
-		printf("%s %s\n", $2, $3) >> CFILE
+	for (i = 2; i < NF; i++)
+		printf("%s ", $i) >> CFILE
+	printf("%s\n", $i) >> CFILE
+	for (i = 2; i < NF; i++)
+		printf("%s ", $i) >> PFILE
+	printf("%s\n", $i) >> PFILE
 }
-/^[ 	]*(BEGIN|IGNORED)/ {
+/^[ 	]*(BEGIN|IGNORED|BEGIN_BUF)/ {
 	if (in_begin) {
 		print "Invalid format: missing END statement"
 		exit
@@ -108,21 +115,22 @@
 	is_dbt = 0;
 	has_dbp = 0;
 	is_uint = 0;
-	need_log_function = ($1 == "BEGIN");
+	need_log_function = ($1 == "BEGIN") || ($1 == "BEGIN_BUF");
+	not_buf = ($1 == "BEGIN") || ($1 == "IGNORED");
+	if (not_buf)
+		buf_only = 0;
 	nvars = 0;
 
-	# number of locks that the getpgnos functions will return
-	nlocks = 0;
-
 	thisfunc = $2;
 	funcname = sprintf("%s_%s", prefix, $2);
 
-	rectype = $3;
+	if (not_buf)
+		rectype = $3;
 
 	funcs[num_funcs] = funcname;
 	++num_funcs;
 }
-/^[ 	]*(DB|ARG|DBT|PGDBT|POINTER|WRLOCK|WRLOCKNZ)/ {
+/^[ 	]*(DB|ARG|DBT|LOCKS|PGDBT|POINTER|TIME)/ {
 	vars[nvars] = $2;
 	types[nvars] = $3;
 	atypes[nvars] = $1;
@@ -135,7 +143,7 @@
 		has_dbp = 1;
 	}
 
-	if ($1 == "DB" || $1 == "ARG" || $1 == "WRLOCK" || $1 == "WRLOCKNZ") {
+	if ($1 == "DB" || $1 == "ARG" || $1 == "TIME") {
 		sizes[nvars] = sprintf("sizeof(u_int32_t)");
 		is_uint = 1;
 	} else if ($1 == "POINTER")
@@ -148,17 +156,6 @@
 	}
 	nvars++;
 }
-/^[	]*(WRLOCK|WRLOCKNZ)/ {
-	nlocks++;
-
-	if ($1 == "WRLOCK") {
-		lock_if_zero[nlocks] = 1;
-	} else {
-		lock_if_zero[nlocks] = 0;
-	}
-
-	lock_pgnos[nlocks] = $2;
-}
 /^[ 	]*END/ {
 	if (!in_begin) {
 		print "Invalid format: missing BEGIN statement"
@@ -166,14 +163,18 @@
 	}
 
 	# Declare the record type.
-	printf("#define\tDB_%s\t%d\n", funcname, rectype) >> HFILE
+	if (not_buf) {
+		printf("#define\tDB_%s\t%d\n", funcname, rectype) >> HFILE
+	}
 
 	# Structure declaration.
 	printf("typedef struct _%s_args {\n", funcname) >> HFILE
 
 	# Here are the required fields for every structure
-	printf("\tu_int32_t type;\n\tDB_TXN *txnid;\n") >> HFILE
-	printf("\tDB_LSN prev_lsn;\n") >>HFILE
+	if (not_buf) {
+		printf("\tu_int32_t type;\n\tDB_TXN *txnid;\n") >> HFILE
+		printf("\tDB_LSN prev_lsn;\n") >>HFILE
+	}
 
 	# Here are the specified fields.
 	for (i = 0; i < nvars; i++) {
@@ -186,25 +187,22 @@
 	}
 	printf("} %s_args;\n\n", funcname) >> HFILE
 
-	# Output the log, print, read, and getpgnos functions.
+	# Output the log, print and read functions.
 	if (need_log_function) {
 		log_function();
-
-		# The getpgnos function calls DB-private (__rep_*) functions,
-		# so we only generate it for our own logging functions,
-		# not application-specific ones.
-		if (dbprivate) {
-			getpgnos_function();
-		}
 	}
-	print_function();
+	if (not_buf) {
+		print_function();
+	}
 	read_function();
 
 	# Recovery template
-	cmd = sprintf(\
+	if (not_buf) {
+		cmd = sprintf(\
     "sed -e s/PREF/%s/ -e s/FUNC/%s/ < template/rec_ctemp >> %s",
-	    prefix, thisfunc, TFILE)
-	system(cmd);
+		    prefix, thisfunc, TFILE)
+		system(cmd);
+	}
 
 	# Done writing stuff, reset and continue.
 	in_begin = 0;
@@ -214,79 +212,63 @@
 	# End the conditional for the HFILE
 	printf("#endif\n") >> HFILE;
 
+	if (buf_only == 1)
+		exit
+
 	# Print initialization routine; function prototype
 	p[1] = sprintf("int %s_init_print %s%s", prefix,
 	    "__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
 	    "db_recops, void *), size_t *));");
 	p[2] = "";
-	proto_format(p);
+	proto_format(p, PFILE);
 
 	# Create the routine to call __db_add_recovery(print_fn, id)
 	printf("int\n%s_init_print(dbenv, dtabp, dtabsizep)\n", \
-	    prefix) >> CFILE;
-	printf("\tDB_ENV *dbenv;\n") >> CFILE;;
-	printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> CFILE;
-	printf(" db_recops, void *));\n") >> CFILE;
-	printf("\tsize_t *dtabsizep;\n{\n") >> CFILE;
+	    prefix) >> PFILE;
+	printf("\tDB_ENV *dbenv;\n") >> PFILE;;
+	printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> PFILE;
+	printf(" db_recops, void *));\n") >> PFILE;
+	printf("\tsize_t *dtabsizep;\n{\n") >> PFILE;
 	# If application-specific, the user will need a prototype for
 	# __db_add_recovery, since they won't have DB's.
 	if (!dbprivate) {
-		printf("\tint __db_add_recovery __P((DB_ENV *,\n") >> CFILE;
+		printf("\tint __db_add_recovery __P((DB_ENV *,\n") >> PFILE;
 		printf(\
-"\t    int (***)(DB_ENV *, DBT *, DB_LSN *, db_recops, void *),\n") >> CFILE;
-		printf("\t    size_t *,\n") >> CFILE;
+"\t    int (***)(DB_ENV *, DBT *, DB_LSN *, db_recops, void *),\n") >> PFILE;
+		printf("\t    size_t *,\n") >> PFILE;
 		printf(\
 "\t    int (*)(DB_ENV *, DBT *, DB_LSN *, db_recops, void *), u_int32_t));\n") \
-		    >> CFILE;
+		    >> PFILE;
 	}
 
-	printf("\tint ret;\n\n") >> CFILE;
+	printf("\tint ret;\n\n") >> PFILE;
 	for (i = 0; i < num_funcs; i++) {
-		printf("\tif ((ret = __db_add_recovery(dbenv, ") >> CFILE;
-		printf("dtabp, dtabsizep,\n") >> CFILE;
+		printf("\tif ((ret = __db_add_recovery(dbenv, ") >> PFILE;
+		printf("dtabp, dtabsizep,\n") >> PFILE;
 		printf("\t    %s_print, DB_%s)) != 0)\n", \
-		    funcs[i], funcs[i]) >> CFILE;
-		printf("\t\treturn (ret);\n") >> CFILE;
+		    funcs[i], funcs[i]) >> PFILE;
+		printf("\t\treturn (ret);\n") >> PFILE;
 	}
-	printf("\treturn (0);\n}\n\n") >> CFILE;
-
-	# We only want to generate *_init_{getpgnos,recover} functions
-	# if this is a DB-private, rather than application-specific,
-	# set of recovery functions.  Application-specific recovery functions
-	# should be dispatched using the DB_ENV->set_app_dispatch callback
-	# rather than a DB dispatch table ("dtab").
+	printf("\treturn (0);\n}\n") >> PFILE;
+	if (prefix == "__ham")
+		printf("#endif /* HAVE_HASH */\n") >> PFILE
+	if (prefix == "__qam")
+		printf("#endif /* HAVE_QUEUE */\n") >> PFILE
+
+	# We only want to generate *_init_recover functions if this is a
+	# DB-private, rather than application-specific, set of recovery
+	# functions.  Application-specific recovery functions should be
+	# dispatched using the DB_ENV->set_app_dispatch callback rather
+	# than a DB dispatch table ("dtab").
 	if (!dbprivate)
 		exit
 
-	# Page number initialization routine; function prototype
-	p[1] = sprintf("int %s_init_getpgnos %s%s", prefix,
-	    "__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
-	    "db_recops, void *), size_t *));");
-	p[2] = "";
-	proto_format(p);
-
-	# Create the routine to call db_add_recovery(pgno_fn, id)
-	printf("int\n%s_init_getpgnos(dbenv, dtabp, dtabsizep)\n", \
-	    prefix) >> CFILE;
-	printf("\tDB_ENV *dbenv;\n") >> CFILE;
-	printf("\tint (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *,") >> CFILE;
-	printf(" db_recops, void *));\n") >> CFILE;
-	printf("\tsize_t *dtabsizep;\n{\n\tint ret;\n\n") >> CFILE;
-	for (i = 0; i < num_funcs; i++) {
-		printf("\tif ((ret = __db_add_recovery(dbenv, ") >> CFILE;
-		printf("dtabp, dtabsizep,\n") >> CFILE;
-		printf("\t    %s_getpgnos, DB_%s)) != 0)\n", \
-		    funcs[i], funcs[i]) >> CFILE;
-		printf("\t\treturn (ret);\n") >> CFILE;
-	}
-	printf("\treturn (0);\n}\n\n") >> CFILE;
-
 	# Recover initialization routine
 	p[1] = sprintf("int %s_init_recover %s%s", prefix,
 	    "__P((DB_ENV *, int (***)(DB_ENV *, DBT *, DB_LSN *, ",
 	    "db_recops, void *), size_t *));");
 	p[2] = "";
-	proto_format(p);
+	proto_format(p, CFILE);
 
 	# Create the routine to call db_add_recovery(func, id)
 	printf("int\n%s_init_recover(dbenv, dtabp, dtabsizep)\n", \
@@ -305,37 +287,48 @@
 	printf("\treturn (0);\n}\n") >> CFILE;
 }
 
-function log_function() {
+function log_function()
+{
 	# Write the log function; function prototype
 	pi = 1;
-	p[pi++] = sprintf("int %s_log", funcname);
-	p[pi++] = " ";
-	if (has_dbp == 1) {
-		p[pi++] = "__P((DB *, DB_TXN *, DB_LSN *, u_int32_t";
+	if (not_buf) {
+		p[pi++] = sprintf("int %s_log", funcname);
+		p[pi++] = " ";
+		if (has_dbp == 1) {
+			p[pi++] = "__P((DB *";
+		} else {
+			p[pi++] = "__P((DB_ENV *";
+		}
+		p[pi++] = ", DB_TXN *, DB_LSN *, u_int32_t";
 	} else {
-		p[pi++] = "__P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t";
+		p[pi++] = sprintf("int %s_buf", funcname);
+		p[pi++] = " ";
+		p[pi++] = "__P((u_int8_t *, size_t, size_t *";
 	}
 	for (i = 0; i < nvars; i++) {
 		if (modes[i] == "DB")
 			continue;
 		p[pi++] = ", ";
 		p[pi++] = sprintf("%s%s%s",
-		    (modes[i] == "DBT" || modes[i] == "PGDBT") ? "const " : "",
-		    types[i],
-		    (modes[i] == "DBT" || modes[i] == "PGDBT") ? " *" : "");
+		    (modes[i] == "DBT" || modes[i] == "LOCKS" ||
+		    modes[i] == "PGDBT") ? "const " : "", types[i],
+		    (modes[i] == "DBT" || modes[i] == "LOCKS" ||
+		    modes[i] == "PGDBT") ? " *" : "");
 	}
 	p[pi++] = "";
 	p[pi++] = "));";
 	p[pi++] = "";
-	proto_format(p);
+	proto_format(p, CFILE);
 
 	# Function declaration
-	if (has_dbp == 1) {
+	if (not_buf && has_dbp == 1) {
 		printf("int\n%s_log(dbp, txnid, ret_lsnp, flags", \
 		    funcname) >> CFILE;
-	} else {
+	} else if (not_buf) {
 		printf("int\n%s_log(dbenv, txnid, ret_lsnp, flags", \
 		    funcname) >> CFILE;
+	} else {
+		printf("int\n%s_buf(buf, max, lenp", funcname) >> CFILE;
 	}
 	for (i = 0; i < nvars; i++) {
 		if (modes[i] == "DB") {
@@ -353,16 +346,22 @@
 	printf(")\n") >> CFILE;
 
 	# Now print the parameters
-	if (has_dbp == 1) {
-		printf("\tDB *dbp;\n") >> CFILE;
+	if (not_buf) {
+		if (has_dbp == 1) {
+			printf("\tDB *dbp;\n") >> CFILE;
+		} else {
+			printf("\tDB_ENV *dbenv;\n") >> CFILE;
+		}
+		printf("\tDB_TXN *txnid;\n\tDB_LSN *ret_lsnp;\n") >> CFILE;
+		printf("\tu_int32_t flags;\n") >> CFILE;
 	} else {
-		printf("\tDB_ENV *dbenv;\n") >> CFILE;
+		printf("\tu_int8_t *buf;\n") >> CFILE;
+		printf("\tsize_t max, *lenp;\n") >> CFILE;
 	}
-	printf("\tDB_TXN *txnid;\n\tDB_LSN *ret_lsnp;\n") >> CFILE;
-	printf("\tu_int32_t flags;\n") >> CFILE;
 	for (i = 0; i < nvars; i++) {
 		# We just skip for modes == DB.
-		if (modes[i] == "DBT" || modes[i] == "PGDBT")
+		if (modes[i] == "DBT" ||
+		     modes[i] == "LOCKS" || modes[i] == "PGDBT")
 			printf("\tconst %s *%s;\n", types[i], vars[i]) >> CFILE;
 		else if (modes[i] != "DB")
 			printf("\t%s %s;\n", types[i], vars[i]) >> CFILE;
@@ -370,110 +369,212 @@
 
 	# Function body and local decls
 	printf("{\n") >> CFILE;
-	printf("\tDBT logrec;\n") >> CFILE;
-	if (has_dbp == 1)
-		printf("\tDB_ENV *dbenv;\n") >> CFILE;
-	printf("\tDB_LSN *lsnp, null_lsn;\n") >> CFILE;
-	if (is_dbt == 1)
-		printf("\tu_int32_t zero;\n") >> CFILE;
-	if (is_uint == 1)
-		printf("\tu_int32_t uinttmp;\n") >> CFILE;
-	printf("\tu_int32_t npad, rectype, txn_num;\n") >> CFILE;
-	printf("\tint ret;\n") >> CFILE;
-	printf("\tu_int8_t *bp;\n\n") >> CFILE;
+	if (not_buf) {
+		printf("\tDBT logrec;\n") >> CFILE;
+		if (has_dbp == 1)
+			printf("\tDB_ENV *dbenv;\n") >> CFILE;
+		if (dbprivate)
+			printf("\tDB_TXNLOGREC *lr;\n") >> CFILE;
+		printf("\tDB_LSN *lsnp, null_lsn, *rlsnp;\n") >> CFILE;
+		printf("\tu_int32_t ") >> CFILE;
+		if (is_dbt == 1)
+			printf("zero, ") >> CFILE;
+		if (is_uint == 1)
+			printf("uinttmp, ") >> CFILE;
+		printf("rectype, txn_num;\n") >> CFILE;
+		printf("\tu_int npad;\n") >> CFILE;
+	} else {
+		if (is_dbt == 1)
+			printf("\tu_int32_t zero;\n") >> CFILE;
+		if (is_uint == 1)
+			printf("\tu_int32_t uinttmp;\n") >> CFILE;
+		printf("\tu_int8_t *endbuf;\n") >> CFILE;
+	}
+	printf("\tu_int8_t *bp;\n") >> CFILE;
+	printf("\tint ") >> CFILE;
+	if (dbprivate && not_buf) {
+		printf("is_durable, ") >> CFILE;
+	}
+	printf("ret;\n\n") >> CFILE;
 
 	# Initialization
-	if (has_dbp == 1)
-		printf("\tdbenv = dbp->dbenv;\n") >> CFILE;
-	printf("\trectype = DB_%s;\n", funcname) >> CFILE;
-	printf("\tnpad = 0;\n\n") >> CFILE;
-
-	printf("\tif (txnid == NULL) {\n") >> CFILE;
-	printf("\t\ttxn_num = 0;\n") >> CFILE;
-	printf("\t\tnull_lsn.file = 0;\n") >> CFILE;
-	printf("\t\tnull_lsn.offset = 0;\n") >> CFILE;
-	printf("\t\tlsnp = &null_lsn;\n") >> CFILE;
-	printf("\t} else {\n") >> CFILE;
-	if (funcname != "__db_debug" && dbprivate) {
-		printf(\
-		    "\t\tif (TAILQ_FIRST(&txnid->kids) != NULL &&\n") >> CFILE;
-		printf("\t\t    (ret = __txn_activekids(") >> CFILE;
-		printf("dbenv, rectype, txnid)) != 0)\n") >> CFILE;
-		printf("\t\t\treturn (ret);\n") >> CFILE;
-	}
-	printf("\t\ttxn_num = txnid->txnid;\n") >> CFILE;
-	printf("\t\tlsnp = &txnid->last_lsn;\n") >> CFILE;
-	printf("\t}\n\n") >> CFILE;
-
-	# Malloc
-	printf("\tlogrec.size = sizeof(rectype) + ") >> CFILE;
-	printf("sizeof(txn_num) + sizeof(DB_LSN)") >> CFILE;
-	for (i = 0; i < nvars; i++)
-		printf("\n\t    + %s", sizes[i]) >> CFILE;
-	printf(";\n") >> CFILE
-	if (dbprivate) {
-		printf("\tif (CRYPTO_ON(dbenv)) {\n") >> CFILE;
-		printf("\t\tnpad =\n") >> CFILE
-		printf(\
-"\t\t    ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);\n")\
+	if (not_buf) {
+		if (has_dbp == 1)
+			printf("\tdbenv = dbp->dbenv;\n") >> CFILE;
+		if (dbprivate)
+			printf("\tCOMPQUIET(lr, NULL);\n\n") >> CFILE;
+		printf("\trectype = DB_%s;\n", funcname) >> CFILE;
+		printf("\tnpad = 0;\n") >> CFILE;
+		printf("\trlsnp = ret_lsnp;\n\n") >> CFILE;
+	}
+	printf("\tret = 0;\n\n") >> CFILE;
+
+	if (not_buf) {
+		if (dbprivate) {
+			printf("\tif (LF_ISSET(DB_LOG_NOT_DURABLE)") \
+			    >> CFILE;
+			if (has_dbp == 1) {
+				printf(" ||\n\t    ") >> CFILE;
+				printf("F_ISSET(dbp, DB_AM_NOT_DURABLE)) {\n") \
+				    >> CFILE;
+			} else {
+				printf(") {\n") >> CFILE;
+				printf("\t\tif (txnid == NULL)\n") >> CFILE;
+				printf("\t\t\treturn (0);\n") >> CFILE;
+			}
+			printf("\t\tis_durable = 0;\n") >> CFILE;
+			printf("\t} else\n") >> CFILE;
+			printf("\t\tis_durable = 1;\n\n") >> CFILE;
+		}
+		printf("\tif (txnid == NULL) {\n") >> CFILE;
+		printf("\t\ttxn_num = 0;\n") >> CFILE;
+		printf("\t\tlsnp = &null_lsn;\n") >> CFILE;
+		printf("\t\tnull_lsn.file = null_lsn.offset = 0;\n") >> CFILE;
+		printf("\t} else {\n") >> CFILE;
+		if (dbprivate && funcname != "__db_debug") {
+			printf(\
+    "\t\tif (TAILQ_FIRST(&txnid->kids) != NULL &&\n") >> CFILE;
+			printf("\t\t    (ret = __txn_activekids(") >> CFILE;
+			printf("dbenv, rectype, txnid)) != 0)\n") >> CFILE;
+			printf("\t\t\treturn (ret);\n") >> CFILE;
+		}
+		printf("\t\t/*\n\t\t * We need to assign begin_lsn while ") \
+		    >> CFILE;
+		printf("holding region mutex.\n") >> CFILE;
+		printf("\t\t * That assignment is done inside the ") >> CFILE;
+		printf("DbEnv->log_put call,\n\t\t * ") >> CFILE;
+		printf("so pass in the appropriate memory location to be ") \
 		    >> CFILE;
-		printf("\t\tlogrec.size += npad;\n\t}\n\n") >> CFILE
+		printf("filled\n\t\t * in by the log_put code.\n\t\t */\n") \
+		    >> CFILE;
+		printf("\t\tDB_SET_TXN_LSNP(txnid, &rlsnp, &lsnp);\n") >> CFILE;
+		printf("\t\ttxn_num = txnid->txnid;\n") >> CFILE;
+		printf("\t}\n\n") >> CFILE;
+
+		# If we're logging a DB handle, make sure we have a log
+		# file ID for it.
+		db_handle_id_function(modes, nvars);
+
+		# Malloc
+		printf("\tlogrec.size = ") >> CFILE;
+		printf("sizeof(rectype) + ") >> CFILE;
+		printf("sizeof(txn_num) + sizeof(DB_LSN)") >> CFILE;
+		for (i = 0; i < nvars; i++)
+			printf("\n\t    + %s", sizes[i]) >> CFILE;
+		printf(";\n") >> CFILE
+		if (dbprivate) {
+			printf("\tif (CRYPTO_ON(dbenv)) {\n") >> CFILE;
+			printf("\t\tnpad =\n") >> CFILE;
+			printf("\t\t    ((DB_CIPHER *)dbenv->crypto_handle)") \
+			    >> CFILE;
+			printf("->adj_size(logrec.size);\n") >> CFILE;
+			printf("\t\tlogrec.size += npad;\n\t}\n\n") >> CFILE
+
+			printf("\tif (is_durable || txnid == NULL) {\n") \
+			    >> CFILE;
+			printf("\t\tif ((ret =\n\t\t    __os_malloc(dbenv, ") \
+			    >> CFILE;
+			printf("logrec.size, &logrec.data)) != 0)\n") >> CFILE;
+			printf("\t\t\treturn (ret);\n") >> CFILE;
+			printf("\t} else {\n") >> CFILE;
+			write_malloc("\t\t",
+			    "lr", "logrec.size + sizeof(DB_TXNLOGREC)", CFILE)
+			printf("#ifdef DIAGNOSTIC\n") >> CFILE;
+			printf("\t\tif ((ret =\n\t\t    __os_malloc(dbenv, ") \
+			    >> CFILE;
+			printf("logrec.size, &logrec.data)) != 0) {\n") \
+			    >> CFILE;
+			printf("\t\t\t__os_free(dbenv, lr);\n") >> CFILE;
+			printf("\t\t\treturn (ret);\n") >> CFILE;
+			printf("\t\t}\n") >> CFILE;
+			printf("#else\n") >> CFILE;
+			printf("\t\tlogrec.data = lr->data;\n") >> CFILE;
+			printf("#endif\n") >> CFILE;
+			printf("\t}\n") >> CFILE;
+		} else {
+			write_malloc("\t", "logrec.data", "logrec.size", CFILE)
+			printf("\tbp = logrec.data;\n\n") >> CFILE;
+		}
+		printf("\tif (npad > 0)\n") >> CFILE;
+		printf("\t\tmemset((u_int8_t *)logrec.data + logrec.size ") \
+		    >> CFILE;
+		printf("- npad, 0, npad);\n\n") >> CFILE;
+		printf("\tbp = logrec.data;\n\n") >> CFILE;
+
+		# Copy args into buffer
+		printf("\tmemcpy(bp, &rectype, sizeof(rectype));\n") >> CFILE;
+		printf("\tbp += sizeof(rectype);\n\n") >> CFILE;
+		printf("\tmemcpy(bp, &txn_num, sizeof(txn_num));\n") >> CFILE;
+		printf("\tbp += sizeof(txn_num);\n\n") >> CFILE;
+		printf("\tmemcpy(bp, lsnp, sizeof(DB_LSN));\n") >> CFILE;
+		printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
+	} else {
+		# If we're logging a DB handle, make sure we have a log
+		# file ID for it.
+		db_handle_id_function(modes, nvars);
+
+		printf("\tbp = buf;\n") >> CFILE;
+		printf("\tendbuf = bp + max;\n\n") >> CFILE
 	}
-	write_malloc("logrec.data", "logrec.size", CFILE)
-	printf("\tif (npad > 0)\n") >> CFILE;
-	printf("\t\tmemset((u_int8_t *)logrec.data + logrec.size ") >> CFILE;
-	printf("- npad, 0, npad);\n\n") >> CFILE;
-
-	# Copy args into buffer
-	printf("\tbp = logrec.data;\n\n") >> CFILE;
-	printf("\tmemcpy(bp, &rectype, sizeof(rectype));\n") >> CFILE;
-	printf("\tbp += sizeof(rectype);\n\n") >> CFILE;
-	printf("\tmemcpy(bp, &txn_num, sizeof(txn_num));\n") >> CFILE;
-	printf("\tbp += sizeof(txn_num);\n\n") >> CFILE;
-	printf("\tmemcpy(bp, lsnp, sizeof(DB_LSN));\n") >> CFILE;
-	printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
 
-	for (i = 0; i < nvars; i ++) {
-		if (modes[i] == "ARG" || modes[i] == "WRLOCK" || \
-		    modes[i] == "WRLOCKNZ") {
+	for (i = 0; i < nvars; i++) {
+		if (modes[i] == "ARG" || modes[i] == "TIME") {
 			printf("\tuinttmp = (u_int32_t)%s;\n", \
 			    vars[i]) >> CFILE;
+			if (!not_buf) {
+				printf(\
+				    "\tif (bp + sizeof(uinttmp) > endbuf)\n") \
+				    >> CFILE;
+				printf("\t\treturn (ENOMEM);\n") >> CFILE;
+			}
 			printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \
 			    >> CFILE;
 			printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;
-		} else if (modes[i] == "DBT" || modes[i] == "PGDBT") {
+		} else if (modes[i] == "DBT" ||  \
+		     modes[i] == "LOCKS" || modes[i] == "PGDBT") {
 			printf("\tif (%s == NULL) {\n", vars[i]) >> CFILE;
 			printf("\t\tzero = 0;\n") >> CFILE;
+			if (!not_buf) {
+				printf(\
+			    "\t\tif (bp + sizeof(u_int32_t) > endbuf)\n") \
+				    >> CFILE;
+				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;
+			}
 			printf("\t\tmemcpy(bp, &zero, sizeof(u_int32_t));\n") \
 				>> CFILE;
 			printf("\t\tbp += sizeof(u_int32_t);\n") >> CFILE;
 			printf("\t} else {\n") >> CFILE;
+			if (!not_buf) {
+				printf(\
+			    "\t\tif (bp + sizeof(%s->size) > endbuf)\n", \
+				    vars[i]) >> CFILE;
+				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;
+			}
 			printf("\t\tmemcpy(bp, &%s->size, ", vars[i]) >> CFILE;
 			printf("sizeof(%s->size));\n", vars[i]) >> CFILE;
 			printf("\t\tbp += sizeof(%s->size);\n", vars[i]) \
 			    >> CFILE;
+			if (!not_buf) {
+				printf("\t\tif (bp + %s->size > endbuf)\n", \
+				    vars[i]) >> CFILE;
+				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;
+			}
 			printf("\t\tmemcpy(bp, %s->data, %s->size);\n", \
 			    vars[i], vars[i]) >> CFILE;
 			printf("\t\tbp += %s->size;\n\t}\n\n", \
 			    vars[i]) >> CFILE;
 		} else if (modes[i] == "DB") {
-			# We need to log a DB handle.  To do this, we
-			# actually just log its fileid;  from that, we'll
-			# be able to acquire an open handle at recovery time.
-			printf("\tDB_ASSERT(dbp->log_filename != NULL);\n") \
-			    >> CFILE;
-			printf("\tif (dbp->log_filename->id == ") >> CFILE;
-			printf("DB_LOGFILEID_INVALID &&\n\t    ") >> CFILE
-			printf("(ret = __dbreg_lazy_id(dbp)) != 0)\n") \
-			    >> CFILE;
-			printf("\t\treturn (ret);\n\n") >> CFILE;
-
 			printf("\tuinttmp = ") >> CFILE;
 			printf("(u_int32_t)dbp->log_filename->id;\n") >> CFILE;
 			printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \
 			    >> CFILE;
 			printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;
 		} else { # POINTER
+			if (!not_buf) {
+				printf("\tif (bp + %s > endbuf)\n", \
+				    sizes[i]) >> CFILE;
+				printf("\t\treturn (ENOMEM);\n") >> CFILE;
+			}
 			printf("\tif (%s != NULL)\n", vars[i]) >> CFILE;
 			printf("\t\tmemcpy(bp, %s, %s);\n", vars[i], \
 			    sizes[i]) >> CFILE;
@@ -486,140 +587,268 @@
 	# Error checking.  User code won't have DB_ASSERT available, but
 	# this is a pretty unlikely assertion anyway, so we just leave it out
 	# rather than requiring assert.h.
-	if (dbprivate) {
-		printf("\tDB_ASSERT((u_int32_t)") >> CFILE;
-		printf("(bp - (u_int8_t *)logrec.data) <= logrec.size);\n") \
-		    >> CFILE;
-	}
+	if (not_buf) {
+		if (dbprivate) {
+			printf("\tDB_ASSERT((u_int32_t)") >> CFILE;
+			printf("(bp - (u_int8_t *)logrec.data) ") >> CFILE;
+			printf("<= logrec.size);\n\n") >> CFILE;
+			# Save the log record off in the txn's linked list,
+			# or do log call.
+			# We didn't call the crypto alignment function when
+			# we created this log record (because we don't have
+			# the right header files to find the function), so
+			# we have to copy the log record to make sure the
+			# alignment is correct.
+			printf("\tif (is_durable || txnid == NULL) {\n") \
+			    >> CFILE;
+			# Output the log record and update the return LSN.
+			printf("\t\tif ((ret = __log_put(dbenv, rlsnp,") \
+			    >> CFILE;
+			printf("(DBT *)&logrec,\n") >> CFILE;
+			printf("\t\t    flags | DB_LOG_NOCOPY)) == 0") >> CFILE;
+			printf(" && txnid != NULL) {\n") >> CFILE;
+			printf("\t\t\t*lsnp = *rlsnp;\n") >> CFILE;
+
+			printf("\t\t\tif (rlsnp != ret_lsnp)\n") >> CFILE;
+			printf("\t\t\t\t *ret_lsnp = *rlsnp;\n") >> CFILE;
+			printf("\t\t}\n\t} else {\n") >> CFILE;
+			printf("#ifdef DIAGNOSTIC\n") >> CFILE;
+
+			# Add the debug bit if we are logging a ND record.
+			printf("\t\t/*\n") >> CFILE;
+			printf("\t\t * Set the debug bit if we are") >> CFILE;
+			printf(" going to log non-durable\n") >> CFILE;
+			printf("\t\t * transactions so they will be ignored") \
+			    >> CFILE;
+			printf(" by recovery.\n") >> CFILE;
+			printf("\t\t */\n") >> CFILE;
+			printf("\t\tmemcpy(lr->data, logrec.data, ") >> CFILE
+			printf("logrec.size);\n") >> CFILE;
+			printf("\t\trectype |= DB_debug_FLAG;\n") >> CFILE;
+			printf("\t\tmemcpy(") >> CFILE
+			printf("logrec.data, &rectype, sizeof(rectype));\n\n") \
+			    >> CFILE;
+			# Output the log record.
+			printf("\t\tret = __log_put(dbenv,\n") >> CFILE;
+			printf("\t\t    rlsnp, (DBT *)&logrec, ") >> CFILE;
+			printf("flags | DB_LOG_NOCOPY);\n") >> CFILE;
+			printf("#else\n") >> CFILE;
+			printf("\t\tret = 0;\n") >> CFILE;
+			printf("#endif\n") >> CFILE;
+			# Add a ND record to the txn list.
+			printf("\t\tSTAILQ_INSERT_HEAD(&txnid") >> CFILE;
+			printf("->logs, lr, links);\n") >> CFILE;
+			printf("\t\tF_SET((TXN_DETAIL *)") >> CFILE;
+			printf("txnid->td, TXN_DTL_INMEMORY);\n") >> CFILE;
+			# Update the return LSN.
+			printf("\t\tLSN_NOT_LOGGED(*ret_lsnp);\n") >> CFILE;
+			printf("\t}\n\n") >> CFILE;
+		} else {
+			printf("\tif ((ret = dbenv->log_put(dbenv, rlsnp,") >> CFILE;
+			printf(" (DBT *)&logrec,\n") >> CFILE;
+			printf("\t    flags | DB_LOG_NOCOPY)) == 0") >> CFILE;
+			printf(" && txnid != NULL) {\n") >> CFILE;
+
+                	# Update the transactions last_lsn.
+			printf("\t\t*lsnp = *rlsnp;\n") >> CFILE;
+			printf("\t\tif (rlsnp != ret_lsnp)\n") >> CFILE;
+			printf("\t\t\t *ret_lsnp = *rlsnp;\n") >> CFILE;
+			printf("\t}\n") >> CFILE;
 
-	# Issue log call
-	# We didn't call the crypto alignment function when we created this
-	# log record (because we don't have the right header files to find
-	# the function), so we have to copy the log record to make sure the
-	# alignment is correct.
-	printf(\
-	    "\tret = dbenv->log_put(dbenv,\n\t   ret_lsnp, (DBT *)&logrec, ") \
-	    >> CFILE;
-	if (dbprivate) {
-		printf("flags | DB_NOCOPY);\n") >> CFILE;
+		}
+		# If out of disk space log writes may fail.  If we are debugging
+		# that print out which records did not make it to disk.
+		printf("#ifdef LOG_DIAGNOSTIC\n") >> CFILE
+		printf("\tif (ret != 0)\n") >> CFILE;
+		printf("\t\t(void)%s_print(dbenv,\n", funcname) >> CFILE;
+		printf("\t\t    (DBT *)&logrec, ret_lsnp, ") >> CFILE
+		printf("DB_TXN_PRINT, NULL);\n#endif\n\n") >> CFILE
+		# Free and return
+		if (dbprivate) {
+			printf("#ifdef DIAGNOSTIC\n") >> CFILE
+			write_free("\t", "logrec.data", CFILE)
+			printf("#else\n") >> CFILE
+			printf("\tif (is_durable || txnid == NULL)\n") >> CFILE;
+			write_free("\t\t", "logrec.data", CFILE)
+			printf("#endif\n") >> CFILE
+		} else {
+			write_free("\t", "logrec.data", CFILE)
+		}
 	} else {
-		printf("flags);\n") >> CFILE;
+		printf("\t*lenp = (u_int32_t)(bp - buf);\n\n") >> CFILE
 	}
 
-	# Update the transactions last_lsn
-	printf("\tif (txnid != NULL && ret == 0)\n") >> CFILE;
-	printf("\t\ttxnid->last_lsn = *ret_lsnp;\n") >> CFILE;
-
-	# If out of disk space log writes may fail.  If we are debugging
-	# that print out which records did not make it to disk.
-	printf("#ifdef LOG_DIAGNOSTIC\n") >> CFILE
-	printf("\tif (ret != 0)\n") >> CFILE;
-	printf("\t\t(void)%s_print(dbenv,\n", funcname) >> CFILE;
-	printf("\t\t    (DBT *)&logrec, ret_lsnp, NULL, NULL);\n") >> CFILE
-	printf("#endif\n") >> CFILE
-
-	# Free and return
-	write_free("logrec.data", CFILE)
 	printf("\treturn (ret);\n}\n\n") >> CFILE;
 }
 
-function print_function() {
+# If we're logging a DB handle, make sure we have a log
+# file ID for it.
+function db_handle_id_function(modes, n)
+{
+	for (i = 0; i < n; i++)
+		if (modes[i] == "DB") {
+			# We actually log the DB handle's fileid; from
+			# that ID we're able to acquire an open handle
+			# at recovery time.
+			printf(\
+		    "\tDB_ASSERT(dbp->log_filename != NULL);\n") \
+			    >> CFILE;
+			printf("\tif (dbp->log_filename->id == ") \
+			    >> CFILE;
+			printf("DB_LOGFILEID_INVALID &&\n\t    ") \
+			    >> CFILE
+			printf("(ret = __dbreg_lazy_id(dbp)) != 0)\n") \
+			    >> CFILE
+			printf("\t\treturn (ret);\n\n") >> CFILE;
+			break;
+		}
+}
+
+function print_function()
+{
 	# Write the print function; function prototype
 	p[1] = sprintf("int %s_print", funcname);
 	p[2] = " ";
 	p[3] = "__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));";
 	p[4] = "";
-	proto_format(p);
+	proto_format(p, PFILE);
 
 	# Function declaration
-	printf("int\n%s_print(dbenv, ", funcname) >> CFILE;
-	printf("dbtp, lsnp, notused2, notused3)\n") >> CFILE;
-	printf("\tDB_ENV *dbenv;\n") >> CFILE;
-	printf("\tDBT *dbtp;\n") >> CFILE;
-	printf("\tDB_LSN *lsnp;\n") >> CFILE;
-	printf("\tdb_recops notused2;\n\tvoid *notused3;\n{\n") >> CFILE;
+	printf("int\n%s_print(dbenv, ", funcname) >> PFILE;
+	printf("dbtp, lsnp, notused2, notused3)\n") >> PFILE;
+	printf("\tDB_ENV *dbenv;\n") >> PFILE;
+	printf("\tDBT *dbtp;\n") >> PFILE;
+	printf("\tDB_LSN *lsnp;\n") >> PFILE;
+	printf("\tdb_recops notused2;\n\tvoid *notused3;\n{\n") >> PFILE;
 
 	# Locals
-	printf("\t%s_args *argp;\n", funcname) >> CFILE;
+	printf("\t%s_args *argp;\n", funcname) >> PFILE;
+	for (i = 0; i < nvars; i ++)
+		if (modes[i] == "TIME") {
+			printf("\tstruct tm *lt;\n") >> PFILE
+			printf("\ttime_t timeval;\n") >> PFILE
+			break;
+		}
 	for (i = 0; i < nvars; i ++)
 		if (modes[i] == "DBT" || modes[i] == "PGDBT") {
-			printf("\tu_int32_t i;\n") >> CFILE
-			printf("\tint ch;\n") >> CFILE
+			printf("\tu_int32_t i;\n") >> PFILE
+			printf("\tint ch;\n") >> PFILE
 			break;
 		}
-
-	printf("\tint ret;\n\n") >> CFILE;
+	printf("\tint ret;\n\n") >> PFILE;
 
 	# Get rid of complaints about unused parameters.
-	printf("\tnotused2 = DB_TXN_ABORT;\n\tnotused3 = NULL;\n\n") >> CFILE;
+	printf("\tnotused2 = DB_TXN_PRINT;\n\tnotused3 = NULL;\n\n") >> PFILE;
 
 	# Call read routine to initialize structure
 	printf("\tif ((ret = %s_read(dbenv, dbtp->data, &argp)) != 0)\n", \
-	    funcname) >> CFILE;
-	printf("\t\treturn (ret);\n") >> CFILE;
+	    funcname) >> PFILE;
+	printf("\t\treturn (ret);\n") >> PFILE;
 
 	# Print values in every record
-	printf("\t(void)printf(\n\t    \"[%%lu][%%lu]%s: ", funcname) >> CFILE;
-	printf("rec: %%lu txnid %%lx ") >> CFILE;
-	printf("prevlsn [%%lu][%%lu]\\n\",\n") >> CFILE;
-	printf("\t    (u_long)lsnp->file,\n") >> CFILE;
-	printf("\t    (u_long)lsnp->offset,\n") >> CFILE;
-	printf("\t    (u_long)argp->type,\n") >> CFILE;
-	printf("\t    (u_long)argp->txnid->txnid,\n") >> CFILE;
-	printf("\t    (u_long)argp->prev_lsn.file,\n") >> CFILE;
-	printf("\t    (u_long)argp->prev_lsn.offset);\n") >> CFILE;
+	printf("\t(void)printf(\n\t    \"[%%lu][%%lu]%s%%s: ",\
+	     funcname) >> PFILE;
+	printf("rec: %%lu txnid %%lx ") >> PFILE;
+	printf("prevlsn [%%lu][%%lu]\\n\",\n") >> PFILE;
+	printf("\t    (u_long)lsnp->file,\n") >> PFILE;
+	printf("\t    (u_long)lsnp->offset,\n") >> PFILE;
+	printf("\t    (argp->type & DB_debug_FLAG) ? \"_debug\" : \"\",\n") \
+	     >> PFILE;
+	printf("\t    (u_long)argp->type,\n") >> PFILE;
+	printf("\t    (u_long)argp->txnid->txnid,\n") >> PFILE;
+	printf("\t    (u_long)argp->prev_lsn.file,\n") >> PFILE;
+	printf("\t    (u_long)argp->prev_lsn.offset);\n") >> PFILE;
 
 	# Now print fields of argp
 	for (i = 0; i < nvars; i ++) {
-		printf("\t(void)printf(\"\\t%s: ", vars[i]) >> CFILE;
+		if (modes[i] == "TIME") {
+			printf("\ttimeval = (time_t)argp->%s;\n",
+			    vars[i]) >> PFILE;
+			printf("\tlt = localtime(&timeval);\n") >> PFILE;
+			printf("\t(void)printf(\n\t    \"\\t%s: ",
+			    vars[i]) >> PFILE;
+		} else
+			printf("\t(void)printf(\"\\t%s: ", vars[i]) >> PFILE;
 
 		if (modes[i] == "DBT" || modes[i] == "PGDBT") {
-			printf("\");\n") >> CFILE;
-			printf("\tfor (i = 0; i < ") >> CFILE;
-			printf("argp->%s.size; i++) {\n", vars[i]) >> CFILE;
+			printf("\");\n") >> PFILE;
+			printf("\tfor (i = 0; i < ") >> PFILE;
+			printf("argp->%s.size; i++) {\n", vars[i]) >> PFILE;
 			printf("\t\tch = ((u_int8_t *)argp->%s.data)[i];\n", \
-			    vars[i]) >> CFILE;
-			printf("\t\tprintf(isprint(ch) || ch == 0x0a") >> CFILE;
-			printf(" ? \"%%c\" : \"%%#x \", ch);\n") >> CFILE;
-			printf("\t}\n\t(void)printf(\"\\n\");\n") >> CFILE;
+			    vars[i]) >> PFILE;
+			printf("\t\tprintf(isprint(ch) || ch == 0x0a") >> PFILE;
+			printf(" ? \"%%c\" : \"%%#x \", ch);\n") >> PFILE;
+			printf("\t}\n\t(void)printf(\"\\n\");\n") >> PFILE;
 		} else if (types[i] == "DB_LSN *") {
 			printf("[%%%s][%%%s]\\n\",\n", \
-			    formats[i], formats[i]) >> CFILE;
+			    formats[i], formats[i]) >> PFILE;
 			printf("\t    (u_long)argp->%s.file,", \
-			    vars[i]) >> CFILE;
+			    vars[i]) >> PFILE;
 			printf(" (u_long)argp->%s.offset);\n", \
-			    vars[i]) >> CFILE;
+			    vars[i]) >> PFILE;
+		} else if (modes[i] == "TIME") {
+			# Time values are displayed in two ways: the standard
+			# string returned by ctime, and in the input format
+			# expected by db_recover -t.
+			printf(\
+	    "%%%s (%%.24s, 20%%02lu%%02lu%%02lu%%02lu%%02lu.%%02lu)\\n\",\n", \
+			    formats[i]) >> PFILE;
+			printf("\t    (long)argp->%s, ", vars[i]) >> PFILE;
+			printf("ctime(&timeval),", vars[i]) >> PFILE;
+			printf("\n\t    (u_long)lt->tm_year - 100, ") >> PFILE;
+			printf("(u_long)lt->tm_mon+1,") >> PFILE;
+			printf("\n\t    (u_long)lt->tm_mday, ") >> PFILE;
+			printf("(u_long)lt->tm_hour,") >> PFILE;
+			printf("\n\t    (u_long)lt->tm_min, ") >> PFILE;
+			printf("(u_long)lt->tm_sec);\n") >> PFILE;
+		} else if (modes[i] == "LOCKS") {
+			printf("\\n\");\n") >> PFILE;
+			printf("\t__lock_list_print(dbenv, &argp->locks);\n") \
+				>> PFILE;
 		} else {
 			if (formats[i] == "lx")
-				printf("0x") >> CFILE;
-			printf("%%%s\\n\", ", formats[i]) >> CFILE;
+				printf("0x") >> PFILE;
+			printf("%%%s\\n\", ", formats[i]) >> PFILE;
 			if (formats[i] == "lx" || formats[i] == "lu")
-				printf("(u_long)") >> CFILE;
+				printf("(u_long)") >> PFILE;
 			if (formats[i] == "ld")
-				printf("(long)") >> CFILE;
-			printf("argp->%s);\n", vars[i]) >> CFILE;
+				printf("(long)") >> PFILE;
+			printf("argp->%s);\n", vars[i]) >> PFILE;
 		}
 	}
-	printf("\t(void)printf(\"\\n\");\n") >> CFILE;
-	write_free("argp", CFILE);
-	printf("\treturn (0);\n") >> CFILE;
-	printf("}\n\n") >> CFILE;
+	printf("\t(void)printf(\"\\n\");\n") >> PFILE;
+	write_free("\t", "argp", PFILE);
+	printf("\treturn (0);\n") >> PFILE;
+	printf("}\n\n") >> PFILE;
 }
 
-function read_function() {
+function read_function()
+{
 	# Write the read function; function prototype
-	p[1] = sprintf("int %s_read __P((DB_ENV *, void *,", funcname);
+	if (not_buf)
+		p[1] = sprintf("int %s_read __P((DB_ENV *, void *,", funcname);
+	else
+		p[1] = sprintf("int %s_read __P((DB_ENV *, void *, void **,", \
+		    funcname);
 	p[2] = " ";
 	p[3] = sprintf("%s_args **));", funcname);
 	p[4] = "";
-	proto_format(p);
+	proto_format(p, CFILE);
 
 	# Function declaration
-	printf("int\n%s_read(dbenv, recbuf, argpp)\n", funcname) >> CFILE;
+	if (not_buf)
+		printf("int\n%s_read(dbenv, recbuf, argpp)\n", funcname) \
+		    >> CFILE;
+	else
+		printf(\
+		    "int\n%s_read(dbenv, recbuf, nextp, argpp)\n", funcname) \
+		    >> CFILE;
 
 	# Now print the parameters
 	printf("\tDB_ENV *dbenv;\n") >> CFILE;
 	printf("\tvoid *recbuf;\n") >> CFILE;
+	if (!not_buf)
+		printf("\tvoid **nextp;\n") >> CFILE;
 	printf("\t%s_args **argpp;\n", funcname) >> CFILE;
 
 	# Function body and local decls
@@ -637,26 +866,37 @@
 		printf("\n\tdbenv = NULL;\n") >> CFILE;
 	}
 
-	malloc_size = sprintf("sizeof(%s_args) + sizeof(DB_TXN)", funcname)
-	write_malloc("argp", malloc_size, CFILE)
+	if (not_buf) {
+		malloc_size = sprintf("sizeof(%s_args) + sizeof(DB_TXN)", \
+		    funcname)
+	} else {
+		malloc_size = sprintf("sizeof(%s_args)", funcname)
+	}
+	write_malloc("\t", "argp", malloc_size, CFILE)
 
 	# Set up the pointers to the txnid.
-	printf("\targp->txnid = (DB_TXN *)&argp[1];\n\n") >> CFILE;
+	printf("\tbp = recbuf;\n") >> CFILE;
 
-	# First get the record type, prev_lsn, and txnid fields.
+	if (not_buf) {
+		printf("\targp->txnid = (DB_TXN *)&argp[1];\n\n") >> CFILE;
 
-	printf("\tbp = recbuf;\n") >> CFILE;
-	printf("\tmemcpy(&argp->type, bp, sizeof(argp->type));\n") >> CFILE;
-	printf("\tbp += sizeof(argp->type);\n\n") >> CFILE;
-	printf("\tmemcpy(&argp->txnid->txnid,  bp, ") >> CFILE;
-	printf("sizeof(argp->txnid->txnid));\n") >> CFILE;
-	printf("\tbp += sizeof(argp->txnid->txnid);\n\n") >> CFILE;
-	printf("\tmemcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));\n") >> CFILE;
-	printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
+		# First get the record type, prev_lsn, and txnid fields.
+
+		printf("\tmemcpy(&argp->type, bp, sizeof(argp->type));\n") \
+		    >> CFILE;
+		printf("\tbp += sizeof(argp->type);\n\n") >> CFILE;
+		printf("\tmemcpy(&argp->txnid->txnid,  bp, ") >> CFILE;
+		printf("sizeof(argp->txnid->txnid));\n") >> CFILE;
+		printf("\tbp += sizeof(argp->txnid->txnid);\n\n") >> CFILE;
+		printf("\tmemcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));\n") \
+		    >> CFILE;
+		printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;
+	}
 
 	# Now get rest of data.
 	for (i = 0; i < nvars; i ++) {
-		if (modes[i] == "DBT" || modes[i] == "PGDBT") {
+		if (modes[i] == "DBT" || \
+		    modes[i] == "LOCKS" || modes[i] == "PGDBT") {
 			printf("\tmemset(&argp->%s, 0, sizeof(argp->%s));\n", \
 			    vars[i], vars[i]) >> CFILE;
 			printf("\tmemcpy(&argp->%s.size, ", vars[i]) >> CFILE;
@@ -664,8 +904,8 @@
 			printf("\tbp += sizeof(u_int32_t);\n") >> CFILE;
 			printf("\targp->%s.data = bp;\n", vars[i]) >> CFILE;
 			printf("\tbp += argp->%s.size;\n", vars[i]) >> CFILE;
-		} else if (modes[i] == "ARG" || modes[i] == "WRLOCK" || \
-		    modes[i] == "WRLOCKNZ" || modes[i] == "DB") {
+		} else if (modes[i] == "ARG" || modes[i] == "TIME" ||
+		    modes[i] == "DB") {
 			printf("\tmemcpy(&uinttmp, bp, sizeof(uinttmp));\n") \
 			    >> CFILE;
 			printf("\targp->%s = (%s)uinttmp;\n", vars[i], \
@@ -680,118 +920,17 @@
 	}
 
 	# Free and return
+	if (!not_buf)
+		printf("\t*nextp = bp;\n") >> CFILE;
 	printf("\t*argpp = argp;\n") >> CFILE;
 	printf("\treturn (0);\n}\n\n") >> CFILE;
 }
 
-function getpgnos_function() {
-	# Write the getpgnos function;  function prototype
-	p[1] = sprintf("int %s_getpgnos", funcname);
-	p[2] = " ";
-	p[3] = "__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));";
-	p[4] = "";
-	proto_format(p);
-
-	# Function declaration
-	printf("int\n%s_getpgnos(dbenv, ", funcname) >> CFILE;
-	printf("rec, lsnp, notused1, summary)\n") >> CFILE;
-	printf("\tDB_ENV *dbenv;\n") >> CFILE;
-	printf("\tDBT *rec;\n") >> CFILE;
-	printf("\tDB_LSN *lsnp;\n") >> CFILE;
-	printf("\tdb_recops notused1;\n") >> CFILE;
-	printf("\tvoid *summary;\n{\n") >> CFILE;
-
-	# If there are no locks, return this fact.
-	if (nlocks == 0) {
-		printf("\tTXN_RECS *t;\n") >> CFILE;
-		printf("\tint ret;\n") >> CFILE;
-		printf("\tCOMPQUIET(rec, NULL);\n") >> CFILE;
-		printf("\tCOMPQUIET(notused1, DB_TXN_ABORT);\n") >> CFILE;
-
-		printf("\n\tt = (TXN_RECS *)summary;\n") >> CFILE;
-		printf("\n\tif ((ret = __rep_check_alloc(dbenv, ") >> CFILE;
-		printf("t, 1)) != 0)\n") >> CFILE;
-		printf("\t\treturn (ret);\n") >> CFILE;
-
-		printf("\n\tt->array[t->npages].flags = LSN_PAGE_NOLOCK;\n") \
-			>> CFILE;
-		printf("\tt->array[t->npages].lsn = *lsnp;\n") >> CFILE;
-		printf("\tt->array[t->npages].fid = DB_LOGFILEID_INVALID;\n") \
-			>> CFILE;
-		printf("\tmemset(&t->array[t->npages].pgdesc, 0,\n") >> CFILE;
-		printf("\t    sizeof(t->array[t->npages].pgdesc));\n") >> CFILE;
-		printf("\n\tt->npages++;\n") >> CFILE;
-
-		printf("\n") >> CFILE;
-		printf("\treturn (0);\n") >> CFILE;
-		printf("}\n\n") >> CFILE;
-		return;
-	}
-
-	# Locals
-	printf("\tDB *dbp;\n") >> CFILE;
-	printf("\tTXN_RECS *t;\n") >> CFILE;
-	printf("\t%s_args *argp;\n", funcname) >> CFILE;
-	printf("\tu_int32_t ret;\n\n") >> CFILE;
-
-	# Shut up compiler.
-	printf("\tCOMPQUIET(notused1, DB_TXN_ABORT);\n\n") >> CFILE;
-
-	printf("\targp = NULL;\n") >> CFILE;
-	printf("\tt = (TXN_RECS *)summary;\n\n") >> CFILE;
-
-	printf("\tif ((ret = %s_read(dbenv, rec->data, &argp)) != 0)\n", \
-		funcname) >> CFILE;
-	printf("\t\treturn (ret);\n") >> CFILE;
-
-	# Get file ID.
-	printf("\n\tif ((ret = __dbreg_id_to_db(dbenv,\n\t    ") >> CFILE;
-	printf("argp->txnid, &dbp, argp->fileid, 0)) != 0)\n") >> CFILE;
-	printf("\t\tgoto err;\n") >> CFILE;
-
-	printf("\n\tif ((ret = __rep_check_alloc(dbenv, t, %d)) != 0)\n", \
-		nlocks) >> CFILE;
-	printf("\t\tgoto err;\n\n") >> CFILE;
-
-	for (i = 1; i <= nlocks; i++) {
-		if (lock_if_zero[i]) {
-			indent = "\t";
-		} else {
-			indent = "\t\t";
-			printf("\tif (argp->%s != PGNO_INVALID) {\n", \
-				lock_pgnos[i]) >> CFILE;
-		}
-		printf("%st->array[t->npages].flags = 0;\n", indent) >> CFILE;
-		printf("%st->array[t->npages].fid = argp->fileid;\n", indent) \
-		    >> CFILE;
-		printf("%st->array[t->npages].lsn = *lsnp;\n", indent) >> CFILE;
-		printf("%st->array[t->npages].pgdesc.pgno = argp->%s;\n", \
-			indent, lock_pgnos[i]) >> CFILE;
-		printf("%st->array[t->npages].pgdesc.type = DB_PAGE_LOCK;\n", \
-			indent) >> CFILE;
-		printf("%smemcpy(t->array[t->npages].pgdesc.fileid, ", indent) \
-			>> CFILE;
-		printf("dbp->fileid,\n%s    DB_FILE_ID_LEN);\n", \
-			indent, indent) >> CFILE;
-		printf("%st->npages++;\n", indent) >> CFILE;
-		if (!lock_if_zero[i]) {
-			printf("\t}\n") >> CFILE;
-		}
-	}
-
-	printf("\nerr:\tif (argp != NULL)\n") >> CFILE;
-	write_free("argp", CFILE);
-
-	printf("\treturn (ret);\n") >> CFILE;
-
-	printf("}\n\n") >> CFILE;
-}
-
 # proto_format --
 #	Pretty-print a function prototype.
-function proto_format(p)
+function proto_format(p, fp)
 {
-	printf("/*\n") >> CFILE;
+	printf("/*\n") >> fp;
 
 	s = "";
 	for (i = 1; i in p; ++i)
@@ -799,46 +938,44 @@
 
 	t = " * PUBLIC: "
 	if (length(s) + length(t) < 80)
-		printf("%s%s", t, s) >> CFILE;
+		printf("%s%s", t, s) >> fp;
 	else {
 		split(s, p, "__P");
 		len = length(t) + length(p[1]);
-		printf("%s%s", t, p[1]) >> CFILE
+		printf("%s%s", t, p[1]) >> fp
 
 		n = split(p[2], comma, ",");
 		comma[1] = "__P" comma[1];
 		for (i = 1; i <= n; i++) {
 			if (len + length(comma[i]) > 70) {
-				printf("\n * PUBLIC:    ") >> CFILE;
+				printf("\n * PUBLIC:    ") >> fp;
 				len = 0;
 			}
-			printf("%s%s", comma[i], i == n ? "" : ",") >> CFILE;
+			printf("%s%s", comma[i], i == n ? "" : ",") >> fp;
 			len += length(comma[i]) + 2;
 		}
 	}
-	printf("\n */\n") >> CFILE;
+	printf("\n */\n") >> fp;
 	delete p;
 }
 
-function write_malloc(ptr, size, file)
+function write_malloc(tab, ptr, size, file)
 {
 	if (dbprivate) {
-		printf("\tif ((ret = ") >> file;
-		printf(\
-		    "__os_malloc(dbenv,\n\t    " size ", &" ptr ")) != 0)\n") \
-		    >> file
-		printf("\t\treturn (ret);\n\n") >> file;
+		print(tab "if ((ret = __os_malloc(dbenv,") >> file
+		print(tab "    " size ", &" ptr ")) != 0)") >> file
+		print(tab "\treturn (ret);") >> file;
 	} else {
-		printf("\tif ((" ptr " = malloc(" size ")) == NULL)\n") >> file
-		printf("\t\treturn (ENOMEM);\n\n") >> file
+		print(tab "if ((" ptr " = malloc(" size ")) == NULL)") >> file
+		print(tab "\treturn (ENOMEM);") >> file
 	}
 }
 
-function write_free(ptr, file)
+function write_free(tab, ptr, file)
 {
 	if (dbprivate) {
-		printf("\t__os_free(dbenv, " ptr ");\n") >> file
+		print(tab "__os_free(dbenv, " ptr ");") >> file
 	} else {
-		printf("\tfree(" ptr ");\n") >> file
+		print(tab "free(" ptr ");") >> file
 	}
 }
Thread
bk commit into 5.1 tree (knielsen:1.1965)knielsen14 Dec