Changes to the files table and interface. Changed "age" to
[jigit.git] / jigdb.h
1 #ifndef JIGDB_H
2 #define JIGDB_H
3
4 #include <time.h>
5 #include <limits.h>
6
7 #define JIGDB void
8
9 /* Top-level details about a template file */
10 typedef struct
11 {
12     unsigned long long template_size;           /* The size of the template file */
13     unsigned long long image_size;              /* The size of the output image */
14     time_t             template_mtime;          /* The mtime of the template file */
15     unsigned long      template_index;          /* record number in the template table */
16     unsigned char      template_name[PATH_MAX]; /* The template file name */
17     unsigned char      template_md5[32];        /* MD5 of the template file */
18     unsigned char      image_md5[32];           /* MD5 of the image file */
19 } db_template_entry_t;
20
21 /* Details about the blocks in the template file; each points to a
22  * matched file, or a compressed lump of unmatched data in the
23  * template file */
24 enum blocktype
25 {
26     BT_FILE = 0,   /* md5 pointer to a file */
27     BT_BLOCK       /* pointer to a block of data from the template file */
28 };
29
30 typedef struct
31 {
32     unsigned long long image_offset;            /* Start offset within the image */
33     unsigned long long size;                    /* Size of the lump */
34     unsigned long long uncomp_offset;           /* Offset within the compressed template
35                                                    data iff type is BT_BLOCK */
36     unsigned long      template_index;          /* record number in the template table */
37     enum blocktype     type;
38     unsigned char      md5[32];                 /* MD5 iff type is BT_FILE */
39 } db_block_entry_t;
40
41 /* Details about files we know about: local mirror, files in a local
42  * ISO image, files listed in the jigdo, etc. */
43 enum filetype
44 {
45     FT_LOCAL = 0,  /* We have the file directly-accessible in a local filesystem */
46     FT_ISO,        /* We have the file in an ISO image locally */
47     FT_REMOTE,     /* File is on a specified mirror */
48     FT_JIGDO       /* We need to go to the upstream jigdo mirror site */
49 };
50
51 typedef struct
52 {
53     unsigned long long file_size;          /* size of the file in bytes */
54     time_t             mtime;              /* mtime of the file when we saw it */
55     time_t             time_added;         /* time when this record was added */
56     enum filetype      type;
57     unsigned char      md5[32];            /* md5sum of the file */
58     char               filename[PATH_MAX]; /* path to the file */
59     char               extra[PATH_MAX];    /* empty for local files;
60                                             * path to ISO for local ISO loopbacks;
61                                             * base URL for remote files*/
62 } db_file_entry_t;
63
64 /* Details about the compressed blocks of unmatched data within the
65  * template file. The data is stored within the template file as a
66  * series of compressed blocks, but we have no way to seek to the
67  * right compressed block; if we want to read from the middle of the
68  * image we have to decompress each in turn. Cache the details of each
69  * block so we can work from an uncompressed offset directly to the
70  * right compressed block. */
71 typedef struct
72 {
73     unsigned long      comp_offset;             /* Start offset of this compressed block,
74                                                    measured from the beginning of the
75                                                    template file */
76     unsigned long      uncomp_offset;           /* Start offset when uncompressed */
77     unsigned long      uncomp_size;             /* Size of uncompressed block */
78     unsigned long      template_index;          /* record number in the template table */
79 } db_compressed_entry_t;
80
81 /*******************
82  *
83  * Common interfaces
84  *
85  ******************/
86
87 /* Open/create the database */
88 JIGDB *db_open(char *db_name);
89
90 /* Close the database */
91 int db_close(JIGDB *dbp);
92
93 /* Delete ALL the template and compressed block entries for a
94  * specified template file */
95 int db_delete_template_cache(JIGDB *dbp, char *template_name);
96
97 /* Dump the contents of the DB for debug */
98 int db_dump(JIGDB *dbp);
99
100 /********************
101  *
102  * Template functions
103  *
104  *******************/
105
106 /* Store a template entry */
107 int db_store_template(JIGDB *dbp, db_template_entry_t *entry);
108
109 /* Lookup a template entry. */
110 int db_lookup_template_by_path(JIGDB *dbp, char *template_name, db_template_entry_t **out);
111
112 /********************
113  *
114  * Block functions
115  *
116  *******************/
117
118 /* Store a template match / non-match block entry */
119 int db_store_block(JIGDB *dbp, db_block_entry_t *entry);
120
121 /* Lookup a block by output offset. The specified offset will be
122  * within the range covered by the returned entry, or ENOENT. */
123 int db_lookup_block_by_offset(JIGDB *dbp, unsigned long long image_offset,
124                               unsigned long template_index, db_block_entry_t **out);
125
126 /****************
127  *
128  * File functions
129  *
130  ***************/
131
132 /* Store details of a file */
133 int db_store_file(JIGDB *dbp, db_file_entry_t *entry);
134
135 /* Lookup a file by md5 */
136 int db_lookup_file_by_md5(JIGDB *dbp, char *md5, db_file_entry_t **out);
137
138 /* Lookup a file by name */
139 int db_lookup_file_by_name(JIGDB *dbp, char *filename, db_file_entry_t **out);
140
141 /* Delete a file by name */
142 int db_delete_file_by_name(JIGDB *dbp, char *md5, enum filetype type, char *filename);
143
144 /* Delete files added previous to a specified date */
145 int db_delete_files_by_age(JIGDB *dbp, time_t date);
146
147 /* Delete a file entry */
148 int db_delete_file(JIGDB *dbp, char *md5, enum filetype type, char *filename);
149
150 /****************************
151  *
152  * Compressed block functions
153  *
154  ***************************/
155
156 /* Store details of a block */
157 int db_store_compressed(JIGDB *dbp, db_compressed_entry_t *entry);
158
159 /* Lookup a block by its UNCOMPRESSED offset */
160 int db_lookup_compressed_by_offset(JIGDB *dbp, unsigned long uncomp_offset,
161                                    unsigned long template_index, db_compressed_entry_t **out);
162
163 #endif /* JIGDB_H */