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