diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2021-08-03 08:11:41 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2021-08-03 08:19:14 +0300 |
commit | 0c9f46093c491747dd041cd1db9dcb6ba1570004 (patch) | |
tree | d7427f5b697366f2a4561995bb191f2e651cbfda | |
parent | e7fa39cc66f26f733f7e8f271aacc00f77696375 (diff) | |
download | gdbm-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.c | 3 | ||||
-rw-r--r-- | src/gdbmload.c | 30 |
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) |