/*-------------------------------------------------------------------------
 *
 * cdbappendonlystoragelayer.h
 *
 * Portions Copyright (c) 2007-2009, Greenplum inc
 * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
 *
 *
 * IDENTIFICATION
 *	    src/include/cdb/cdbappendonlystoragelayer.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef CDBAPPENDONLYSTORAGELAYER_H
#define CDBAPPENDONLYSTORAGELAYER_H

/*
 *
 * General Discussion
 *
 *     This section discusses general information about the Append-Only Storage Layer routines
 *     that are used by the executor.
 *
 *     Executor content is data from 1 byte to 1Gb -1 bytes in length.
 *
 *     Executor content is stored by the Append-Only Storage Layer in blocks.  The layer
 *     handles formatting the storage blocks, optional bulk-compression, and fragmenting large
 *     content into multiple blocks.
 *
 *     The typical use case is content is collected until it will no longer fit in one Append-Only
 *     Storage Block (i.e. blocksize) and then the storage layer is told to write it.
 *
 *     Larger content is fully supported, too.
 *
 *     We assume content contains an integral number of rows and in the future will provide a
 *     storage block directory that quickly locates the storage block that has a row given the
 *     row number.
 *
 *    The executor supplies a small integer value that describes the content (format) when
 *    writing.  The integer is returned on reading to aid the executor in interpreting the content.
 *
 * Session
 *
 *    The executor is responsible for allocating and keeping a small struct that holds data
 *    about a writing or reading session.  The best thing is to initially zero out the memory since
 *    we treat that as no active session.  We provide ~Init routines for starting a session.
 *
 *    UNDONE: Session close / file close responsibility.
 *    UNDONE: Who is responsible for flushing write files?
 *
 * Memory Alignment
 *
 *     For efficent memory use, content buffers will be 64-bit aligned.  There is a compatibility
 *     mode for older uses of 32-bit alignment.
 *
 *    Note that content is not required to be an integral number of 64-bit or 32-bit items.
 *    Content can be any byte length in the range 1 through 1Gb � 1.
 *
 * Logical EOF
 *
 *     For Append-Only Tables the end of data is versioned.  When a transaction successfully
 *     commits it adds a new version � that is, more data that can be read by future
 *     transactions.  The versioned EOFs are kept in a system catalog table.  Readers look
 *     through their transaction snapshot and get the logical EOF for data they are suppose
 *     to see, which can be less than what is currently committed.
 *
 *    We call it the logical EOF because the physical EOF is the wrong value to look at for
 *    both writing and reading.  For writing, the system catalog has the last committed EOF
 *    value.  The physical EOF might be beyond the logical EOF if that previous transaction
 *    aborted.  And, for reading, the EOF to use is the versioned EOF value, which is not
 *    necessarily the physical EOF value.  Thus, you will see a logicalEof parameter on the
 *    write and read routines that supply the file to use.
 *
 * Error Handling
 *
 *    Exceptions are thrown (via ereport) when errors are encountered.
 */

/*
 * This structure contains attribute values about the
 * Append-Only relation that are used by the storage
 * layer.
 */
typedef struct AppendOnlyStorageAttributes
{
	bool				compress;
			/* When true, content compression used. */

	char				*compressType;
			/*
			 * The bulk-compression used on the contents
			 * of the Append-Only Storage Blocks.
			 */
	int					compressLevel;
			/*
			 * A parameter directs the bulk-compression
			 * library on how to compress/decompress.
			 *
			 * The level can be equally important on
			 * decompression since it may specify which
			 * sub-library to use for decompress
			 * (e.g. ZSTD).
			 */
	int					overflowSize;
			/*
			 * The additional size (in bytes) required by the bulk-compression
			 * algorithm.
			 */

	bool				checksum;
			/*
 			 * When true, checksums protect the header
			 * and content.  Otherwise, no checksums.
			 */

} AppendOnlyStorageAttributes;

/*
 * Safe initialization of AppendOnlyStorageAttributes struct.
 *
 * Use this define to initialize the attributes structure
 * so any future attributes get good default values.
 */
#define AppendOnlyStorageAttributes_Init(storageAttributes)\
{\
	MemSet(&storageAttributes, 0, sizeof(storageAttributes));\
}

#endif   /* CDBAPPENDONLYSTORAGELAYER_H */
