summaryrefslogtreecommitdiff
path: root/src/heap/heap_upgrade.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/heap/heap_upgrade.c')
-rw-r--r--src/heap/heap_upgrade.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/heap/heap_upgrade.c b/src/heap/heap_upgrade.c
new file mode 100644
index 00000000..35fa78b9
--- /dev/null
+++ b/src/heap/heap_upgrade.c
@@ -0,0 +1,106 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1996, 2015 Oracle and/or its affiliates. All rights reserved.
+ *
+ * $Id$
+ */
+
+#include "db_config.h"
+
+#include "db_int.h"
+#include "dbinc/blob.h"
+#include "dbinc/db_page.h"
+#include "dbinc/heap.h"
+#include "dbinc/db_upgrade.h"
+
+/*
+ * __heap_60_heapmeta--
+ * Upgrade the version number.
+ *
+ * PUBLIC: int __heap_60_heapmeta
+ * PUBLIC: __P((DB *, char *, u_int32_t, DB_FH *, PAGE *, int *));
+ */
+int
+__heap_60_heapmeta(dbp, real_name, flags, fhp, h, dirtyp)
+ DB *dbp;
+ char *real_name;
+ u_int32_t flags;
+ DB_FH *fhp;
+ PAGE *h;
+ int *dirtyp;
+{
+ HEAPMETA *hmeta;
+
+ COMPQUIET(flags, 0);
+ COMPQUIET(real_name, NULL);
+ COMPQUIET(fhp, NULL);
+ COMPQUIET(dbp, NULL);
+ hmeta = (HEAPMETA *)h;
+
+ hmeta->dbmeta.version = 2;
+ *dirtyp = 1;
+
+ return (0);
+}
+
+/*
+ * __heap_60_heap --
+ * Upgrade the blob records on the database heap pages.
+ *
+ * PUBLIC: int __heap_60_heap
+ * PUBLIC: __P((DB *, char *, u_int32_t, DB_FH *, PAGE *, int *));
+ */
+int
+__heap_60_heap(dbp, real_name, flags, fhp, h, dirtyp)
+ DB *dbp;
+ char *real_name;
+ u_int32_t flags;
+ DB_FH *fhp;
+ PAGE *h;
+ int *dirtyp;
+{
+ HEAPBLOBHDR60 hb60;
+ HEAPBLOBHDR60P1 hb60p1;
+ HEAPHDR *hdr;
+ db_seq_t blob_id, blob_size, file_id;
+ db_indx_t indx, *offtbl;
+ int ret;
+
+ COMPQUIET(flags, 0);
+ COMPQUIET(real_name, NULL);
+ COMPQUIET(fhp, NULL);
+ offtbl = (db_indx_t *)HEAP_OFFSETTBL(dbp, h);
+ ret = 0;
+
+ DB_ASSERT(dbp->env, HEAPBLOBREC60_SIZE == HEAPBLOBREC_SIZE);
+ for (indx = 0; indx <= HEAP_HIGHINDX(h); indx++) {
+ if (offtbl[indx] == 0)
+ continue;
+ hdr = (HEAPHDR *)P_ENTRY(dbp, h, indx);
+ if (F_ISSET(hdr, HEAP_RECBLOB)) {
+ memcpy(&hb60, hdr, HEAPBLOBREC60_SIZE);
+ memset(&hb60p1, 0, HEAPBLOBREC_SIZE);
+ hb60p1.std_hdr.flags = hb60.flags;
+ hb60p1.std_hdr.size = hb60.size;
+ hb60p1.encoding = hb60.encoding;
+ hb60p1.lsn = hb60.lsn;
+ GET_BLOB60_ID(dbp->env, hb60, blob_id, ret);
+ if (ret != 0)
+ return (ret);
+ GET_BLOB60_SIZE(dbp->env, hb60, blob_size, ret);
+ if (ret != 0)
+ return (ret);
+ GET_BLOB60_FILE_ID(dbp->env, &hb60, file_id, ret);
+ if (ret != 0)
+ return (ret);
+ SET_BLOB_ID(&hb60p1, blob_id, HEAPBLOBHDR60P1);
+ SET_BLOB_SIZE(&hb60p1, blob_size, HEAPBLOBHDR60P1);
+ SET_BLOB_FILE_ID(&hb60p1, file_id, HEAPBLOBHDR60P1);
+ memcpy(hdr, &hb60p1, HEAPBLOBREC_SIZE);
+ *dirtyp = 1;
+ }
+ }
+
+ return (ret);
+}