Click here to Skip to main content
Click here to Skip to main content
Articles » Database » Database » General » Downloads
 
Add your own
alternative version
Go to top

DarkSide SQL Mini Version 1, The embedded database

, 23 Mar 2006
An embedded database library in C++.
/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 2001-2002
 *	Sleepycat Software.  All rights reserved.
 */

#ifndef _REP_H_
#define	_REP_H_

#define	REP_ALIVE	1	/* I am alive message. */
#define	REP_ALIVE_REQ	2	/* Request for alive messages. */
#define	REP_ALL_REQ	3	/* Request all log records greater than LSN. */
#define	REP_ELECT	4	/* Indicates that all listeners should */
				/* begin master election */
#define	REP_FILE	6	/* Page of a database file. */
#define	REP_FILE_REQ	7	/* Request for a database file. */
#define	REP_LOG		8	/* Log record. */
#define	REP_LOG_MORE	9	/* There are more log records to request. */
#define	REP_LOG_REQ	10	/* Request for a log record. */
#define	REP_MASTER_REQ	11	/* Who is the master */
#define	REP_NEWCLIENT	12	/* Announces the presence of a new client. */
#define	REP_NEWFILE	13	/* Announce a log file change. */
#define	REP_NEWMASTER	14	/* Announces who the master is. */
#define	REP_NEWSITE	15	/* Announces that a site has heard from a new
				 * site; like NEWCLIENT, but indirect.  A
				 * NEWCLIENT message comes directly from the new
				 * client while a NEWSITE comes indirectly from
				 * someone who heard about a NEWSITE.
				 */
#define	REP_PAGE	16	/* Database page. */
#define	REP_PAGE_REQ	17	/* Request for a database page. */
#define	REP_PLIST	18	/* Database page list. */
#define	REP_PLIST_REQ	19	/* Request for a page list. */
#define	REP_VERIFY	20	/* A log record for verification. */
#define	REP_VERIFY_FAIL	21	/* The client is outdated. */
#define	REP_VERIFY_REQ	22	/* Request for a log record to verify. */
#define	REP_VOTE1	23	/* Send out your information for an election. */
#define	REP_VOTE2	24	/* Send a "you are master" vote. */

/* Used to consistently designate which messages ought to be received where. */
#define	MASTER_ONLY(dbenv)	\
	if (!F_ISSET(dbenv, DB_ENV_REP_MASTER)) return (EINVAL)

#define	CLIENT_ONLY(dbenv)	\
	if (!F_ISSET(dbenv, DB_ENV_REP_CLIENT)) return (EINVAL)

#define	ANYSITE(dbenv)

/* Shared replication structure. */

typedef struct __rep {
	/*
	 * Due to alignment constraints on some architectures (e.g. HP-UX),
	 * DB_MUTEXes must be the first element of shalloced structures,
	 * and as a corollary there can be only one per structure.  Thus,
	 * db_mutex_off points to a mutex in a separately-allocated chunk.
	 */
	DB_MUTEX	mutex;		/* Region lock. */
	roff_t		db_mutex_off;	/* Client database mutex. */
	u_int32_t	tally_off;	/* Offset of the tally region. */
	int		eid;		/* Environment id. */
	int		master_id;	/* ID of the master site. */
	u_int32_t	gen;		/* Replication generation number */
	int		asites;		/* Space allocated for sites. */
	int		nsites;		/* Number of sites in group. */
	int		priority;	/* My priority in an election. */
	u_int32_t	gbytes;		/* Limit on data sent in single... */
	u_int32_t	bytes;		/* __rep_process_message call. */
#define	DB_REP_REQUEST_GAP	4
#define	DB_REP_MAX_GAP		128
	u_int32_t	request_gap;	/* # of records to receive before we
					 * request a missing log record. */
	u_int32_t	max_gap;	/* Maximum number of records before
					 * requesting a missing log record. */

	/* Vote tallying information. */
	int		sites;		/* Sites heard from. */
	int		winner;		/* Current winner. */
	int		w_priority;	/* Winner priority. */
	u_int32_t	w_gen;		/* Winner generation. */
	DB_LSN		w_lsn;		/* Winner LSN. */
	int		w_tiebreaker;	/* Winner tiebreaking value. */
	int		votes;		/* Number of votes for this site. */

	/* Statistics. */
	DB_REP_STAT	stat;

#define	REP_F_EPHASE1	0x01		/* In phase 1 of election. */
#define	REP_F_EPHASE2	0x02		/* In phase 2 of election. */
#define	REP_F_LOGSONLY	0x04		/* Log-site only; cannot be upgraded. */
#define	REP_F_MASTER	0x08		/* Master replica. */
#define	REP_F_RECOVER	0x10
#define	REP_F_UPGRADE	0x20		/* Upgradeable replica. */
#define	REP_ISCLIENT	(REP_F_UPGRADE | REP_F_LOGSONLY)
	u_int32_t	flags;
} REP;

