1 /*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1990 The Regents of the University of California.\n\
11 All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)dbconv.c 5.2 (Berkeley) 11/19/91";
16 #endif /* not lint */
17
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <fcntl.h>
21 #include <ndbm.h>
22 #include <errno.h>
23 #include <stdio.h>
24
main(argc,argv)25 main(argc, argv)
26 int argc;
27 char **argv;
28 {
29 extern int optind;
30 DB *db;
31 DBM *dbm;
32 DBT t_key, t_data;
33 datum f_key, f_data;
34 int ch, dup, rec;
35
36 while ((ch = getopt(argc, argv, "")) != EOF)
37 switch((char)ch) {
38 case '?':
39 default:
40 usage();
41 }
42 argc -= optind;
43 argv += optind;
44
45 dbm = dbm_open(*argv, O_RDONLY, 0);
46 if (!dbm)
47 error(*argv);
48 db = dbopen(*++argv, O_CREAT|O_WRONLY, DEFFILEMODE, DB_HASH, NULL);
49 if (!db)
50 error(*argv);
51
52 dup = rec = 0;
53 for (f_key = dbm_firstkey(dbm); f_key.dptr; f_key = dbm_nextkey(dbm)) {
54 f_data = dbm_fetch(dbm, f_key);
55 t_key.data = f_key.dptr;
56 t_key.size = f_key.dsize;
57 t_data.data = f_data.dptr;
58 t_data.size = f_data.dsize;
59 switch((db->put)(db, &t_key, &t_data, R_NOOVERWRITE)) {
60 case -1:
61 error(*argv);
62 case 0:
63 ++rec;
64 break;
65 case 1:
66 if (!dup++)
67 (void)fprintf(stderr,
68 "dbconv: duplicate records discarded\n");
69 break;
70 }
71 }
72 (void)(db->close)(db);
73 (void)printf("%d records, %d duplicates discarded.\n", rec + dup, dup);
74 exit(dup ? 1 : 0);
75 }
76
error(p)77 error(p)
78 char *p;
79 {
80 (void)fprintf(stderr, "dbconv: %s: %s\n", p, strerror(errno));
81 exit(1);
82 }
83
usage()84 usage()
85 {
86 (void)fprintf(stderr, "usage: dbconv from to\n");
87 exit(1);
88 }
89