#ifndef SP_FILE_H_
#define SP_FILE_H_
/*
* sophia database
* sphia.org
*
* Copyright (c) Dmitry Simonenko
* BSD License
*/
typedef struct spbatch spbatch;
typedef struct spfile spfile;
#define SPIOVMAX 1024
struct spbatch {
struct iovec iov[SPIOVMAX];
int iovc;
};
struct spfile {
spa *a;
int creat;
uint64_t used;
uint64_t size;
uint64_t svp;
char *file;
int fd;
char *map;
};
int sp_fileexists(char*);
int sp_filerm(char*);
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);
}
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;
}
static inline void
sp_batchinit(spbatch *b) {
b->iovc = 0;
}
static inline int
sp_batchhas(spbatch *b) {
return b->iovc > 0;
}
static inline int
sp_batchensure(spbatch *b, int count) {
return (b->iovc + count) < SPIOVMAX;
}
static inline void
sp_batchadd(spbatch *b, void *ptr, size_t size) {
assert(b->iovc < SPIOVMAX);
b->iov[b->iovc].iov_base = ptr;
b->iov[b->iovc].iov_len = size;
b->iovc++;
}
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_logwrite(spfile*, void*, size_t);
int sp_logput(spfile*, spbatch*);
int sp_logrlb(spfile*);
int sp_logeof(spfile*);
int sp_lockfile(spfile*, char*);
int sp_unlockfile(spfile*);
#endif