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