xref: /original-bsd/old/dbconv/dbconv.c (revision e59fb703)
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 
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 
77 error(p)
78 	char *p;
79 {
80 	(void)fprintf(stderr, "dbconv: %s: %s\n", p, strerror(errno));
81 	exit(1);
82 }
83 
84 usage()
85 {
86 	(void)fprintf(stderr, "usage: dbconv from to\n");
87 	exit(1);
88 }
89