88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.169 2004/06/18 06:13:09 tgl Exp $
11+ * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.170 2004/07/11 18:01:44 tgl Exp $
1212 *
1313 *
1414 * INTERFACE ROUTINES
@@ -2189,6 +2189,39 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
21892189 WriteBuffer (buffer );
21902190}
21912191
2192+ static void
2193+ heap_xlog_newpage (bool redo , XLogRecPtr lsn , XLogRecord * record )
2194+ {
2195+ xl_heap_newpage * xlrec = (xl_heap_newpage * ) XLogRecGetData (record );
2196+ Relation reln ;
2197+ Buffer buffer ;
2198+ Page page ;
2199+
2200+ /*
2201+ * Note: the NEWPAGE log record is used for both heaps and indexes,
2202+ * so do not do anything that assumes we are touching a heap.
2203+ */
2204+
2205+ if (!redo || (record -> xl_info & XLR_BKP_BLOCK_1 ))
2206+ return ;
2207+
2208+ reln = XLogOpenRelation (redo , RM_HEAP_ID , xlrec -> node );
2209+ if (!RelationIsValid (reln ))
2210+ return ;
2211+ buffer = XLogReadBuffer (true, reln , xlrec -> blkno );
2212+ if (!BufferIsValid (buffer ))
2213+ elog (PANIC , "heap_newpage_redo: no block" );
2214+ page = (Page ) BufferGetPage (buffer );
2215+
2216+ Assert (record -> xl_len == SizeOfHeapNewpage + BLCKSZ );
2217+ memcpy (page , (char * ) xlrec + SizeOfHeapNewpage , BLCKSZ );
2218+
2219+ PageSetLSN (page , lsn );
2220+ PageSetSUI (page , ThisStartUpID );
2221+ LockBuffer (buffer , BUFFER_LOCK_UNLOCK );
2222+ WriteBuffer (buffer );
2223+ }
2224+
21922225static void
21932226heap_xlog_delete (bool redo , XLogRecPtr lsn , XLogRecord * record )
21942227{
@@ -2603,6 +2636,8 @@ heap_redo(XLogRecPtr lsn, XLogRecord *record)
26032636 heap_xlog_update (true, lsn , record , true);
26042637 else if (info == XLOG_HEAP_CLEAN )
26052638 heap_xlog_clean (true, lsn , record );
2639+ else if (info == XLOG_HEAP_NEWPAGE )
2640+ heap_xlog_newpage (true, lsn , record );
26062641 else
26072642 elog (PANIC , "heap_redo: unknown op code %u" , info );
26082643}
@@ -2623,6 +2658,8 @@ heap_undo(XLogRecPtr lsn, XLogRecord *record)
26232658 heap_xlog_update (false, lsn , record , true);
26242659 else if (info == XLOG_HEAP_CLEAN )
26252660 heap_xlog_clean (false, lsn , record );
2661+ else if (info == XLOG_HEAP_NEWPAGE )
2662+ heap_xlog_newpage (false, lsn , record );
26262663 else
26272664 elog (PANIC , "heap_undo: unknown op code %u" , info );
26282665}
@@ -2677,6 +2714,14 @@ heap_desc(char *buf, uint8 xl_info, char *rec)
26772714 xlrec -> node .spcNode , xlrec -> node .dbNode ,
26782715 xlrec -> node .relNode , xlrec -> block );
26792716 }
2717+ else if (info == XLOG_HEAP_NEWPAGE )
2718+ {
2719+ xl_heap_newpage * xlrec = (xl_heap_newpage * ) rec ;
2720+
2721+ sprintf (buf + strlen (buf ), "newpage: rel %u/%u/%u; blk %u" ,
2722+ xlrec -> node .spcNode , xlrec -> node .dbNode ,
2723+ xlrec -> node .relNode , xlrec -> blkno );
2724+ }
26802725 else
26812726 strcat (buf , "UNKNOWN" );
26822727}
0 commit comments