#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; }