xref: /original-bsd/old/dbconv/dbconv.c (revision 9c5e301d)
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.1 (Berkeley) 02/14/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 
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 = hash_open(*++argv, O_CREAT|O_WRONLY, DEFFILEMODE,
49 	    (HASHINFO *)NULL);
50 	if (!db)
51 		error(*argv);
52 
53 	dup = rec = 0;
54 	for (f_key = dbm_firstkey(dbm); f_key.dptr; f_key = dbm_nextkey(dbm)) {
55 		f_data = dbm_fetch(dbm, f_key);
56 		t_key.data = f_key.dptr;
57 		t_key.size = f_key.dsize;
58 		t_data.data = f_data.dptr;
59 		t_data.size = f_data.dsize;
60 		switch((db->put)(db, &t_key, &t_data, R_NOOVERWRITE)) {
61 		case -1:
62 			error(*argv);
63 		case 0:
64 			++rec;
65 			break;
66 		case 1:
67 			if (!dup++)
68 				(void)fprintf(stderr,
69 				    "dbconv: duplicate records discarded\n");
70 			break;
71 		}
72 	}
73 	(void)(db->close)(db);
74 	(void)printf("%d records, %d duplicates discarded.\n", rec + dup, dup);
75 	exit(dup ? 1 : 0);
76 }
77 
78 error(p)
79 	char *p;
80 {
81 	(void)fprintf(stderr, "dbconv: %s: %s\n", p, strerror(errno));
82 	exit(1);
83 }
84 
85 usage()
86 {
87 	(void)fprintf(stderr, "usage: dbconv from to\n");
88 	exit(1);
89 }
90