diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-08-08 17:24:34 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-08-08 17:24:34 +0300 |
commit | 7e2cc4ad7064d154d14b392a3c71f54f654ecede (patch) | |
tree | 6bd777f09395e3a6a084f17f67aea8364c90fe36 | |
parent | b9b62c57d4411d05cf56a3fdacdef5cc9358dcbd (diff) | |
download | gdbm-7e2cc4ad7064d154d14b392a3c71f54f654ecede.tar.gz |
gdbmtool: new option to open the database at a given file descriptor
* src/gdbmtool.c (file_descr): New global.
(closedb): Reset file_descr to -1.
(opendb): Take second argument: file descriptor of the database file.
Use gdbm_fd_open if it is > 0.
New options: -d, -x
* src/gdbmdefs.h: Fix comment.
-rw-r--r-- | src/gdbmdefs.h | 2 | ||||
-rw-r--r-- | src/gdbmtool.c | 35 |
2 files changed, 29 insertions, 8 deletions
diff --git a/src/gdbmdefs.h b/src/gdbmdefs.h index 18ab8a0..5857ac5 100644 --- a/src/gdbmdefs.h +++ b/src/gdbmdefs.h @@ -159,7 +159,7 @@ typedef struct /* We want to keep from reading buckets as much as possible. The following is to implement a bucket cache. When full, buckets will be dropped in a - least recently read from disk order. */ + least recently used order. */ /* To speed up fetching and "sequential" access, we need to implement a data cache for key/data pairs read from the file. To find a key, we diff --git a/src/gdbmtool.c b/src/gdbmtool.c index 2fe5dda..fd21e69 100644 --- a/src/gdbmtool.c +++ b/src/gdbmtool.c @@ -30,7 +30,8 @@ # include <locale.h> #endif -char *file_name = NULL; /* Database file name */ +char *file_name = NULL; /* Database file name */ +int file_descr = -1; /* Database file descriptor */ GDBM_FILE gdbm_file = NULL; /* Database to operate upon */ datum key_data; /* Current key */ datum return_data; /* Current data */ @@ -48,11 +49,12 @@ closedb (void) gdbm_file = NULL; free (file_name); file_name = NULL; + file_descr = -1; } } static int -opendb (char *dbname) +opendb (char *dbname, int fd) { int cache_size = 0; int block_size = 0; @@ -97,7 +99,10 @@ opendb (char *dbname) if (variable_get ("filemode", VART_INT, (void**) &filemode)) abort (); - db = gdbm_open (dbname, block_size, open_mode | flags, filemode, NULL); + if (fd > 0) + db = gdbm_fd_open (fd, dbname, block_size, open_mode | flags, NULL); + else + db = gdbm_open (dbname, block_size, open_mode | flags, filemode, NULL); if (db == NULL) { @@ -140,7 +145,7 @@ checkdb (void) file_name = estrdup (GDBMTOOL_DEFFILE); terror (_("warning: using default database file %s"), file_name); } - return opendb (file_name); + return opendb (file_name, file_descr); } return 0; } @@ -343,7 +348,7 @@ open_handler (struct handler_param *param) { char *name = tildexpand (PARAM_STRING (param, 0)); closedb (); - if (opendb (name) == 0) + if (opendb (name, -1) == 0) file_name = name; else free (name); @@ -1852,6 +1857,9 @@ struct gdbm_option optab[] = { { 'r', "read-only", NULL, N_("open database in read-only mode") }, { 's', "synchronize", NULL, N_("synchronize to disk after each write") }, { 'q', "quiet", NULL, N_("don't print initial banner") }, + { 'd', "db-descriptor", N_("FD"),N_("open database at the given file descriptor") }, + { 'x', "extended", NULL, N_("extended format (numsync)") }, + { 0, "numsync", NULL, NULL, PARSEOPT_ALIAS }, #if GDBMTOOL_DEBUG { OPT_LEX_TRACE, "lex-trace", NULL, N_("enable lexical analyzer traces") }, { OPT_GRAM_TRACE, "gram-trace", NULL, N_("enable grammar traces") }, @@ -2387,6 +2395,15 @@ main (int argc, char *argv[]) opt = parseopt_next ()) switch (opt) { + case 'd': + file_descr = atoi (optarg); + if (file_descr <= 0) + { + terror (_("invalid file descriptor: %s"), optarg); + exit (EXIT_USAGE); + } + break; + case 'f': source = optarg; break; @@ -2435,6 +2452,10 @@ main (int argc, char *argv[]) variable_set ("quiet", VART_BOOL, &bv); break; + case 'x': + variable_set ("format", VART_STRING, "numsync"); + break; + case OPT_LEX_TRACE: lex_trace (1); break; @@ -2444,8 +2465,8 @@ main (int argc, char *argv[]) break; default: - terror (_("unknown option; try `%s -h' for more info"), - progname); + terror (_("unknown option %c; try `%s -h' for more info"), + optopt, progname); exit (EXIT_USAGE); } |