diff options
Diffstat (limited to 'contrib/global/lib/dbio.c')
-rw-r--r-- | contrib/global/lib/dbio.c | 328 |
1 files changed, 0 insertions, 328 deletions
diff --git a/contrib/global/lib/dbio.c b/contrib/global/lib/dbio.c deleted file mode 100644 index c29a91477bdb..000000000000 --- a/contrib/global/lib/dbio.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright (c) 1996, 1997 Shigio Yamaguchi. All rights reserved. - * - * Redilogibution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redilogibutions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redilogibutions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the dilogibution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Shigio Yamaguchi. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * dbio.c 14-Dec-97 - * - */ -#include <sys/stat.h> - -#include <fcntl.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include "dbio.h" -#include "die.h" -#include "test.h" - -DBT key; /* key of record */ -DBT dat; /* data of record */ -/* - * db_open: open db database. - * - * i) dbname database name - * i) mode 0: read only, 1: write only, 2: read & write - * i) perm file permission - * i) flags - * DBIO_DUP: allow duplicate records. - * DBIO_REMOVE: remove on closed. - * r) descripter for db_xxx() - * - * db_open leaves database permission 0600. please chmod(2) to make public. - */ -DBIO * -db_open(dbname, mode, perm, flags) -char *dbname; -int mode; -int perm; -int flags; -{ - DB *db; - int rw; - BTREEINFO info; - DBIO *dbio; - - /* - * setup argments. - */ - if (mode == 0) - rw = O_RDONLY; - else if (mode == 1) - rw = O_RDWR|O_CREAT|O_TRUNC; - else if (mode == 2) - rw = O_RDWR; - else - die("db_open illegal mode."); - info.flags = (flags & DBIO_DUP) ? R_DUP : 0; - info.cachesize = 500000; - info.maxkeypage = 0; - info.minkeypage = 0; - info.psize = 0; - info.compare = NULL; - info.prefix = NULL; - info.lorder = LITTLE_ENDIAN; - - /* - * if unlink do job normally, those who already open tag file can use - * it until closing. - */ - if (mode == 1 && test("f", dbname)) - (void)unlink(dbname); - db = dbopen(dbname, rw, 0600, DB_BTREE, &info); - if (!db) - die1("db_open failed (dbname = %s).", dbname); - if (!(dbio = (DBIO *)malloc(sizeof(DBIO)))) - die("short of memory."); - strcpy(dbio->dbname, dbname); - dbio->db = db; - dbio->openflags = flags; - dbio->perm = (mode == 1) ? perm : 0; - dbio->lastkey = (char *)0; - dbio->lastdat = (char *)0; - - return dbio; -} -/* - * db_get: get data by a key. - * - * i) dbio descripter - * i) k key - * r) pointer to data - */ -char * -db_get(dbio, k) -DBIO *dbio; -char *k; -{ - DB *db = dbio->db; - int status; - - key.data = k; - key.size = strlen(k)+1; - - status = (*db->get)(db, &key, &dat, 0); - dbio->lastkey = (char *)key.data; - dbio->lastdat = (char *)dat.data; - switch (status) { - case RET_SUCCESS: - break; - case RET_ERROR: - die("db_get failed."); - case RET_SPECIAL: - return((char *)0); - } - return((char *)dat.data); -} -/* - * db_put: put data by a key. - * - * i) dbio descripter - * i) k key - * i) d data - */ -void -db_put(dbio, k, d) -DBIO *dbio; -char *k; -char *d; -{ - DB *db = dbio->db; - int status; - - if (strlen(k) > MAXKEYLEN) - die("primary key too long."); - key.data = k; - key.size = strlen(k)+1; - dat.data = d; - dat.size = strlen(d)+1; - - status = (*db->put)(db, &key, &dat, 0); - switch (status) { - case RET_SUCCESS: - break; - case RET_ERROR: - case RET_SPECIAL: - die("db_put failed."); - } -} -/* - * db_del: delete record by a key. - * - * i) dbio descripter - * i) k key - */ -void -db_del(dbio, k) -DBIO *dbio; -char *k; -{ - DB *db = dbio->db; - int status; - - if (k) { - key.data = k; - key.size = strlen(k)+1; - status = (*db->del)(db, &key, 0); - } else - status = (*db->del)(db, &key, R_CURSOR); - if (status == RET_ERROR) - die("db_del failed."); -} -/* - * db_first: get first record. - * - * i) dbio dbio descripter - * i) k key - * !=NULL: indexed read by key - * ==NULL: sequential read - * i) flags following db_next call take over this. - * DBIO_KEY read key part - * DBIO_PREFIX prefix read - * DBIO_SKIPMETA skip META record - * only valied when sequential read - * r) data - */ -char * -db_first(dbio, k, flags) -DBIO *dbio; -char *k; -int flags; -{ - DB *db = dbio->db; - int status; - - if (flags & DBIO_PREFIX && !k) - flags &= ~DBIO_PREFIX; - if (flags & DBIO_SKIPMETA && k) - flags &= ~DBIO_SKIPMETA; - if (k) { - if (strlen(k) > MAXKEYLEN) - die("primary key too long."); - strcpy(dbio->key, k); - key.data = k; - key.size = strlen(k); - /* - * includes NULL character unless prefix read. - */ - if (!(flags & DBIO_PREFIX)) - key.size++; - dbio->keylen = key.size; - status = (*db->seq)(db, &key, &dat, R_CURSOR); - } else { - dbio->keylen = dbio->key[0] = 0; - for (status = (*db->seq)(db, &key, &dat, R_FIRST); - status == RET_SUCCESS && - flags & DBIO_SKIPMETA && - *((char *)dat.data) == ' '; - status = (*db->seq)(db, &key, &dat, R_NEXT)) - ; - } - dbio->lastkey = (char *)key.data; - dbio->lastdat = (char *)dat.data; - switch (status) { - case RET_SUCCESS: - break; - case RET_ERROR: - die("db_first failed."); - case RET_SPECIAL: - return ((char *)0); - } - dbio->ioflags = flags; - if (flags & DBIO_PREFIX) { - if (strncmp((char *)key.data, dbio->key, dbio->keylen)) - return (char *)0; - } else if (dbio->keylen) { - if (strcmp((char *)key.data, dbio->key)) - return (char *)0; - } - if (flags & DBIO_KEY) { - strcpy(dbio->prev, (char *)key.data); - return (char *)key.data; - } - return ((char *)dat.data); -} -/* - * db_next: get next record. - * - * i) dbio dbio descripter - * r) data - */ -char * -db_next(dbio) -DBIO *dbio; -{ - DB *db = dbio->db; - int flags = dbio->ioflags; - int status; - - while ((status = (*db->seq)(db, &key, &dat, R_NEXT)) == RET_SUCCESS) { - if (flags & DBIO_SKIPMETA) { - if (*((char *)dat.data) == ' ') - continue; - } - if (flags & DBIO_KEY) { - if (!strcmp(dbio->prev, (char *)key.data)) - continue; - if (strlen((char *)key.data) > MAXKEYLEN) - die("primary key too long."); - strcpy(dbio->prev, (char *)key.data); - } - dbio->lastkey = (char *)key.data; - dbio->lastdat = (char *)dat.data; - if (flags & DBIO_PREFIX) { - if (strncmp((char *)key.data, dbio->key, dbio->keylen)) - return (char *)0; - } else if (dbio->keylen) { - if (strcmp((char *)key.data, dbio->key)) - return (char *)0; - } - return (flags & DBIO_KEY) ? (char *)key.data : (char *)dat.data; - } - if (status == RET_ERROR) - die("db_next failed."); - return (char *)0; -} -/* - * db_close: close db - * - * i) dbio dbio descripter - */ -void -db_close(dbio) -DBIO *dbio; -{ - DB *db = dbio->db; - (void)db->close(db); - if (dbio->openflags & DBIO_REMOVE) - (void)unlink(dbio->dbname); - else if (dbio->perm && chmod(dbio->dbname, dbio->perm) < 0) - die("cannot change file mode."); - (void)free(dbio); -} |