/*
 * Written by Tomas Dosoudil <tomas.dosoudil@gmail.com>
 * This file is distributed under BSD-style license.
 *
 */

#ifndef _PGDVIEW_H_
#define _PGDVIEW_H_

/* PostgreSQL version */
#define		POSTGRESQL_8_2		1
#define		POSTGRESQL_8_1		0
#define		POSTGRESQL_8_0		0


/* PageHeaderData see in Postgre doc chapter 50. Database Physical Storage*/
#define     PAGE_HEADER             20
#define     PD_PAGESIZE_VERSION     2
#define     ITEM_POINTER            4

/* file descriptor queue debug */
#define		FD_DEBUG				0

/* 
 * CONTROL AN INPUT
 */
/* max length of path to db inclusive of file name */
#define		MAX_FILENAME_LENGTH		200

/* max number of opened files */
#define		MAX_FD_OPENED			5

/* 
 * check if argument has parameter 
 *  - parameter must not be last, last is database file name
 *  - first character must not be '-'
 */
#define 	HAS_ARGUMENT(optc,optv) ((*(*(optv) + 1) == NULL) && \
									(((optc) - 1) > 0) && \
									(**((optv) + 1) != '-'))


/* Diferent between versions. Macros are defined for version 8.0.8 */
/* for version 8.0.8 */
#ifndef HEAP_XMAX_UNLOGGED
#define HEAP_XMAX_UNLOGGED      0x0080
#endif

#ifndef HEAP_MARKED_FOR_UPDATE 
#define HEAP_MARKED_FOR_UPDATE	0x1000
#endif

/* for version 8.1.4 */
#ifndef HEAP_XMAX_SHARED_LOCK
#define HEAP_XMAX_SHARED_LOCK	0x0080
#endif

#ifndef HEAP_XMAX_IS_MULTI 
#define HEAP_XMAX_IS_MULTI 		0x1000
#endif

#ifndef HEAP_XMAX_EXCL_LOCK
#define HEAP_XMAX_EXCL_LOCK		0x0040 
#endif


/*
 * HeapTupleHeader accessor macros
 * return information if t_infomask is sets
 */
#define _HeapTupleHasNulls(tupleHeader) \
          (((tupleHeader)->t_infomask & HEAP_HASNULL) != 0)

#define _HeapTupleHasVarWidth(tupleHeader) \
          (((tupleHeader)->t_infomask & HEAP_HASVARWIDTH) != 0)

#define _HeapTupleHasExternal(tupleHeader) \
          (((tupleHeader)->t_infomask & HEAP_HASEXTERNAL) != 0)

#define _HeapTupleHasCompressed(tupleHeader) \
          (((tupleHeader)->t_infomask & HEAP_HASCOMPRESSED) != 0)

#define _HeapTupleHasExtended(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_HASEXTENDED) != 0)

#define HeapTupleHasOid(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_HASOID) != 0)

#define HeapTupleHasUnlogged(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_XMAX_UNLOGGED) != 0)

#define HeapTupleHasXminCommitted(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_XMIN_COMMITTED) != 0)

#define HeapTupleHasXminInvalid(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_XMIN_INVALID) != 0)

#define HeapTupleHasXmaxCommitted(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_XMAX_COMMITTED) != 0)

#define HeapTupleHasXmaxInvalid(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_XMAX_INVALID) != 0)

#define HeapTupleHasMarkedUpdate(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_MARKED_FOR_UPDATE) != 0)

#define HeapTupleHasUpdated(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_UPDATED) != 0)

#define HeapTupleHasMovedOff(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_MOVED_OFF) != 0)

#define HeapTupleHasMovedIn(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_MOVED_IN) != 0)

#define HeapTupleHasMoved(tupleHeader) \
         (((tupleHeader)->t_infomask & HEAP_MOVED) != 0)



#endif /* _PGDVIEW_h_ */
