/* * Copyright (c) 2004, 2010, 2013 Tama Communications Corporation * * This file is part of GNU GLOBAL. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef HAVE_CONFIG_H #include #endif #ifdef STDC_HEADERS #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "checkalloc.h" #include "die.h" #include "assoc.h" /** * assoc_open: open associate array. * * @return descriptor */ ASSOC * assoc_open(void) { ASSOC *assoc = (ASSOC *)check_malloc(sizeof(ASSOC)); /* * Use invisible temporary file. */ assoc->db = dbopen(NULL, O_RDWR|O_CREAT|O_TRUNC, 0600, DB_BTREE, NULL); if (assoc->db == NULL) die("cannot make associate array."); return assoc; } /** * assoc_close: close associate array. * * @param[in] assoc descriptor */ void assoc_close(ASSOC *assoc) { if (assoc == NULL) return; if (assoc->db == NULL) return; #ifdef USE_DB185_COMPAT (void)assoc->db->close(assoc->db); #else /* * If dbname = NULL, omit writing to the disk in __bt_close(). */ (void)assoc->db->close(assoc->db, 1); #endif free(assoc); } /** * assoc_put: put data into associate array. * * @param[in] assoc descriptor * @param[in] name name * @param[in] value value */ void assoc_put(ASSOC *assoc, const char *name, const char *value) { DB *db = assoc->db; DBT key, dat; int status; int length; if (db == NULL) die("associate array is not prepared."); if ((length = strlen(name)) == 0) die("primary key size == 0."); key.data = (char *)name; key.size = length+1; dat.data = (char *)value; dat.size = strlen(value)+1; status = (*db->put)(db, &key, &dat, 0); switch (status) { case RET_SUCCESS: break; case RET_ERROR: case RET_SPECIAL: die("cannot write to the associate array. (assoc_put)"); } } /** * assoc_put_withlen: put data into associate array. * * @param[in] assoc descriptor * @param[in] name name * @param[in] value value * @param[in] length length of value */ void assoc_put_withlen(ASSOC *assoc, const char *name, const char *value, int length) { DB *db = assoc->db; DBT key, dat; int status; int size; if (db == NULL) die("associate array is not prepared."); if ((size = strlen(name)) == 0) die("primary key size == 0."); key.data = (char *)name; key.size = size+1; dat.data = (char *)value; dat.size = length; status = (*db->put)(db, &key, &dat, 0); switch (status) { case RET_SUCCESS: break; case RET_ERROR: case RET_SPECIAL: die("cannot write to the associate array. (assoc_put)"); } } /** * assoc_get: get data from associate array. * * @param[in] assoc descriptor * @param[in] name name * @return value */ const char * assoc_get(ASSOC *assoc, const char *name) { DB *db = assoc->db; DBT key, dat; int status; if (db == NULL) die("associate array is not prepared."); key.data = (char *)name; key.size = strlen(name)+1; status = (*db->get)(db, &key, &dat, 0); switch (status) { case RET_SUCCESS: break; case RET_ERROR: die("cannot read from the associate array. (assoc_get)"); case RET_SPECIAL: return (NULL); } return (dat.data); }