rpm/db/include/qam.h

151 lines
4.2 KiB
C

/*-
* 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"