Submitted By: DJ Lucas <dj_AT_linuxfromscratch_DOT_org>
Date: 2008-09-28
Initial Package Version: 4.7.25
Upstream Status: From Upstream
Origin: http://www.oracle.com/technology/products/berkeley-db/db/update/4.7.25/patch.4.7.25.1
Description: Update to latest patch for 4.7.25 release (avoid improperly named
             patches in LFS).

diff -Naur db-4.7.25-orig/sequence/sequence.c db-4.7.25/sequence/sequence.c
--- db-4.7.25-orig/sequence/sequence.c	2008-05-05 15:25:09.000000000 -0500
+++ db-4.7.25/sequence/sequence.c	2008-09-28 00:03:59.000000000 -0500
@@ -187,7 +187,11 @@
 	if ((ret = __db_get_flags(dbp, &tflags)) != 0)
 		goto err;
 
-	if (DB_IS_READONLY(dbp)) {
+	/*
+	 * We can let replication clients open sequences, but must
+	 * check later that they do not update them.
+	 */
+	if (F_ISSET(dbp, DB_AM_RDONLY)) {
 		ret = __db_rdonly(dbp->env, "DB_SEQUENCE->open");
 		goto err;
 	}
@@ -244,6 +248,11 @@
 		if ((ret != DB_NOTFOUND && ret != DB_KEYEMPTY) ||
 		    !LF_ISSET(DB_CREATE))
 			goto err;
+		if (IS_REP_CLIENT(env) &&
+		    !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+			ret = __db_rdonly(env, "DB_SEQUENCE->open");
+			goto err;
+		}
 		ret = 0;
 
 		rp = &seq->seq_record;
@@ -296,7 +305,12 @@
 	 */
 	rp = seq->seq_data.data;
 	if (rp->seq_version == DB_SEQUENCE_OLDVER) {
-oldver:		rp->seq_version = DB_SEQUENCE_VERSION;
+oldver:		if (IS_REP_CLIENT(env) &&
+		    !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+			ret = __db_rdonly(env, "DB_SEQUENCE->open");
+			goto err;
+		}
+		rp->seq_version = DB_SEQUENCE_VERSION;
 		if (!F_ISSET(env, ENV_LITTLEENDIAN)) {
 			if (IS_DB_AUTO_COMMIT(dbp, txn)) {
 				if ((ret =
@@ -707,6 +721,13 @@
 
 	MUTEX_LOCK(env, seq->mtx_seq);
 
+	if (handle_check && IS_REP_CLIENT(env) &&
+	    !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+		ret = __db_rdonly(env, "DB_SEQUENCE->get");
+		goto err;
+	}
+
+
 	if (rp->seq_min + delta > rp->seq_max) {
 		__db_errx(env, "Sequence overflow");
 		ret = EINVAL;
