PostgreSQL Source Code: src/include/access/xlogreader.h File Reference (original) (raw)
1677{
1678
1679
1680
1681#define COPY_HEADER_FIELD(_dst, _size) \
1682 do { \
1683 if (remaining < _size) \
1684 goto shortdata_err; \
1685 memcpy(_dst, ptr, _size); \
1686 ptr += _size; \
1687 remaining -= _size; \
1688 } while(0)
1689
1690 char *ptr;
1691 char *out;
1696
1697 decoded->header = *record;
1698 decoded->lsn = lsn;
1699 decoded->next = NULL;
1705 ptr = (char *) record;
1708
1709
1710 datatotal = 0;
1712 {
1714
1716 {
1717
1718 uint8 main_data_len;
1719
1721
1723 datatotal += main_data_len;
1724 break;
1725
1726 }
1728 {
1729
1730 uint32 main_data_len;
1731
1734 datatotal += main_data_len;
1735 break;
1736
1737 }
1739 {
1741 }
1743 {
1745 }
1747 {
1748
1750 uint8 fork_flags;
1751
1752
1753 for (int i = decoded->max_block_id + 1; i < block_id; ++i)
1755
1756 if (block_id <= decoded->max_block_id)
1757 {
1759 "out-of-order block_id %u at %X/%X",
1760 block_id,
1762 goto err;
1763 }
1765
1766 blk = &decoded->blocks[block_id];
1769
1772 blk->flags = fork_flags;
1775
1777
1779
1781 {
1783 "BKPBLOCK_HAS_DATA set, but no data included at %X/%X",
1785 goto err;
1786 }
1788 {
1790 "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X",
1791 (unsigned int) blk->data_len,
1793 goto err;
1794 }
1796
1798 {
1802
1804
1806 {
1809 else
1811 }
1812 else
1815
1816
1817
1818
1819
1824 {
1826 "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X",
1829 (unsigned int) blk->bimg_len,
1831 goto err;
1832 }
1833
1834
1835
1836
1837
1840 {
1842 "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X",
1846 goto err;
1847 }
1848
1849
1850
1851
1854 {
1856 "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X",
1857 (unsigned int) blk->bimg_len,
1859 goto err;
1860 }
1861
1862
1863
1864
1865
1869 {
1871 "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X",
1872 (unsigned int) blk->data_len,
1874 goto err;
1875 }
1876 }
1878 {
1881 }
1882 else
1883 {
1884 if (rlocator == NULL)
1885 {
1887 "BKPBLOCK_SAME_REL set but no previous rel at %X/%X",
1889 goto err;
1890 }
1891
1893 }
1895 }
1896 else
1897 {
1899 "invalid block_id %u at %X/%X",
1901 goto err;
1902 }
1903 }
1904
1906 goto shortdata_err;
1907
1908
1909
1910
1911
1912
1913
1914
1915 out = ((char *) decoded) +
1918
1919
1920 for (block_id = 0; block_id <= decoded->max_block_id; block_id++)
1921 {
1923
1925 continue;
1926
1928
1930 {
1931
1933 memcpy(out, ptr, blk->bimg_len);
1936 }
1938 {
1939 out = (char *) MAXALIGN(out);
1940 blk->data = out;
1944 }
1945 }
1946
1947
1949 {
1950 out = (char *) MAXALIGN(out);
1955 }
1956
1957
1958 decoded->size = MAXALIGN(out - (char *) decoded);
1960 decoded->size);
1961
1962 return true;
1963
1964shortdata_err:
1966 "record with invalid length at %X/%X",
1969 *errormsg = state->errormsg_buf;
1970
1971 return false;
1972}
void err(int eval, const char *fmt,...)
Assert(PointerIsAligned(start, uint64))
#define InvalidRepOriginId
struct DecodedXLogRecord * next
TransactionId toplevel_xid
RepOriginId record_origin
DecodedBkpBlock blocks[FLEXIBLE_ARRAY_MEMBER]
#define InvalidTransactionId
#define LSN_FORMAT_ARGS(lsn)
static void report_invalid_record(XLogReaderState *state, const char *fmt,...) pg_attribute_printf(2
#define COPY_HEADER_FIELD(_dst, _size)
size_t DecodeXLogRecordRequiredSpace(size_t xl_tot_len)
#define BKPBLOCK_FORK_MASK
#define BKPBLOCK_HAS_DATA
#define BKPIMAGE_HAS_HOLE
#define XLR_BLOCK_ID_DATA_LONG
#define BKPIMAGE_COMPRESSED(info)
#define XLR_BLOCK_ID_TOPLEVEL_XID
#define XLR_BLOCK_ID_DATA_SHORT
#define BKPBLOCK_SAME_REL
#define XLR_BLOCK_ID_ORIGIN
#define BKPBLOCK_HAS_IMAGE