|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.77 2000/07/03 23:58:32 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.78 2000/07/04 01:39:24 vadim Exp $ |
12 | 12 | *
|
13 | 13 | *
|
14 | 14 | * INTERFACE ROUTINES
|
@@ -1125,6 +1125,7 @@ heap_fetch(Relation relation,
|
1125 | 1125 |
|
1126 | 1126 | if (!ItemIdIsUsed(lp))
|
1127 | 1127 | {
|
| 1128 | + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); |
1128 | 1129 | ReleaseBuffer(buffer);
|
1129 | 1130 | *userbuf = InvalidBuffer;
|
1130 | 1131 | tuple->t_datamcxt = NULL;
|
@@ -1331,17 +1332,17 @@ heap_insert(Relation relation, HeapTuple tup)
|
1331 | 1332 | xlrec.mask = tup->t_data->t_infomask;
|
1332 | 1333 |
|
1333 | 1334 | XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_INSERT,
|
1334 |
| - (char*) xlrec, sizeof(xlrec), |
1335 |
| - (char*) tup->t_data + offsetof(HeapTupleHeaderData, tbits), |
1336 |
| - tup->t_len - offsetof(HeapTupleHeaderData, tbits)); |
| 1335 | + (char*) xlrec, SizeOfHeapInsert, |
| 1336 | + (char*) tup->t_data + offsetof(HeapTupleHeaderData, t_bits), |
| 1337 | + tup->t_len - offsetof(HeapTupleHeaderData, t_bits)); |
1337 | 1338 |
|
1338 | 1339 | ((PageHeader) BufferGetPage(buffer))->pd_lsn = recptr;
|
1339 | 1340 | ((PageHeader) BufferGetPage(buffer))->pd_sui = ThisStartUpID;
|
1340 | 1341 | }
|
1341 | 1342 | #endif
|
1342 | 1343 |
|
1343 |
| - WriteBuffer(buffer); |
1344 | 1344 | LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
|
| 1345 | + WriteBuffer(buffer); |
1345 | 1346 |
|
1346 | 1347 | if (IsSystemRelationName(RelationGetRelationName(relation)))
|
1347 | 1348 | RelationMark4RollbackHeapTuple(relation, tup);
|
@@ -1440,7 +1441,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid)
|
1440 | 1441 | xlrec.dtid.cid = GetCurrentCommandId();
|
1441 | 1442 | xlrec.dtid.tid = tp.t_self;
|
1442 | 1443 | XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE,
|
1443 |
| - (char*) xlrec, sizeof(xlrec), NULL, 0); |
| 1444 | + (char*) xlrec, SizeOfHeapDelete, NULL, 0); |
1444 | 1445 |
|
1445 | 1446 | dp->pd_lsn = recptr;
|
1446 | 1447 | dp->pd_sui = ThisStartUpID;
|
@@ -1610,9 +1611,9 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
|
1610 | 1611 | xlrec.mask = newtup->t_data->t_infomask;
|
1611 | 1612 |
|
1612 | 1613 | XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_UPDATE,
|
1613 |
| - (char*) xlrec, sizeof(xlrec), |
1614 |
| - (char*) newtup->t_data + offsetof(HeapTupleHeaderData, tbits), |
1615 |
| - newtup->t_len - offsetof(HeapTupleHeaderData, tbits)); |
| 1614 | + (char*) xlrec, SizeOfHeapUpdate, |
| 1615 | + (char*) newtup->t_data + offsetof(HeapTupleHeaderData, t_bits), |
| 1616 | + newtup->t_len - offsetof(HeapTupleHeaderData, t_bits)); |
1616 | 1617 |
|
1617 | 1618 | if (newbuf != buffer)
|
1618 | 1619 | {
|
@@ -1907,3 +1908,43 @@ heap_restrpos(HeapScanDesc scan)
|
1907 | 1908 | (ScanKey) NULL);
|
1908 | 1909 | }
|
1909 | 1910 | }
|
| 1911 | + |
| 1912 | +#ifdef XLOG |
| 1913 | +void heap_redo(XLogRecPtr lsn, XLogRecord *record) |
| 1914 | +{ |
| 1915 | + uint8 info = record->xl_info & ~XLR_INFO_MASK; |
| 1916 | + |
| 1917 | + if (info == XLOG_HEAP_INSERT) |
| 1918 | + heap_xlog_insert(true, lsn, record); |
| 1919 | + else if (info == XLOG_HEAP_DELETE) |
| 1920 | + heap_xlog_delete(true, lsn, record); |
| 1921 | + else if (info == XLOG_HEAP_UPDATE) |
| 1922 | + heap_xlog_update(true, lsn, record); |
| 1923 | + else if (info == XLOG_HEAP_MOVE) |
| 1924 | + heap_xlog_move(true, lsn, record); |
| 1925 | + else |
| 1926 | + elog(STOP, "heap_redo: unknown op code %u", info); |
| 1927 | +} |
| 1928 | + |
| 1929 | +void heap_undo(XLogRecPtr lsn, XLogRecord *record) |
| 1930 | +{ |
| 1931 | + uint8 info = record->xl_info & ~XLR_INFO_MASK; |
| 1932 | + |
| 1933 | + if (info == XLOG_HEAP_INSERT) |
| 1934 | + heap_xlog_insert(false, lsn, record); |
| 1935 | + else if (info == XLOG_HEAP_DELETE) |
| 1936 | + heap_xlog_delete(false, lsn, record); |
| 1937 | + else if (info == XLOG_HEAP_UPDATE) |
| 1938 | + heap_xlog_update(false, lsn, record); |
| 1939 | + else if (info == XLOG_HEAP_MOVE) |
| 1940 | + heap_xlog_move(false, lsn, record); |
| 1941 | + else |
| 1942 | + elog(STOP, "heap_undo: unknown op code %u", info); |
| 1943 | +} |
| 1944 | + |
| 1945 | +void heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record) |
| 1946 | +{ |
| 1947 | + xl_heap_insert xlrec = XLogRecGetData(record); |
| 1948 | +} |
| 1949 | + |
| 1950 | +#endif /* XLOG */ |
0 commit comments