/database/database.h
/* Blerg is (C) 2011 The Dominion of Awesome, and is distributed under a
 * BSD-style license.  Please see the COPYING file for details.
 */
#ifndef _DATABASE_H
#define _DATABASE_H

#include <stdint.h>
#include <time.h>

#define VALID_CHAR(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_')
#define WHITESPACE(c) (c == ' ' || c == '\t' || c == '\n' || c == '\r')

struct record {
	uint32_t offset;
	uint16_t length;
	uint16_t flags;
	time_t timestamp;
};

struct meta {
	uint64_t sequence;
	uint64_t subscription_mark;
	uint32_t status;
};

/* meta.status is a bitfield of these options */
/* Muted - if set, tags/refs and subscriptions are not calculated */
#define BLERGSTATUS_MUTED      0x00000001
/* Mentioned - if set, user has been mentioned. */
#define BLERGSTATUS_MENTIONED  0x00000002

struct blerg {
	int meta_fd;
	int index_fd;
	int data_fd;
	char *name;
	char *base_path;
	struct meta *meta;
	struct record *index;
	char *data;
	int current_segment;
	int data_size;
};

#define BLERG_INVALID_RECORD 0xFFFFFFFFFFFFFFFF

int      blerg_init();
int      blerg_exists(const char *name);
struct   blerg *blerg_open(const char *name);
int      blerg_close(struct blerg *blerg);
uint64_t blerg_store(struct blerg *blerg, const char *data, int length);
int      blerg_fetch(struct blerg *blerg, uint64_t record, char **data, int *length);
uint64_t blerg_get_record_count(struct blerg *);
time_t   blerg_get_timestamp(struct blerg *blerg, uint64_t record);
int      blerg_set_subscription_mark(struct blerg *blerg);
uint64_t blerg_get_subscription_mark(struct blerg *blerg);
int      blerg_set_status(struct blerg *blerg, uint32_t status, int v);
int      blerg_get_status(struct blerg *blerg, uint32_t status);

#endif //_DATABASE_H