1*6580fee3Smillert /* $OpenBSD: page.h,v 1.6 2003/06/02 20:18:34 millert Exp $ */ 21b727fc6Smillert 3df930be7Sderaadt /*- 4df930be7Sderaadt * Copyright (c) 1990, 1993, 1994 5df930be7Sderaadt * The Regents of the University of California. All rights reserved. 6df930be7Sderaadt * 7df930be7Sderaadt * This code is derived from software contributed to Berkeley by 8df930be7Sderaadt * Margo Seltzer. 9df930be7Sderaadt * 10df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 11df930be7Sderaadt * modification, are permitted provided that the following conditions 12df930be7Sderaadt * are met: 13df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 14df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 15df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 16df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 17df930be7Sderaadt * documentation and/or other materials provided with the distribution. 18*6580fee3Smillert * 3. Neither the name of the University nor the names of its contributors 19df930be7Sderaadt * may be used to endorse or promote products derived from this software 20df930be7Sderaadt * without specific prior written permission. 21df930be7Sderaadt * 22df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32df930be7Sderaadt * SUCH DAMAGE. 33df930be7Sderaadt * 341b727fc6Smillert * @(#)page.h 8.2 (Berkeley) 5/31/94 35df930be7Sderaadt */ 36df930be7Sderaadt 37df930be7Sderaadt /* 38df930be7Sderaadt * Definitions for hashing page file format. 39df930be7Sderaadt */ 40df930be7Sderaadt 41df930be7Sderaadt /* 42df930be7Sderaadt * routines dealing with a data page 43df930be7Sderaadt * 44df930be7Sderaadt * page format: 45df930be7Sderaadt * +------------------------------+ 46df930be7Sderaadt * p | n | keyoff | datoff | keyoff | 47df930be7Sderaadt * +------------+--------+--------+ 48df930be7Sderaadt * | datoff | free | ptr | --> | 49df930be7Sderaadt * +--------+---------------------+ 50df930be7Sderaadt * | F R E E A R E A | 51df930be7Sderaadt * +--------------+---------------+ 52df930be7Sderaadt * | <---- - - - | data | 53df930be7Sderaadt * +--------+-----+----+----------+ 54df930be7Sderaadt * | key | data | key | 55df930be7Sderaadt * +--------+----------+----------+ 56df930be7Sderaadt * 57df930be7Sderaadt * Pointer to the free space is always: p[p[0] + 2] 58df930be7Sderaadt * Amount of free space on the page is: p[p[0] + 1] 59df930be7Sderaadt */ 60df930be7Sderaadt 61df930be7Sderaadt /* 62df930be7Sderaadt * How many bytes required for this pair? 63df930be7Sderaadt * 2 shorts in the table at the top of the page + room for the 64df930be7Sderaadt * key and room for the data 65df930be7Sderaadt * 66df930be7Sderaadt * We prohibit entering a pair on a page unless there is also room to append 67df930be7Sderaadt * an overflow page. The reason for this it that you can get in a situation 68df930be7Sderaadt * where a single key/data pair fits on a page, but you can't append an 69df930be7Sderaadt * overflow page and later you'd have to split the key/data and handle like 70df930be7Sderaadt * a big pair. 71df930be7Sderaadt * You might as well do this up front. 72df930be7Sderaadt */ 73df930be7Sderaadt 74df930be7Sderaadt #define PAIRSIZE(K,D) (2*sizeof(u_int16_t) + (K)->size + (D)->size) 75df930be7Sderaadt #define BIGOVERHEAD (4*sizeof(u_int16_t)) 76df930be7Sderaadt #define KEYSIZE(K) (4*sizeof(u_int16_t) + (K)->size); 77df930be7Sderaadt #define OVFLSIZE (2*sizeof(u_int16_t)) 78df930be7Sderaadt #define FREESPACE(P) ((P)[(P)[0]+1]) 79df930be7Sderaadt #define OFFSET(P) ((P)[(P)[0]+2]) 80df930be7Sderaadt #define PAIRFITS(P,K,D) \ 81df930be7Sderaadt (((P)[2] >= REAL_KEY) && \ 82df930be7Sderaadt (PAIRSIZE((K),(D)) + OVFLSIZE) <= FREESPACE((P))) 83df930be7Sderaadt #define PAGE_META(N) (((N)+3) * sizeof(u_int16_t)) 84df930be7Sderaadt 85df930be7Sderaadt typedef struct { 86df930be7Sderaadt BUFHEAD *newp; 87df930be7Sderaadt BUFHEAD *oldp; 88df930be7Sderaadt BUFHEAD *nextp; 89df930be7Sderaadt u_int16_t next_addr; 90df930be7Sderaadt } SPLIT_RETURN; 91