739345ed6d74ed6b218c49d5b3812345daceac9e
[platform/upstream/libsolv.git] / src / repopage.h
1 /*
2  * Copyright (c) 2007-2011, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 #ifndef LIBSOLV_REPOPAGE_H
9 #define LIBSOLV_REPOPAGE_H
10
11 #define REPOPAGE_BLOBBITS 15
12 #define REPOPAGE_BLOBSIZE (1 << REPOPAGE_BLOBBITS)
13
14 typedef struct _Attrblobpage
15 {
16   /* page_size == 0 means the page is not backed by some file storage.
17      Otherwise it is L*2+(compressed ? 1 : 0), with L being the data
18      length.  */
19   unsigned int page_offset;
20   unsigned int page_size;
21 } Attrblobpage;
22
23 typedef struct _Repopagestore {
24   int pagefd;           /* file descriptor we're paging from */
25   long file_offset;     /* pages in file start here */
26
27   unsigned char *blob_store;
28   unsigned int num_pages;
29
30   /* mapped_at[page] == -1  --> not loaded, otherwise offset into
31      store->blob_store.  The size of the mapping is REPOPAGE_BLOBSIZE
32      except for the last page.  */
33   unsigned int *mapped_at;
34
35   Attrblobpage *file_pages;
36
37   /* mapped[i] is -1 if nothing is mapped at logical page I,
38    otherwise it contains the page number (of the mapped page).  */
39   unsigned int *mapped;
40   unsigned int nmapped;
41   unsigned int rr_counter;
42 } Repopagestore;
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 void repopagestore_init(Repopagestore *store);
49 void repopagestore_free(Repopagestore *store);
50
51 /* load pages pstart..pend into consecutive memory, return address */
52 unsigned char *repopagestore_load_page_range(Repopagestore *store, unsigned int pstart, unsigned int pend);
53
54 /* compress a page, return compressed len */
55 unsigned int repopagestore_compress_page(unsigned char *page, unsigned int len, unsigned char *cpage, unsigned int max);
56
57 /* setup page data for repodata_load_page_range */
58 int repopagestore_read_or_setup_pages(Repopagestore *store, FILE *fp, unsigned int pagesz, unsigned int blobsz);
59
60 void repopagestore_disable_paging(Repopagestore *store);
61
62 #ifdef __cplusplus
63 }
64 #endif
65
66 #endif  /* LIBSOLV_REPOPAGE_H */