summaryrefslogtreecommitdiff
path: root/db-4.8.30/dist/template/rec_utemp
diff options
context:
space:
mode:
Diffstat (limited to 'db-4.8.30/dist/template/rec_utemp')
-rw-r--r--db-4.8.30/dist/template/rec_utemp68
1 files changed, 68 insertions, 0 deletions
diff --git a/db-4.8.30/dist/template/rec_utemp b/db-4.8.30/dist/template/rec_utemp
new file mode 100644
index 0000000..dc3431b
--- /dev/null
+++ b/db-4.8.30/dist/template/rec_utemp
@@ -0,0 +1,68 @@
+/*
+ * PREF_FUNC_recover --
+ * Recovery function for FUNC.
+ *
+ * PUBLIC: int PREF_FUNC_recover
+ * PUBLIC: __P((dbenv *, DBT *, DB_LSN *, db_recops));
+ */
+int
+PREF_FUNC_recover(dbenv, dbtp, lsnp, op)
+ dbenv *dbenv;
+ DBT *dbtp;
+ DB_LSN *lsnp;
+ db_recops op;
+{
+ PREF_DUP_args *argp;
+ int cmp_n, cmp_p, modified, ret;
+
+#ifdef DEBUG_RECOVER
+ (void)PREF_DUP_print(dbenv, dbtp, lsnp, op);
+#endif
+ argp = NULL;
+ if ((ret = PREF_DUP_read(dbenv, dbtp->data, &argp)) != 0)
+ goto out;
+
+ modified = 0;
+ cmp_n = 0;
+ cmp_p = 0;
+
+ /*
+ * The function now needs to calculate cmp_n and cmp_p based
+ * on whatever is in argp (usually an LSN representing the state
+ * of an object BEFORE the operation described in this record was
+ * applied) and whatever other information the function needs,
+ * e.g., the LSN of the object as it exists now.
+ *
+ * cmp_p should be set to 0 if the current state of the object
+ * is believed to be same as the state of the object BEFORE the
+ * described operation was applied. For example, if you had an
+ * LSN in the log record (argp->prevlsn) and a current LSN of the
+ * object (curlsn), you might want to do:
+ *
+ * cmp_p = log_compare(curlsn, argp->prevlsn);
+ *
+ * Similarly, cmp_n should be set to 0 if the current state
+ * of the object reflects the object AFTER this operation has
+ * been applied. Thus, if you can figure out an object's current
+ * LSN, yo might set cmp_n as:
+ *
+ * cmp_n = log_compare(lsnp, curlsn);
+ */
+ if (cmp_p == 0 && DB_REDO(op)) {
+ /* Need to redo update described. */
+ modified = 1;
+ } else if (cmp_n == 0 && !DB_REDO(op)) {
+ /* Need to undo update described. */
+ modified = 1;
+ }
+
+ /* Allow for following LSN pointers through a transaction. */
+ *lsnp = argp->prev_lsn;
+ ret = 0;
+
+out: if (argp != NULL)
+ free(argp);
+
+ return (ret);
+}
+