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