2014-10-17 10:37:13 -04:00
|
|
|
/**
|
2014-03-12 20:23:34 -04:00
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/index.h>
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
|
2015-11-06 09:59:07 -05:00
|
|
|
static struct index_entry *__index_alloc(gchar *key)
|
2015-10-21 15:57:21 -04:00
|
|
|
{
|
2015-11-06 09:59:07 -05:00
|
|
|
struct index_entry *ent = new struct index_entry;
|
|
|
|
dbe_init(&ent->ie_dbe, ent);
|
|
|
|
ent->ie_set = SET_INIT();
|
|
|
|
ent->ie_key = key;
|
|
|
|
return ent;
|
2015-10-21 15:57:21 -04:00
|
|
|
}
|
|
|
|
|
2015-11-02 16:59:55 -05:00
|
|
|
static struct db_entry *index_alloc(const gchar *key)
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-11-06 09:59:07 -05:00
|
|
|
return &__index_alloc(g_strdup(key))->ie_dbe;
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-09-30 09:15:15 -04:00
|
|
|
static void index_free(struct db_entry *dbe)
|
|
|
|
{
|
2015-11-06 09:59:07 -05:00
|
|
|
struct index_entry *ent = INDEX_ENTRY(dbe);
|
2015-09-30 09:15:15 -04:00
|
|
|
set_deinit(&ent->ie_set);
|
2015-11-06 09:59:07 -05:00
|
|
|
delete ent;
|
2015-09-30 09:15:15 -04:00
|
|
|
}
|
|
|
|
|
2015-09-23 09:33:55 -04:00
|
|
|
static gchar *index_key(struct db_entry *dbe)
|
2014-11-06 08:24:13 -05:00
|
|
|
{
|
2015-11-06 09:59:07 -05:00
|
|
|
return INDEX_ENTRY(dbe)->ie_key;
|
2014-11-06 08:24:13 -05:00
|
|
|
}
|
|
|
|
|
2015-09-22 15:54:21 -04:00
|
|
|
static void index_write(struct file *file, struct db_entry *dbe)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-11-06 09:59:07 -05:00
|
|
|
file_writef(file, "%s\n" , INDEX_ENTRY(dbe)->ie_key);
|
|
|
|
set_write(file, &INDEX_ENTRY(dbe)->ie_set);
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2015-09-22 09:24:19 -04:00
|
|
|
static struct db_entry *index_read(struct file *file)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-09-22 09:24:19 -04:00
|
|
|
gchar *key = file_readl(file);
|
2015-11-06 09:59:07 -05:00
|
|
|
struct index_entry *ent;
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-11-06 09:59:07 -05:00
|
|
|
ent = __index_alloc(key);
|
2015-09-22 09:24:19 -04:00
|
|
|
set_read(file, &ent->ie_set);
|
2015-11-06 09:59:07 -05:00
|
|
|
return &ent->ie_dbe;
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-11-03 10:39:06 -05:00
|
|
|
static const struct db_ops index_ops = {
|
2015-11-02 16:59:55 -05:00
|
|
|
index_alloc,
|
2015-09-30 09:15:15 -04:00
|
|
|
index_free,
|
2015-09-23 09:33:55 -04:00
|
|
|
index_key,
|
2015-09-22 09:24:19 -04:00
|
|
|
index_read,
|
2015-10-05 20:12:32 -04:00
|
|
|
NULL,
|
2015-09-22 15:54:21 -04:00
|
|
|
index_write,
|
2015-11-03 10:39:06 -05:00
|
|
|
};
|
|
|
|
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-11-04 12:23:00 -05:00
|
|
|
void index_init(struct database *index, const gchar *filepath, bool autosave)
|
2015-09-21 09:02:13 -04:00
|
|
|
{
|
2015-11-03 10:39:06 -05:00
|
|
|
db_init(index, filepath, autosave, &index_ops);
|
2015-09-21 09:02:13 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-11-04 12:23:00 -05:00
|
|
|
index_entry *index_insert(struct database *index, const gchar *key,
|
2015-09-29 16:29:51 -04:00
|
|
|
unsigned int value)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-11-04 12:23:00 -05:00
|
|
|
struct index_entry *it = INDEX_ENTRY(db_find(index, key));
|
2015-09-29 16:11:59 -04:00
|
|
|
|
2015-10-21 15:57:21 -04:00
|
|
|
set_insert(&it->ie_set, value);
|
2015-09-29 16:11:59 -04:00
|
|
|
db_autosave(index);
|
|
|
|
return it;
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
|
|
|
|
2015-11-04 12:23:00 -05:00
|
|
|
void index_remove(struct database *index, const gchar *key, unsigned int value)
|
2014-03-12 20:23:34 -04:00
|
|
|
{
|
2015-11-04 12:23:00 -05:00
|
|
|
struct index_entry *it = INDEX_ENTRY(db_get(index, key));
|
2015-10-20 10:10:26 -04:00
|
|
|
if (it) {
|
2015-10-21 15:57:21 -04:00
|
|
|
set_remove(&it->ie_set, value);
|
2015-09-29 16:07:34 -04:00
|
|
|
db_autosave(index);
|
2015-10-20 10:10:26 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
2015-09-29 16:40:53 -04:00
|
|
|
|
2015-11-04 12:23:00 -05:00
|
|
|
bool index_has(struct database *index, const gchar *key, unsigned int value)
|
2015-09-29 16:40:53 -04:00
|
|
|
{
|
2015-11-04 12:23:00 -05:00
|
|
|
struct index_entry *it = INDEX_ENTRY(db_get(index, key));
|
2015-09-29 16:40:53 -04:00
|
|
|
|
|
|
|
if (!it)
|
|
|
|
return false;
|
2015-10-21 15:57:21 -04:00
|
|
|
return set_has(&it->ie_set, value);
|
2015-09-29 16:40:53 -04:00
|
|
|
}
|
2015-11-03 10:39:06 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_TESTING
|
|
|
|
const struct db_ops *test_index_ops() { return &index_ops; }
|
|
|
|
#endif /* CONFIG_TESTING */
|