From b6afefb5d12dbed4801272dae3048588dfc1cb9a Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Sat, 12 May 2018 17:10:22 +0100 Subject: first working version --- src/ea_map.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/ea_map.c (limited to 'src/ea_map.c') diff --git a/src/ea_map.c b/src/ea_map.c new file mode 100644 index 0000000..e8d103e --- /dev/null +++ b/src/ea_map.c @@ -0,0 +1,79 @@ +#include "project.h" +#include + +static DB *ea_map_db = NULL; + +static int ea_map_init (void) +{ + int ret; + + ret = db_create (&ea_map_db, NULL, 0); + + if (ret) { + ea_map_db = NULL; + return -1; + } + + ret = ea_map_db->open (ea_map_db, NULL, NULL, NULL, DB_BTREE, DB_CREATE, 0x600); + + if (ret) { + ea_map_db->err (ea_map_db, ret, "ea_map_db"); + ea_map_db->close (ea_map_db, 0); + ea_map_db = NULL; + return -1; + } + + return 0; +} + +int ea_map_lookup (blk64_t src_blk, blk64_t *dst_blk, blk64_t *len) +{ + DBT key = {0}, data = {0}; + blk64_t *buf; + + if (!ea_map_db) + return -1; + + key.size = sizeof (src_blk); + key.data = &src_blk; + + if (ea_map_db->get (ea_map_db, NULL, &key, &data, 0)) + return -1; + + if (data.size != (2 * sizeof (blk64_t))) + return -1; + + buf = (blk64_t *) data.data; + + *dst_blk = buf[0]; + *len = buf[1]; + + return 0; +} + + +int ea_map_set (blk64_t src_blk, blk64_t dst_blk, blk64_t len) +{ + DBT key = {0}, data = {0}; + blk64_t buf[2] = {dst_blk, len}; + int ret; + + if (!ea_map_db) + if (ea_map_init()) + return -1; + + + key.size = sizeof (src_blk); + key.data = &src_blk; + data.size = 2 * sizeof (dst_blk); + data.data = buf; + + ret = ea_map_db->put (ea_map_db, NULL, &key, &data, 0); + + if (ret) + ea_map_db->err (ea_map_db, ret, "DB->put"); + + return ret; +} + + -- cgit v1.2.3