File: db.h

package info (click to toggle)
nn 6.7.3-8
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 2,508 kB
  • ctags: 3,199
  • sloc: ansic: 32,035; sh: 1,491; awk: 138; makefile: 98
file content (143 lines) | stat: -rw-r--r-- 4,334 bytes parent folder | download | duplicates (9)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 *	(c) Copyright 1990, Kim Fabricius Storm.  All rights reserved.
 *      Copyright (c) 1996-2005 Michael T Pins.  All rights reserved.
 *
 *	DATABASE ORGANIZATION:
 *
 *	The central nn information is contained in following files:
 *		DB_DIRECTORY/MASTER
 *		DB_DIRECTORY/GROUPS
 *		DB_DIRECTORY/DATA/nnn.x
 *		DB_DIRECTORY/DATA/nnn.d
 *
 * 	The MASTER file consists of a header and one entry for each news
 *	group.  The sequence of the group headers defines the group
 *	number associated with the group.
 *
 * 	The GROUPS file contains the names of the news groups; the names
 *	occur in the same sequence as in the MASTER file.
 *
 *	For each news group, the DATA directory contains two files whose
 *	name is constructed from the group number 'nnn':
 *
 *		nnn.x	Index file
 *		nnn.d	Data file
 *
 *	The index file provides a a mapping from article numbers to offsets
 *	in the data file.
 *
 *	The data file contains the actual header data.  Each article is
 *	represented by a Header, an array of Cross Postings, and the
 *	strings representing the sender name and the article subject:
 *
 *		header
 *		group_number 1 [ if cross posted ]
 *		group_number 2
 *		...
 *		sender name (null terminated) [if sender_length > 0]
 *		subject (null terminated) [if subject_length > 0]
 *
 *	For a digest, cross posted groups are only specified for the
 *	first entry (the header entry).
 *
 *	On disk, the article_number is negative for digest article
 *	header and zero for following sub articles.
 *
 *	The format of the index and data files are specified below.
 *
 *	Unless NETWORK_DATABASE is defined, the database will
 *	will contain machine dependent binary data.
 */

#ifndef _NN_DB_H
#define _NN_DB_H 1

#ifdef NETWORK_DATABASE
typedef int32   cross_post_number;

#ifdef NETWORK_BYTE_ORDER
#define NETW_CROSS_INT(cp) cp
#define NETW_CROSS_EXT(cp) cp
#else
#define NETW_CROSS_INT(cp) ntohl(cp)
#define NETW_CROSS_EXT(cp) htonl(cp)
#endif

#else
typedef group_number cross_post_number;
#define NETW_CROSS_INT(cp) cp
#define NETW_CROSS_EXT(cp) cp
#endif

typedef struct {
    article_number  dh_number;

    time_stamp      dh_date;	/* encoded Date: filed (not a time_t value!!) */

    off_t           dh_hpos;	/* absolute offset for first byte of header */
    off_t           dh_lpos;	/* absolute offset for last byte of article */
    int16           dh_fpos;	/* relative offset for first byte in article
				 * text */

    int16           dh_lines;
    int8            dh_replies;

    int8            dh_cross_postings;
    int8            dh_subject_length;
    int8            dh_sender_length;
}               data_header;

#define DBUF_SIZE	255

typedef struct {
    int             dh_type;

#define	DH_NORMAL		0
#define	DH_DIGEST_HEADER	1
#define DH_SUB_DIGEST		2

    cross_post_number dh_cross[DBUF_SIZE + 1];
    char            dh_sender[DBUF_SIZE + 1];
    char            dh_subject[DBUF_SIZE + 1];
}               data_dynamic_data;


#ifndef NOV
int             open_groups(int);
void            close_groups(void);
void            db_rewrite_groups(int, group_header *);
int             db_parse_group(register group_header *, int);
void            db_write_master(void);
int             db_write_art(FILE * f);
long            get_data_offset(group_header *, article_number);
int             db_write_offset(FILE *, long *);
#endif

int             init_group(register group_header *);
void            open_master(int);
void            db_expand_master(void);
void            close_master(void);
int             update_group(group_header *);
void            sort_groups(void);
group_header   *lookup_no_alias(char *);
group_header   *lookup(char *);
int             art_collected(group_header *, article_number);
char           *db_data_path(char *, group_header *, char);
FILE           *open_data_file(group_header *, char, int);
void            db_write_group(register group_header *);
off_t           db_read_art(FILE *);
long            get_index_offset(group_header *, article_number);
int             db_read_offset(FILE *, long *);

#ifdef  CACHE_PURPOSE
char           *purp_lookup(char *);
#endif

#ifdef NOV
void            db_read_group(register group_header *, article_number, article_number);
#endif


extern data_header db_hdr;
extern data_dynamic_data db_data;
#endif				/* _NN_DB_H */