/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 1996,2008 Oracle.  All rights reserved.
 *
 * $Id: db.src,v 12.14 2008/01/30 04:30:36 mjc Exp $
 */

DBPRIVATE
PREFIX	__db

INCLUDE #include "db_int.h"
INCLUDE #include "dbinc/crypto.h"
INCLUDE #include "dbinc/db_page.h"
INCLUDE #include "dbinc/db_dispatch.h"
INCLUDE #include "dbinc/db_am.h"
INCLUDE #include "dbinc/log.h"
INCLUDE #include "dbinc/txn.h"
INCLUDE

/*
 * addrem -- Add or remove an entry from a duplicate page.
 *
 * opcode:	identifies if this is an add or delete.
 * fileid:	file identifier of the file being modified.
 * pgno:	duplicate page number.
 * indx:	location at which to insert or delete.
 * nbytes:	number of bytes added/removed to/from the page.
 * hdr:		header for the data item.
 * dbt:		data that is deleted or is to be added.
 * pagelsn:	former lsn of the page.
 *
 * If the hdr was NULL then, the dbt is a regular B_KEYDATA.
 * If the dbt was NULL then the hdr is a complete item to be
 * pasted on the page.
 */
BEGIN addrem		42	41
ARG	opcode		u_int32_t	lu
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
ARG	indx		u_int32_t	lu
ARG	nbytes		u_int32_t	lu
DBT	hdr		DBT		s
DBT	dbt		DBT		s
POINTER	pagelsn		DB_LSN *	lu
END

/*
 * big -- Handles addition and deletion of big key/data items.
 *
 * opcode:	identifies get/put.
 * fileid:	file identifier of the file being modified.
 * pgno:	page onto which data is being added/removed.
 * prev_pgno:	the page before the one we are logging.
 * next_pgno:	the page after the one we are logging.
 * dbt:		data being written onto the page.
 * pagelsn:	former lsn of the orig_page.
 * prevlsn:	former lsn of the prev_pgno.
 * nextlsn:	former lsn of the next_pgno. This is not currently used, but
 *		may be used later if we actually do overwrites of big key/
 *		data items in place.
 */
BEGIN big		42	43
ARG	opcode		u_int32_t	lu
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
ARG	prev_pgno	db_pgno_t	lu
ARG	next_pgno	db_pgno_t	lu
DBT	dbt		DBT		s
POINTER	pagelsn		DB_LSN *	lu
POINTER	prevlsn		DB_LSN *	lu
POINTER	nextlsn		DB_LSN *	lu
END

/*
 * ovref -- Handles increment/decrement of overflow page reference count.
 *
 * fileid:	identifies the file being modified.
 * pgno:	page number whose ref count is being incremented/decremented.
 * adjust:	the adjustment being made.
 * lsn:		the page's original lsn.
 */
BEGIN ovref		42	44
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
ARG	adjust		int32_t		ld
POINTER	lsn		DB_LSN *	lu
END

/*
 * relink -- Handles relinking around a page.
 *
 * opcode:	indicates if this is an addpage or delete page
 * pgno:	the page being changed.
 * lsn		the page's original lsn.
 * prev:	the previous page.
 * lsn_prev:	the previous page's original lsn.
 * next:	the next page.
 * lsn_next:	the previous page's original lsn.
 */
BEGIN_COMPAT relink		42	45
ARG	opcode		u_int32_t	lu
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	lsn		DB_LSN *	lu
ARG	prev		db_pgno_t	lu
POINTER	lsn_prev	DB_LSN *	lu
ARG	next		db_pgno_t	lu
POINTER	lsn_next	DB_LSN *	lu
END

/*
 * Debug -- log an operation upon entering an access method.
 * op:		Operation (cursor, c_close, c_get, c_put, c_del,
 *		get, put, delete).
 * fileid:	identifies the file being acted upon.
 * key:		key paramater
 * data:	data parameter
 * flags:	flags parameter
 */
BEGIN debug		42	47
DBT	op		DBT		s
ARG	fileid		int32_t		ld
DBT	key		DBT		s
DBT	data		DBT		s
ARG	arg_flags	u_int32_t	lu
END

/*
 * noop -- do nothing, but get an LSN.
 */
BEGIN noop		42	48
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	prevlsn		DB_LSN *	lu
END

/*
 * pg_alloc: used to record allocating a new page.
 *
 * meta_lsn:	the original lsn of the page reference by meta_pgno.
 * meta_pgno	the page pointing at the allocated page in the free list.
 *			If the list is unsorted this is the metadata page.
 * page_lsn:	the allocated page's original lsn.
 * pgno:	the page allocated.
 * ptype:	the type of the page allocated.
 * next:	the next page on the free list.
 * last_pgno:	the last page in the file after this op (4.3+).
 */
