1/* conv2gdbm.c - This is a program to convert dbm files to gdbm files. */ 2 3/* This file is part of GDBM, the GNU data base manager, by Philip A. Nelson. 4 Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc. 5 6 GDBM is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 GDBM is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GDBM; see the file COPYING. If not, write to 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 19 20 You may contact the author by: 21 e-mail: phil@cs.wwu.edu 22 us-mail: Philip A. Nelson 23 Computer Science Department 24 Western Washington University 25 Bellingham, WA 98226 26 27*************************************************************************/ 28 29 30/* include system configuration before all else. */ 31#include "autoconf.h" 32 33#include <stdio.h> 34#if HAVE_STDLIB_H 35#include <stdlib.h> 36#endif 37#include "gdbm.h" 38 39#include "getopt.h" 40 41extern int dbminit (); 42extern datum fetch (); 43extern datum firstkey (); 44extern datum nextkey (); 45 46static void usage(); 47 48/* Boolean Constants */ 49#define TRUE 1 50#define FALSE 0 51 52int 53main (argc, argv) 54 int argc; 55 char *argv[]; 56{ 57 GDBM_FILE gfile; /* The gdbm file. */ 58 datum key; /* Key and data pairs retrieved. */ 59 datum data; 60 int errors; /* error count. */ 61 int num; /* insert count. */ 62 int block_size; /* gdbm block size. */ 63 char quiet; /* Do work Quietly? */ 64 char option_char; /* The option character. */ 65 66 char *dbm_file, *gdbm_file; /* pointers to the file names. */ 67 68 /* Initialize things. */ 69 quiet = FALSE; 70 block_size = 0; 71 72 /* Check for proper arguments. */ 73 74 if (argc < 2) 75 usage (argv[0]); 76 77 /* Check for the options. */ 78 while ( (option_char = getopt (argc, argv, "b:q")) != EOF) 79 { 80 switch (option_char) 81 { 82 case 'b': 83 block_size = atoi (optarg); 84 break; 85 86 case 'q': 87 quiet = TRUE; 88 break; 89 90 default: 91 usage (argv[0]); 92 } 93 } 94 95 /* The required dbm file name. */ 96 if (argc <= optind) 97 { 98 usage (argv[0]); 99 } 100 else 101 { 102 dbm_file = argv[optind]; 103 gdbm_file = argv[optind]; 104 optind += 1; 105 } 106 107 /* The optional gdbm file name. */ 108 if (argc > optind) 109 { 110 gdbm_file = argv[optind]; 111 optind += 1; 112 } 113 114 /* No more arguments are legal. */ 115 if (argc > optind) usage (argv[0]); 116 117 /* Open the dbm file. */ 118 if (dbminit (dbm_file) != 0) 119 { 120 printf ("%s: dbm file not opened\n", argv[0]); 121 exit (2); 122 } 123 124 /* Open the gdbm file. Since the dbm files have .pag and .dir we 125 will use the file name without any extension. */ 126 gfile = gdbm_open (gdbm_file, block_size, GDBM_WRCREAT, 00664, NULL); 127 if (gfile == NULL) 128 { 129 printf ("%s: gdbm file not opened\n", argv[0]); 130 exit (2); 131 } 132 133 134 /* Do the conversion. */ 135 errors = 0; 136 num = 0; 137 138 if (!quiet) 139 printf ("%s: Converting %s.pag and %s.dir to %s.\n", argv[0], dbm_file, 140 dbm_file, gdbm_file); 141 142 /* The convert loop - read a key/data pair from the dbm file and insert 143 it into the gdbm file. */ 144 145 for (key = firstkey (); key.dptr != NULL; key = nextkey (key)) 146 { 147 data = fetch (key); 148 if (gdbm_store (gfile, key, data, GDBM_INSERT) != 0) 149 { 150 errors++; 151 } 152 else 153 { 154 num++; 155 if ( !quiet && ((num % 100) == 0)) 156 { 157 printf ("."); 158 if ( (num % 7000) == 0) 159 printf ("\n"); 160 } 161 } 162 } 163 164 gdbm_close (gfile); 165 166 if (!quiet) 167 { 168 /* Final reporting. */ 169 if (errors) 170 printf ("%s: %d items not inserted into %s.\n", argv[0], 171 errors, gdbm_file); 172 173 printf ("%s: %d items inserted into %s.\n", argv[0], num, gdbm_file); 174 } 175 exit(0); 176 /* NOTREACHED */ 177} 178 179static void usage (name) 180 char *name; 181{ 182 printf ("usage: %s [-q] [-b block_size] dbmfile [gdbmfile]\n", name); 183 exit (2); 184} 185