Happy new year.
[idzebra-moved-to-github.git] / bfile / mfile.h
1 /* This file is part of the Zebra server.
2    Copyright (C) 1994-2011 Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 #ifndef MFILE_H
21 #define MFILE_H
22
23 #include <stdio.h>
24 #include <yaz/yconfig.h>
25 #include <idzebra/version.h>
26 #include <idzebra/util.h>
27
28 #ifdef WIN32
29
30 /* 64-bit access .. */
31 typedef __int64 mfile_off_t;
32 #define mfile_seek _lseeki64
33
34 #else
35 #include <sys/types.h>
36 typedef off_t mfile_off_t;
37 #define mfile_seek lseek
38 #endif
39
40 #ifndef FILENAME_MAX
41 #include <sys/param.h>
42 #define FILENAME_MAX MAXPATHLEN
43 #endif
44
45 #include <zebra-lock.h>
46
47 YAZ_BEGIN_CDECL
48
49 #define MF_MIN_BLOCKS_CREAT 1          /* minimum free blocks in new dir */
50 #define MF_MAX_PARTS 28                 /* max # of part-files per metafile */
51
52 #define mf_blocksize(mf) ((mf)->blocksize)
53
54
55 typedef struct mf_dir
56 {
57     char name[FILENAME_MAX+1];
58     mfile_off_t max_bytes;      /* allocated bytes in this dir. */
59     mfile_off_t avail_bytes;    /* bytes left */
60     struct mf_dir *next;
61 } mf_dir;
62
63 typedef struct part_file
64 {
65     zint number;
66     zint top;
67     zint blocks;
68     mfile_off_t bytes;
69     mf_dir *dir;
70     char *path;
71     int fd;
72 } part_file;
73
74 struct MFile_area_struct;
75 typedef struct MFile_area_struct *MFile_area;
76
77 typedef struct meta_file
78 {
79     char name[FILENAME_MAX+1];
80     part_file files[MF_MAX_PARTS];
81     int no_files;
82     int cur_file;
83     int open;                          /* is this file open? */
84     int blocksize;
85     mfile_off_t min_bytes_creat;  /* minimum bytes required to enter directory */
86     MFile_area ma;
87     int wr;
88     Zebra_mutex mutex;
89
90     struct meta_file *next;
91 } *MFile, meta_file;
92
93 struct MFile_area_struct
94 {
95     char name[FILENAME_MAX+1];
96     mf_dir *dirs;
97     struct meta_file *mfiles;
98     struct MFile_area_struct *next;  /* global list of active areas */
99     Zebra_mutex mutex;
100 };
101
102 /** \brief creates a metafile area
103     \param name of area (does not show up on disk - purely for notation)
104     \param spec area specification (e.g. "/a:1G dir /b:2000M"
105     \param base base directory (NULL for no base)
106     \param only_shadow_files only consider shadow files in area
107     \returns metafile area handle or NULL if error occurs
108 */
109 MFile_area mf_init(const char *name, const char *spec, const char *base,
110                    int only_shadow_files)
111     ZEBRA_GCC_ATTR((warn_unused_result));
112     
113 /** \brief destroys metafile area handle
114     \param ma metafile area handle
115 */
116 void mf_destroy(MFile_area ma);
117
118 /** \brief opens metafile
119     \param ma metafile area handle
120     \param name pseudo filename (name*.mf)
121     \param block_size block size for this file
122     \param wflag write flag, 0=read, 1=write&read
123     \returns metafile handle, or NULL for error (could not be opened)
124  */
125 MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag)
126     ZEBRA_GCC_ATTR((warn_unused_result));
127     
128 /** \brief closes metafile
129     \param mf metafile handle
130     \retval 0 OK
131 */
132 int mf_close(MFile mf);
133
134 /** \brief reads block from metafile
135     \param mf metafile handle
136     \param no block position
137     \param offset offset within block
138     \param nbytes no of bytes to read (0 for whole block)
139     \param buf content (filled with data if OK)
140     \retval 0 block partially read
141     \retval 1 block fully read
142     \retval -1 block could not be read due to error
143  */
144 int mf_read(MFile mf, zint no, int offset, int nbytes, void *buf)
145     ZEBRA_GCC_ATTR((warn_unused_result));
146     
147 /** \brief writes block to metafile
148     \param mf metafile handle
149     \param no block position
150     \param offset offset within block
151     \param nbytes no of bytes to write (0 for whole block)
152     \param buf content to be written
153     \retval 0 block written
154     \retval -1 error (block not written)
155 */
156 int mf_write(MFile mf, zint no, int offset, int nbytes, const void *buf)
157     ZEBRA_GCC_ATTR((warn_unused_result));    
158     
159 /** \brief reset all files in a metafile area (optionally delete them as well)
160     \param ma metafile area
161     \param unlink_flag if unlink_flag=1 all files are removed from FS
162 */
163 void mf_reset(MFile_area ma, int unlink_flag);
164
165 /* \brief gets statistics about directory in metafile area
166    \param ma the area
167    \param no directory number (0=first, 1=second,...)
168    \param directory holds directory name (if found)
169    \param used_bytes used file bytes in directory (if found)
170    \param max_bytes max usage of bytes (if found)
171    \retval 1 no is within range and directory, used, max are set.
172    \retval 0 no is out of range and directory, used, max are unset
173
174    We are using double, because off_t may have a different size
175    on same platform depending on whether 64-bit is enabled or not.
176    Note that if an area has unlimited size, that is represented
177    as max_bytes = -1.
178 */ 
179 int mf_area_directory_stat(MFile_area ma, int no, const char **directory,
180                            double *bytes_used, double *bytes_max);
181     
182 YAZ_END_CDECL
183
184 #endif
185 /*
186  * Local variables:
187  * c-basic-offset: 4
188  * c-file-style: "Stroustrup"
189  * indent-tabs-mode: nil
190  * End:
191  * vim: shiftwidth=4 tabstop=8 expandtab
192  */
193