summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2021-08-03 08:11:41 +0300
committerSergey Poznyakoff <gray@gnu.org>2021-08-03 08:19:14 +0300
commit0c9f46093c491747dd041cd1db9dcb6ba1570004 (patch)
treed7427f5b697366f2a4561995bb191f2e651cbfda
parente7fa39cc66f26f733f7e8f271aacc00f77696375 (diff)
downloadgdbm-0c9f46093c491747dd041cd1db9dcb6ba1570004.tar.gz
Preserve the database format across dump/restore
* src/gdbmdump.c (_gdbm_dump_ascii): New parameter "format" holds the format of the original database. Set version number to 1.1 * src/gdbmload.c (_gdbm_load_file): Handle the "format" parameter.
-rw-r--r--src/gdbmdump.c3
-rw-r--r--src/gdbmload.c30
2 files changed, 30 insertions, 3 deletions
diff --git a/src/gdbmdump.c b/src/gdbmdump.c
index 9456e8f..e157dd3 100644
--- a/src/gdbmdump.c
+++ b/src/gdbmdump.c
@@ -72,7 +72,7 @@ _gdbm_dump_ascii (GDBM_FILE dbf, FILE *fp)
time (&t);
fprintf (fp, "# GDBM dump file created by %s on %s",
gdbm_version, ctime (&t));
- fprintf (fp, "#:version=1.0\n");
+ fprintf (fp, "#:version=1.1\n");
fprintf (fp, "#:file=%s\n", dbf->name);
fprintf (fp, "#:uid=%lu,", (unsigned long) st.st_uid);
@@ -84,6 +84,7 @@ _gdbm_dump_ascii (GDBM_FILE dbf, FILE *fp)
if (gr)
fprintf (fp, "group=%s,", gr->gr_name);
fprintf (fp, "mode=%03o\n", st.st_mode & 0777);
+ fprintf (fp, "#:format=%s\n", dbf->xheader ? "numsync" : "standard");
fprintf (fp, "# End of header\n");
key = gdbm_firstkey (dbf);
diff --git a/src/gdbmload.c b/src/gdbmload.c
index 29dc19c..2e376cd 100644
--- a/src/gdbmload.c
+++ b/src/gdbmload.c
@@ -397,6 +397,8 @@ _gdbm_load_file (struct dump_file *file, GDBM_FILE dbf, GDBM_FILE *ofp,
char *param = NULL;
int rc;
GDBM_FILE tmp = NULL;
+ int format = 0;
+ const char *p;
rc = get_parms (file);
if (rc)
@@ -411,17 +413,41 @@ _gdbm_load_file (struct dump_file *file, GDBM_FILE dbf, GDBM_FILE *ofp,
else
return GDBM_ILLEGAL_DATA;
+ if ((p = getparm (file->header, "format")) != NULL)
+ {
+ if (strcmp (p, "numsync") == 0)
+ format = GDBM_NUMSYNC;
+ /* FIXME: other values silently ignored */
+ }
+
if (!dbf)
{
+ int flags = replace ? GDBM_WRCREAT : GDBM_NEWDB;
const char *filename = getparm (file->header, "file");
+
if (!filename)
return GDBM_NO_DBNAME;
- tmp = gdbm_open (filename, 0,
- replace ? GDBM_WRCREAT : GDBM_NEWDB, 0600, NULL);
+
+ tmp = gdbm_open (filename, 0, flags | format, 0600, NULL);
if (!tmp)
return gdbm_errno;
dbf = tmp;
}
+
+ if (format)
+ {
+ /*
+ * If the database is already in the requested format, the call to
+ * gdbm_convert will return 0 immediately.
+ */
+ if (gdbm_convert (dbf, format))
+ {
+ rc = gdbm_errno;
+ if (tmp)
+ gdbm_close (tmp);
+ return rc;
+ }
+ }
param = file->header;
while (1)