httpdirfs/src/cache.h

168 lines
4.1 KiB
C
Raw Normal View History

#ifndef CACHE_H
#define CACHE_H
#include <stdint.h>
#include <unistd.h>
/**
* \file cache.h
* \brief cache related structures and functions
* \details
* Metadata:
* - We store the metadata and the actual data separately in two
* different folders.
* - The metadata file should follow the following format:
* - file length (long)
2019-04-20 09:31:16 +02:00
* - CURLINFO_FILETIME
* - segment count (int)
* - individual segments (array of seg)
*
* \note
* - We are using 'long' to store file size, because the offset in fseek() is
* in long, because the way we use the cache system, you cannot seek past
* long. So the biggest file size has to be able to be stored in long. This
* makes this program architecturally dependent, but this is due to the
* dependency to fseek().
*/
2019-04-12 13:41:07 +02:00
/**
* \brief a cache segment
*/
typedef struct {
long start;
long end;
2019-04-12 13:41:07 +02:00
} Seg;
/**
2019-04-20 09:31:16 +02:00
* \brief cache in-memory data structure
* \note fanf2@cam.ac.uk told me to use an array rather than linked list!
*/
2019-04-12 13:41:07 +02:00
typedef struct {
char *filename; /**< the filename from the http server */
long len; /**<the size of the file */
long time; /**<the modified time of the file */
2019-04-12 13:41:07 +02:00
int nseg; /**<the number of segments */
Seg *seg; /**< the detail of each segment */
} Cache;
/***************************** To be completed ******************************/
2019-04-12 13:41:07 +02:00
/**
* \brief Read from a cache file set
* \details This function performs the following two things:
* - check again the metafile to see which segments are available
* - return the available segments
2019-04-12 13:41:07 +02:00
*/
long Cache_read(const char *fn, long offset, long len, uint8_t *buf);
/**
* \brief Write to a cache file set
* \details This function performs the following two things:
* - Write to the data file
* - Update the metadata file
*/
long Cache_write(const char *fn, long offset, long len,
const uint8_t *buf);
/****************************** Work in progress *****************************/
2019-04-12 13:41:07 +02:00
2019-04-20 09:31:16 +02:00
/**************************** Completed functions ****************************/
/**
* \brief initialise the cache system
* \details This function basically sets up the following variables:
* - META_DIR
* - DATA_DIR
*/
void Cache_init(const char *dir);
2019-04-21 00:46:08 +02:00
/**
* \brief Allocate a new cache data structure
*/
Cache *Cache_alloc();
/**
* \brief free a cache data structure
*/
void Cache_free(Cache *cf);
2019-04-21 00:46:08 +02:00
/**
* \brief Check if both metadata and the data file exist, and perform cleanup.
* \details
* This function checks if both metadata file and the data file exist. If that
* is not the case, clean up is performed - the existing unpaired metadata file
* or data file is deleted.
* \return
* - 1, if both metadata and cache file exist
* - 0, otherwise
*/
int Cache_exist(const char *fn);
2019-04-21 01:42:32 +02:00
/**
* \brief create a cache file set
*/
Cache *Cache_create(const char *fn, long len, long time);
2019-04-21 00:46:08 +02:00
/**
* \brief open a cache file set
* \warning We assume that the metadata file and the data file both exist
*/
Cache *Cache_open(const char *fn);
2019-04-21 01:42:32 +02:00
/**
* \brief create a metadata file
*/
int Meta_create(const Cache *cf);
2019-04-12 13:41:07 +02:00
/**
* \brief write a metadata file
2019-04-21 00:46:08 +02:00
* \return
* - -1 on error,
* - 0 on success
2019-04-12 13:41:07 +02:00
*/
int Meta_write(const Cache *cf);
2019-04-12 13:41:07 +02:00
/**
* \brief read a metadata file
2019-04-21 00:46:08 +02:00
* \return
* - -1 on error,
* - 0 on success
2019-04-12 13:41:07 +02:00
*/
int Meta_read(Cache *cf);
/**
* \brief create a data file
* \details We use sparse creation here
* \return
2019-04-21 01:42:32 +02:00
* - 0 on successful creation of the data file, note that the result of
* the ftruncate() is ignored.
2019-04-21 01:42:32 +02:00
* - -1 on failure to create the data file.
*/
int Data_create(Cache *cf);
2019-04-21 00:46:08 +02:00
/**
* \brief obtain the data file size
*/
long Data_size(const char *fn);
2019-04-12 13:41:07 +02:00
/**
* \brief read a data file
* \return
* - -1 when the data file does not exist
* - otherwise, the number of bytes read.
2019-04-12 13:41:07 +02:00
*/
long Data_read(const Cache *cf, long offset, long len,
uint8_t *buf);
2019-04-12 13:41:07 +02:00
/**
* \brief write to a data file
* \return
* - -1 when the data file does not exist
* - otherwise, the number of bytes written.
2019-04-12 13:41:07 +02:00
*/
long Data_write(const Cache *cf, long offset, long len,
const uint8_t *buf);
#endif