Click here to Skip to main content
15,885,244 members
Articles / Database Development / SQL Server

DarkSide SQL Mini Version 1, The embedded database

Rate me:
Please Sign up or sign in to vote.
3.50/5 (27 votes)
23 Mar 2006BSD2 min read 156.8K   2.9K   57  
An embedded database library in C++.
/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 1999-2002
 *	Sleepycat Software.  All rights reserved.
 *
 * $Id: qam.h,v 11.38 2002/08/06 06:11:21 bostic Exp $
 */

#ifndef	_DB_QAM_H_
#define	_DB_QAM_H_

/*
 * 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;
};

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;

/*
 * The in-memory, per-tree queue data structure.
 */
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. */

					/* Extent file configuration: */
	DBT pgcookie;			/* Initialized pgcookie. */
	DB_PGINFO pginfo;		/* Initialized pginfo struct. */

	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%c__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 - QPAGE_SZ(dbp)) /					\
    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) +					\
    QPAGE_SZ(dbp) + (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
#define	QAM_TRUNCATE		0x04

/*
 * 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 "dbinc_auto/qam_auto.h"
#include "dbinc_auto/qam_ext.h"
#endif /* !_DB_QAM_H_ */

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions