summaryrefslogtreecommitdiff
path: root/src/include/schema.h
blob: 74ba1733092b3c3cc5557a95456ea680f436b111 (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
/*-
 * Copyright (c) 2008-2014 WiredTiger, Inc.
 *	All rights reserved.
 *
 * See the file LICENSE for redistribution information.
 */

/* Character constants for projection plans */
#define	WT_PROJ_KEY	'k' /* Go to key in cursor <arg> */
#define	WT_PROJ_NEXT	'n' /* Process the next item (<arg> repeats) */
#define	WT_PROJ_REUSE	'r' /* Reuse the previous item (<arg> repeats) */
#define	WT_PROJ_SKIP	's' /* Skip a column in the cursor (<arg> repeats) */
#define	WT_PROJ_VALUE	'v' /* Go to the value in cursor <arg> */

struct __wt_colgroup {
	const char *name;		/* Logical name */
	const char *source;		/* Underlying data source */
	const char *config;		/* Configuration string */

	WT_CONFIG_ITEM colconf;		/* List of columns from config */
};

struct __wt_index {
	const char *name;		/* Logical name */
	const char *source;		/* Underlying data source */
	const char *config;		/* Configuration string */

	WT_CONFIG_ITEM colconf;		/* List of columns from config */

	WT_EXTRACTOR *extractor;	/* Custom key extractor */

	const char *idxkey_format;	/* Index key format (hides primary) */
	const char *key_format;		/* Key format */
	const char *key_plan;		/* Key projection plan */
	const char *value_plan;		/* Value projection plan */
};

/*
 * WT_TABLE --
 *	Handle for a logical table.  A table consists of one or more column
 *	groups, each of which holds some set of columns all sharing a primary
 *	key; and zero or more indices, each of which holds some set of columns
 *	in an index key that can be used to reconstruct the primary key.
 */
struct __wt_table {
	const char *name, *config, *plan;
	const char *key_format, *value_format;

	WT_CONFIG_ITEM cgconf, colconf;

	WT_COLGROUP **cgroups;
	WT_INDEX **indices;
	size_t idx_alloc;

	TAILQ_ENTRY(__wt_table) q;

	int cg_complete, idx_complete, is_simple;
	u_int ncolgroups, nindices, nkey_columns;

	uint32_t refcnt;	/* Number of open cursors */
	uint32_t schema_gen;	/* Cached schema generation number */
};

/*
 * Tables without explicit column groups have a single default column group
 * containing all of the columns.
 */
#define	WT_COLGROUPS(t)	WT_MAX((t)->ncolgroups, 1)

/*
 * WT_WITH_SCHEMA_LOCK --
 *	Acquire the schema lock, perform an operation, drop the lock.
 */
#define	WT_WITH_SCHEMA_LOCK(session, op) do {				\
	WT_ASSERT(session,						\
	    F_ISSET(session, WT_SESSION_SCHEMA_LOCKED) ||		\
	    !F_ISSET(session, WT_SESSION_NO_SCHEMA_LOCK));		\
	if (F_ISSET(session, WT_SESSION_SCHEMA_LOCKED)) {		\
		(op);							\
	} else {							\
		__wt_spin_lock(session, &S2C(session)->schema_lock);	\
		F_SET(session, WT_SESSION_SCHEMA_LOCKED);		\
		(op);							\
		__wt_spin_unlock(session, &S2C(session)->schema_lock);	\
		F_CLR(session, WT_SESSION_SCHEMA_LOCKED);		\
	}								\
} while (0)

/*
 * WT_WITHOUT_SCHEMA_LOCK --
 *	Drop the schema lock, perform an operation, re-acquire the lock.
 */
#define	WT_WITHOUT_SCHEMA_LOCK(session, op) do {			\
	if (F_ISSET(session, WT_SESSION_SCHEMA_LOCKED)) {		\
		__wt_spin_unlock(session, &S2C(session)->schema_lock);	\
		F_CLR(session, WT_SESSION_SCHEMA_LOCKED);		\
		(op);							\
		__wt_spin_lock(session, &S2C(session)->schema_lock);	\
		F_SET(session, WT_SESSION_SCHEMA_LOCKED);		\
	} else {							\
		(op);							\
	}								\
} while (0)