aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/heap/heapam.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-07-11 18:01:45 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-07-11 18:01:45 +0000
commit94d4d240bb5c75124a270d1b5fecab1822cd4728 (patch)
tree363326d8953a9d7a72006f22cf38299baac3dd41 /src/backend/access/heap/heapam.c
parent98e9775a3ad56754de1caa2558c66a0040933460 (diff)
downloadpostgresql-94d4d240bb5c75124a270d1b5fecab1822cd4728.tar.gz
postgresql-94d4d240bb5c75124a270d1b5fecab1822cd4728.zip
Rename XLOG_BTREE_NEWPAGE xlog record type into XLOG_HEAP_NEWPAGE, and
shift support code into heapam.c accordingly. This is in service of soon-to-be-committed ALTER TABLE SET TABLESPACE code that will want to use this same record type for both heaps and indexes. Theoretically I should have forced initdb for this, but in practice there is no change in xlog contents because CVS tip will never really emit this record type anyhow...
Diffstat (limited to 'src/backend/access/heap/heapam.c')
-rw-r--r--src/backend/access/heap/heapam.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 8e595c18cb8..f0be8123f5c 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.169 2004/06/18 06:13:09 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.170 2004/07/11 18:01:44 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -2190,6 +2190,39 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
}
static void
+heap_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
+{
+ xl_heap_newpage *xlrec = (xl_heap_newpage *) XLogRecGetData(record);
+ Relation reln;
+ Buffer buffer;
+ Page page;
+
+ /*
+ * Note: the NEWPAGE log record is used for both heaps and indexes,
+ * so do not do anything that assumes we are touching a heap.
+ */
+
+ if (!redo || (record->xl_info & XLR_BKP_BLOCK_1))
+ return;
+
+ reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->node);
+ if (!RelationIsValid(reln))
+ return;
+ buffer = XLogReadBuffer(true, reln, xlrec->blkno);
+ if (!BufferIsValid(buffer))
+ elog(PANIC, "heap_newpage_redo: no block");
+ page = (Page) BufferGetPage(buffer);
+
+ Assert(record->xl_len == SizeOfHeapNewpage + BLCKSZ);
+ memcpy(page, (char *) xlrec + SizeOfHeapNewpage, BLCKSZ);
+
+ PageSetLSN(page, lsn);
+ PageSetSUI(page, ThisStartUpID);
+ LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
+ WriteBuffer(buffer);
+}
+
+static void
heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
{
xl_heap_delete *xlrec = (xl_heap_delete *) XLogRecGetData(record);
@@ -2603,6 +2636,8 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
heap_xlog_update(true, lsn, record, true);
else if (info == XLOG_HEAP_CLEAN)
heap_xlog_clean(true, lsn, record);
+ else if (info == XLOG_HEAP_NEWPAGE)
+ heap_xlog_newpage(true, lsn, record);
else
elog(PANIC, "heap_redo: unknown op code %u", info);
}
@@ -2623,6 +2658,8 @@ heap_undo(XLogRecPtr lsn, XLogRecord *record)
heap_xlog_update(false, lsn, record, true);
else if (info == XLOG_HEAP_CLEAN)
heap_xlog_clean(false, lsn, record);
+ else if (info == XLOG_HEAP_NEWPAGE)
+ heap_xlog_newpage(false, lsn, record);
else
elog(PANIC, "heap_undo: unknown op code %u", info);
}
@@ -2677,6 +2714,14 @@ heap_desc(char *buf, uint8 xl_info, char *rec)
xlrec->node.spcNode, xlrec->node.dbNode,
xlrec->node.relNode, xlrec->block);
}
+ else if (info == XLOG_HEAP_NEWPAGE)
+ {
+ xl_heap_newpage *xlrec = (xl_heap_newpage *) rec;
+
+ sprintf(buf + strlen(buf), "newpage: rel %u/%u/%u; blk %u",
+ xlrec->node.spcNode, xlrec->node.dbNode,
+ xlrec->node.relNode, xlrec->blkno);
+ }
else
strcat(buf, "UNKNOWN");
}