summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-08-08 17:24:34 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-08-08 17:24:34 +0300
commit7e2cc4ad7064d154d14b392a3c71f54f654ecede (patch)
tree6bd777f09395e3a6a084f17f67aea8364c90fe36
parentb9b62c57d4411d05cf56a3fdacdef5cc9358dcbd (diff)
downloadgdbm-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.h2
-rw-r--r--src/gdbmtool.c35
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);
}