#ifndef SP_FILE_H_
#define SP_FILE_H_
/*
* sophia database
* sphia.org
*
* Copyright (c) Dmitry Simonenko
* BSD License
*/
typedef struct spfile spfile;
struct spfile {
spa *a;
int creat;
uint64_t used;
uint64_t size;
uint64_t svp;
char *file;
int fd;
char *map;
struct iovec iov[8];
int iovc;
};
int sp_fileexists(char*);
int sp_filerm(char*);
static inline void
sp_fileinit(spfile *f, spa *a) {
memset(f, 0, sizeof(*f));
f->a = a;
f->fd = -1;
}
static inline void
sp_filesvp(spfile *f) {
f->svp = f->used;
}
int sp_mapopen(spfile*, char*);
int sp_mapnew(spfile*, char*, uint64_t);
int sp_mapclose(spfile*);
int sp_mapcomplete(spfile*);
int sp_mapunmap(spfile*);
int sp_mapunlink(spfile*);
int sp_mapensure(spfile*, uint64_t, float);
static inline int
sp_mapepoch(spfile *f, char *dir, uint32_t epoch, char *ext) {
char path[1024];
snprintf(path, sizeof(path), "%s/%"PRIu32".%s", dir, epoch, ext);
return sp_mapopen(f, path);
}
static inline int
sp_mapepochnew(spfile *f, uint64_t size,
char *dir, uint32_t epoch, char *ext) {
char path[1024];
snprintf(path, sizeof(path), "%s/%"PRIu32".%s.incomplete", dir, epoch, ext);
return sp_mapnew(f, path, size);
}
static inline void
sp_mapuse(spfile *f, size_t size) {
f->used += size;
assert(f->used <= f->size);
}
static inline void
sp_maprlb(spfile *f) {
f->used = f->svp;
}
static inline int
sp_mapinbound(spfile *f, size_t off) {
return off <= f->size;
}
int sp_lognew(spfile*, char*, uint32_t);
int sp_logcontinue(spfile*, char*, uint32_t);
int sp_logclose(spfile*);
int sp_logcomplete(spfile*);
int sp_logcompleteforce(spfile*);
int sp_logunlink(spfile*);
int sp_logflush(spfile*);
int sp_logrlb(spfile*);
int sp_logeof(spfile*);
static inline void
sp_logadd(spfile *f, const void *buf, int size) {
assert(f->iovc < 8);
f->iov[f->iovc].iov_base = (void*)buf;
f->iov[f->iovc].iov_len = size;
f->iovc++;
}
static inline int
sp_epochrm(char *dir, uint32_t epoch, char *ext) {
char path[1024];
snprintf(path, sizeof(path), "%s/%"PRIu32".%s", dir, epoch, ext);
return sp_filerm(path);
}
#endif