1/* testndbm.c - Driver program to test the ndbm interface routines. */
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#include <sys/types.h>
35#if HAVE_STDLIB_H
36#include <stdlib.h>
37#endif
38#if HAVE_FILE_H
39#include <sys/file.h>
40#endif
41#include <sys/stat.h>
42#if HAVE_FCNTL_H
43#include <fcntl.h>
44#endif
45#ifdef GNU
46#include "ndbm.h"
47#else
48#include <ndbm.h>
49#endif
50
51#define TRUE  1
52#define FALSE 0
53
54
55/* The test program allows one to call all the routines plus the hash function.
56   The commands are single letter commands.  The user is prompted for all other
57   information.  The commands are q (quit), f (fetch), s (store), d (delete),
58   1 (firstkey), n (nextkey) and h (hash function). */
59
60int
61main (argc, argv)
62     int argc;
63     char *argv[];
64{
65
66  char  cmd_ch;
67
68  datum key_data;
69  datum data_data;
70  datum return_data;
71
72  char key_line[500];
73  char data_line[1000];
74
75  DBM *dbm_file;
76
77  char done = FALSE;
78
79  char *file_name;
80
81  /* Argument checking. */
82  if (argc > 2)
83    {
84      printf ("Usage: %s [dbm-file] \n",argv[0]);
85      exit (2);
86    }
87
88  if (argc > 1)
89    {
90      file_name = argv[1];
91    }
92  else
93    {
94      file_name = "junkndbm";
95    }
96
97  /* Initialize. */
98  data_data.dptr = data_line;
99
100  dbm_file = dbm_open (file_name, O_RDWR|O_CREAT, 00664);
101  if (dbm_file == NULL)
102    {
103      printf ("dbm_open failed.\n");
104      exit (2);
105    }
106
107  /* Welcome message. */
108  printf ("\nWelcome to the gndbm test program.  Type ? for help.\n\n");
109
110  while (!done)
111    {
112      printf ("com -> ");
113      cmd_ch = getchar ();
114      while (getchar () != '\n') /* Do nothing. */;
115      switch (cmd_ch)
116	{
117	case 'q':
118	  done = TRUE;
119	  break;
120
121	case 'f':
122	  printf ("key -> ");
123	  gets (key_line);
124	  key_data.dptr = key_line;
125	  key_data.dsize = strlen (key_line)+1;
126	  return_data = dbm_fetch (dbm_file, key_data);
127	  if (return_data.dptr != NULL)
128	      printf ("data is ->%s\n\n", return_data.dptr);
129	  else
130	    printf ("No such item found.\n\n");
131	  break;
132
133	case 's':
134	  printf ("key -> ");
135	  gets (key_line);
136	  key_data.dptr = key_line;
137	  key_data.dsize = strlen (key_line)+1;
138	  printf ("data -> ");
139	  gets (data_line);
140	  data_data.dsize = strlen (data_line)+1;
141	  if (dbm_store (dbm_file, key_data, data_data, DBM_REPLACE) != 0)
142	    printf ("Item not inserted. \n");
143	  printf ("\n");
144	  break;
145
146	case 'd':
147	  printf ("key -> ");
148	  gets (key_line);
149	  key_data.dptr = key_line;
150	  key_data.dsize = strlen (key_line)+1;
151	  if (dbm_delete (dbm_file, key_data) != 0)
152	    printf ("Item not found or deleted\n");
153	  printf ("\n");
154	  break;
155
156	case '1':
157	  key_data = dbm_firstkey (dbm_file);
158	  if (key_data.dptr != NULL)
159	    {
160	      return_data = dbm_fetch (dbm_file, key_data);
161	      printf ("key is ->%s\n", key_data.dptr);
162	      printf ("data is ->%s\n\n", return_data.dptr);
163	    }
164	  else
165	    printf ("No such item found.\n\n");
166	  break;
167
168
169	case '2':
170	  key_data = dbm_nextkey (dbm_file);
171	  if (key_data.dptr != NULL)
172	    {
173	      return_data = dbm_fetch (dbm_file, key_data);
174	      printf ("key is ->%s\n", key_data.dptr);
175	      printf ("data is ->%s\n\n", return_data.dptr);
176	    }
177	  else
178	    printf ("No such item found.\n\n");
179	  break;
180
181	case 'c':
182	  {
183	    int temp;
184	    temp = 0;
185	    return_data = dbm_firstkey (dbm_file);
186	    while (return_data.dptr != NULL)
187	      {
188		temp++;
189		return_data = dbm_nextkey (dbm_file);
190	      }
191	    printf ("There are %d items in the database.\n\n", temp);
192	  }
193	  break;
194
195	case '?':
196	  printf ("c - count elements\n");
197	  printf ("d - delete\n");
198	  printf ("f - fetch\n");
199	  printf ("q - quit\n");
200	  printf ("s - store\n");
201	  printf ("1 - firstkey\n");
202	  printf ("2 - nextkey on last return value\n\n");
203	  break;
204
205	default:
206	  printf ("What? \n\n");
207	  break;
208
209	}
210    }
211
212  /* Quit normally. */
213  dbm_close (dbm_file);
214  exit (0);
215
216}
217