#define	IN_ELECTION(R)		F_ISSET((R), REP_F_EPHASE1 | REP_F_EPHASE2)
#define	ELECTION_DONE(R)	F_CLR((R), REP_F_EPHASE1 | REP_F_EPHASE2)

/*
 * Per-process replication structure.
 */
struct __db_rep {
	DB_MUTEX	*mutexp;

	DB_MUTEX	*db_mutexp;	/* Mutex for bookkeeping database. */
	DB		*rep_db;	/* Bookkeeping database. */

	REP		*region;	/* In memory structure. */
	int		(*rep_send)	/* Send function. */
			    __P((DB_ENV *,
			    const DBT *, const DBT *, int, u_int32_t));
};

/*
 * Control structure for replication communication infrastructure.
 *
 * Note that the version information should be at the beginning of the
 * structure, so that we can rearrange the rest of it while letting the
 * version checks continue to work.  DB_REPVERSION should be revved any time
 * the rest of the structure changes.
 */
typedef struct __rep_control {
#define	DB_REPVERSION	1
	u_int32_t	rep_version;	/* Replication version number. */
	u_int32_t	log_version;	/* Log version number. */

	DB_LSN		lsn;		/* Log sequence number. */
	u_int32_t	rectype;	/* Message type. */
	u_int32_t	gen;		/* Generation number. */
	u_int32_t	flags;		/* log_put flag value. */
} REP_CONTROL;

/* Election vote information. */
typedef struct __rep_vote {
	int	priority;		/* My site's priority. */
	int	nsites;			/* Number of sites I've been in
					 * communication with. */
	int	tiebreaker;		/* Tie-breaking quasi-random int. */
} REP_VOTE_INFO;

/*
 * This structure takes care of representing a transaction.
 * It holds all the records, sorted by page number so that
 * we can obtain locks and apply updates in a deadlock free
 * order.
 */
typedef struct __lsn_page {
	DB_LSN		lsn;
	u_int32_t	fid;
	DB_LOCK_ILOCK	pgdesc;
#define	LSN_PAGE_NOLOCK		0x0001	/* No lock necessary for log rec. */
	u_int32_t	flags;
} LSN_PAGE;

typedef struct __txn_recs {
	int		npages;
	int		nalloc;
	LSN_PAGE	*array;
	u_int32_t	txnid;
	u_int32_t	lockid;
} TXN_RECS;

typedef struct __lsn_collection {
	int nlsns;
	int nalloc;
	DB_LSN *array;
} LSN_COLLECTION;

/*
 * This is used by the page-prep routines to do the lock_vec call to
 * apply the updates for a single transaction or a collection of
 * transactions.
 */
typedef struct _linfo {
	int		n;
	DB_LOCKREQ	*reqs;
	DBT		*objs;
} linfo_t;

#include "dbinc_auto/rep_ext.h"
#endif	/* !_REP_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

Share

About the Author

No Biography provided

| Advertise | Privacy | Mobile
Web02 | 2.8.140921.1 | Last Updated 23 Mar 2006
Article Copyright 2003 by AnOldGreenHorn
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid