summaryrefslogtreecommitdiff
path: root/db/include/qam.h
blob: 88cd68776a8b83067e481ea728d83076d0757b15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 1999, 2000
 *	Sleepycat Software.  All rights reserved.
 *
 * $Id: qam.h,v 11.26 2001/01/11 18:19:52 bostic Exp $
 */

/*
 * QAM data elements: a status field and the data.
 */
typedef struct _qamdata {
	u_int8_t  flags;	/* 00: delete bit. */
#define	QAM_VALID	0x01
#define	QAM_SET		0x02
	u_int8_t  data[1];	/* Record. */
} QAMDATA;

struct __queue;		typedef struct __queue QUEUE;
struct __qcursor;	typedef struct __qcursor QUEUE_CURSOR;

struct __qcursor {
	/* struct __dbc_internal */
	__DBC_INTERNAL

	/* Queue private part */

	/* Per-thread information: queue private. */
	db_recno_t	 recno;		/* Current record number. */

	u_int32_t	 flags;
};

/*
 * The in-memory, per-tree queue data structure.
 */

typedef struct __mpfarray {
	u_int32_t n_extent;		/* Number of extents in table. */
	u_int32_t low_extent;		/* First extent open. */
	u_int32_t hi_extent;		/* Last extent open. */
	struct __qmpf {
		int pinref;
		DB_MPOOLFILE *mpf;
	} *mpfarray;			 /* Array of open extents. */
} MPFARRAY;

struct __queue {
	db_pgno_t q_meta;		/* Database meta-data page. */
	db_pgno_t q_root;		/* Database root page. */

	int	  re_pad;		/* Fixed-length padding byte. */
	u_int32_t re_len;		/* Length for fixed-length records. */
	u_int32_t rec_page;		/* records per page */
	u_int32_t page_ext;		/* Pages per extent */
	MPFARRAY array1, array2;	/* File arrays. */
	DB_MPOOL_FINFO finfo;		/* Initialized info struct. */
	DB_PGINFO pginfo;		/* Initialized pginfo struct. */
	DBT pgcookie;			/* Initialized pgcookie. */
	char *path;			/* Space allocated to file pathname. */
	char *name;			/* The name of the file. */
	char *dir;			/* The dir of the file. */
	int mode;			/* Mode to open extents. */
};

/* Format for queue extent names. */
#define	QUEUE_EXTENT "%s/__dbq.%s.%d"

typedef struct __qam_filelist {
	DB_MPOOLFILE *mpf;
	u_int32_t id;
} QUEUE_FILELIST;

/*
 * Caculate the page number of a recno
 *
 * Number of records per page =
 *	Divide the available space on the page by the record len + header.
 *
 * Page number for record =
 *	divide the physical record number by the records per page
 *	add the root page number
 *      For now the root page will always be 1, but we might want to change
 *	in the future (e.g. multiple fixed len queues per file).
 *
 * Index of record on page =
 *	physical record number, less the logical pno times records/page
 */
#define	CALC_QAM_RECNO_PER_PAGE(dbp)					\
    (((dbp)->pgsize - sizeof(QPAGE)) /					\
    ALIGN(((QUEUE *)(dbp)->q_internal)->re_len +			\
    sizeof(QAMDATA) - SSZA(QAMDATA, data), sizeof(u_int32_t)))

#define	QAM_RECNO_PER_PAGE(dbp)	(((QUEUE*)(dbp)->q_internal)->rec_page)

#define	QAM_RECNO_PAGE(dbp, recno)					\
    (((QUEUE *)(dbp)->q_internal)->q_root				\
    + (((recno) - 1) / QAM_RECNO_PER_PAGE(dbp)))

#define	QAM_RECNO_INDEX(dbp, pgno, recno)				\
    (((recno) - 1) - (QAM_RECNO_PER_PAGE(dbp)				\
    * (pgno - ((QUEUE *)(dbp)->q_internal)->q_root)))

#define	QAM_GET_RECORD(dbp, page, index)				\
    ((QAMDATA *)((u_int8_t *)(page) +					\
    sizeof(QPAGE) + (ALIGN(sizeof(QAMDATA) - SSZA(QAMDATA, data) +	\
    ((QUEUE *)(dbp)->q_internal)->re_len, sizeof(u_int32_t)) * index)))

#define	QAM_AFTER_CURRENT(meta, recno)					\
    ((recno) > (meta)->cur_recno &&					\
    ((meta)->first_recno <= (meta)->cur_recno || (recno) < (meta)->first_recno))

#define	QAM_BEFORE_FIRST(meta, recno)					\
    ((recno) < (meta)->first_recno &&					\
    ((meta->first_recno <= (meta)->cur_recno || (recno) > (meta)->cur_recno)))

#define	QAM_NOT_VALID(meta, recno)					\
    (recno == RECNO_OOB ||						\
	QAM_BEFORE_FIRST(meta, recno) || QAM_AFTER_CURRENT(meta, recno))

/*
 * Log opcodes for the mvptr routine.
 */
#define	QAM_SETFIRST		0x01
#define	QAM_SETCUR		0x02

/*
 * Parameter to __qam_position.
 */
typedef enum {
	QAM_READ,
	QAM_WRITE,
	QAM_CONSUME
} qam_position_mode;

typedef enum {
	QAM_PROBE_GET,
	QAM_PROBE_PUT,
	QAM_PROBE_MPF
} qam_probe_mode;

#define	__qam_fget(dbp, pgnoaddr, flags, addrp) \
	__qam_fprobe(dbp, *pgnoaddr, addrp, QAM_PROBE_GET, flags)

#define	__qam_fput(dbp, pageno, addrp, flags) \
	__qam_fprobe(dbp, pageno, addrp, QAM_PROBE_PUT, flags)

#include "qam_auto.h"
#include "qam_ext.h"