BEGIN_COMPAT pg_alloc	42	49
DB	fileid		int32_t		ld
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
POINTER	page_lsn	DB_LSN *	lu
ARG	pgno		db_pgno_t	lu
ARG	ptype		u_int32_t	lu
ARG	next		db_pgno_t	lu
END

BEGIN pg_alloc	43	49
DB	fileid		int32_t		ld
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
POINTER	page_lsn	DB_LSN *	lu
ARG	pgno		db_pgno_t	lu
ARG	ptype		u_int32_t	lu
ARG	next		db_pgno_t	lu
ARG	last_pgno	db_pgno_t	lu
END

/*
 * pg_free: used to record freeing a page.
 *	If we are maintaining a sorted free list (during compact) meta_pgno
 * will be non-zero and refer to the page that preceeds the one we are freeing
 * in the free list.  Meta_lsn will then be the lsn of that page.
 *
 * pgno:	the page being freed.
 * meta_lsn:	the meta-data page's original lsn.
 * meta_pgno:	the meta-data page number.
 * header:	the header from the free'd page.
 * next:	the previous next pointer on the metadata page.
 * last_pgno:	the last page in the file before this op (4.3+).
 */
BEGIN_COMPAT pg_free		42	50
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
PGDBT	header		DBT		s
ARG	next		db_pgno_t	lu
END

BEGIN pg_free		43	50
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
PGDBT	header		DBT		s
ARG	next		db_pgno_t	lu
ARG	last_pgno	db_pgno_t	lu
END

/*
 * cksum --
 *	This log record is written when we're unable to checksum a page,
 *	before returning DB_RUNRECOVERY.  This log record causes normal
 *	recovery to itself return DB_RUNRECOVERY, as only catastrophic
 *	recovery can fix things.
 */
BEGIN cksum		42	51
END

/*
 * pg_freedata: used to record freeing a page with data on it.
 *
 * pgno:	the page being freed.
 * meta_lsn:	the meta-data page's original lsn.
 * meta_pgno:	the meta-data page number.
 * header:	the header and index entries from the free'd page.
 * data:	the data from the free'd page.
 * next:	the previous next pointer on the metadata page.
 * last_pgno:	the last page in the file before this op (4.3+).
 */
BEGIN_COMPAT pg_freedata		42	52
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
PGDBT	header		DBT		s
ARG	next		db_pgno_t	lu
PGDDBT	data		DBT		s
END

BEGIN pg_freedata		43	52
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
POINTER	meta_lsn	DB_LSN *	lu
ARG	meta_pgno	db_pgno_t	lu
PGDBT	header		DBT		s
ARG	next		db_pgno_t	lu
ARG	last_pgno	db_pgno_t	lu
PGDDBT	data		DBT		s
END

/*
 * pg_prepare: used to record an aborted page in a prepared transaction.
 *
 * pgno:	the page being freed.
 */
X BEGIN pg_prepare		42	53
X DB	fileid		int32_t		ld
X ARG	pgno		db_pgno_t	lu
X END

/*
 * pg_new: used to record a new page put on the free list.
 *
 * pgno:	the page being freed.
 * meta_lsn:	the meta-data page's original lsn.
 * meta_pgno:	the meta-data page number.
 * header:	the header from the free'd page.
 * next:	the previous next pointer on the metadata page.
 */
X BEGIN pg_new		42	54
X DB	fileid		int32_t		ld
X ARG	pgno		db_pgno_t	lu
X POINTER	meta_lsn	DB_LSN *	lu
X ARG	meta_pgno	db_pgno_t	lu
X PGDBT	header		DBT		s
X ARG	next		db_pgno_t	lu
X END

/*
 * pg_init: used to reinitialize a page during truncate.
 *
 * pgno:	the page being initialized.
 * header:	the header from the page.
 * data:	data that used to be on the page.
 */
BEGIN pg_init		43	60
DB	fileid		int32_t		ld
ARG	pgno		db_pgno_t	lu
PGDBT	header		DBT		s
PGDDBT	data		DBT		s
END

/*
 * pg_sort: sort the free list
 *
 * meta:	meta page number
 * meta_lsn:	lsn on meta page.
 * last_free:	page number of new last free page.
 * last_lsn;	lsn of last free page.
 * last_pgno:	current last page number.
 * list:	list of pages and lsns to sort.
 */
BEGIN pg_sort		44	61
DB	fileid		int32_t		ld
ARG	meta		db_pgno_t	lu
POINTER	meta_lsn	DB_LSN *	lu
ARG	last_free	db_pgno_t	lu
POINTER	last_lsn	DB_LSN *	lu
ARG	last_pgno	db_pgno_t	lu
DBT	list		DBT		s
END

