db47: moved to github
[openwrt.org/packages.git] / libs / 001-sequence_lock.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
diff -ruN db-4.7.25.NC/sequence/sequence.c db-4.7.25.NC.new/sequence/sequence.c
--- db-4.7.25.NC/sequence/sequence.c    2008-05-05 22:25:09.000000000 +0200
+++ db-4.7.25.NC.new/sequence/sequence.c        2009-11-08 12:50:27.000000000 +0100
@@ -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;
 
comments