1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
5 *
6 * $Id: ex_access.c,v 12.7 2008/01/08 20:58:23 bostic Exp $
7 */
8
9#include <sys/types.h>
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14
15#ifdef _WIN32
16extern int getopt(int, char * const *, const char *);
17#else
18#include <unistd.h>
19#endif
20
21#include <db_config.h>
22#include <db_int.h>
23
24#define	DATABASE	"access.db"
25int dbdemo_main __P((int, char *[]));
26int dbdemo_usage __P((void));
27
28int
29dbdemo(args)
30	char *args;
31{
32	int argc;
33	char **argv;
34
35	__db_util_arg("dbdemo", args, &argc, &argv);
36	return (dbdemo_main(argc, argv) ? EXIT_FAILURE : EXIT_SUCCESS);
37}
38
39#include <stdio.h>
40#define	ERROR_RETURN	ERROR
41
42int
43dbdemo_main(argc, argv)
44	int argc;
45	char *argv[];
46{
47	extern int optind, __db_getopt_reset;
48	DB *dbp;
49	DBC *dbcp;
50	DBT key, data;
51	size_t len;
52	int ch, ret, rflag;
53	char *database, *p, *t, buf[1024], rbuf[1024];
54	const char *progname = "dbdemo";		/* Program name. */
55
56	rflag = 0;
57	__db_getopt_reset = 1;
58	while ((ch = getopt(argc, argv, "r")) != EOF)
59		switch (ch) {
60		case 'r':
61			rflag = 1;
62			break;
63		case '?':
64		default:
65			return (dbdemo_usage());
66		}
67	argc -= optind;
68	argv += optind;
69
70	/* Accept optional database name. */
71	database = *argv == NULL ? DATABASE : argv[0];
72
73	/* Optionally discard the database. */
74	if (rflag)
75		(void)remove(database);
76
77	/* Create and initialize database object, open the database. */
78	if ((ret = db_create(&dbp, NULL, 0)) != 0) {
79		fprintf(stderr,
80		    "%s: db_create: %s\n", progname, db_strerror(ret));
81		return (EXIT_FAILURE);
82	}
83	dbp->set_errfile(dbp, stderr);
84	dbp->set_errpfx(dbp, progname);
85	if ((ret = dbp->set_pagesize(dbp, 1024)) != 0) {
86		dbp->err(dbp, ret, "set_pagesize");
87		goto err1;
88	}
89	if ((ret = dbp->set_cachesize(dbp, 0, 32 * 1024, 0)) != 0) {
90		dbp->err(dbp, ret, "set_cachesize");
91		goto err1;
92	}
93	if ((ret = dbp->open(dbp,
94	    NULL, database, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
95		dbp->err(dbp, ret, "%s: open", database);
96		goto err1;
97	}
98
99	/*
100	 * Insert records into the database, where the key is the user
101	 * input and the data is the user input in reverse order.
102	 */
103	memset(&key, 0, sizeof(DBT));
104	memset(&data, 0, sizeof(DBT));
105	for (;;) {
106		printf("input> ");
107		fflush(stdout);
108		if (fgets(buf, sizeof(buf), stdin) == NULL)
109			break;
110		if (strcmp(buf, "exit\n") == 0 || strcmp(buf, "quit\n") == 0)
111			break;
112		if ((len = strlen(buf)) <= 1)
113			continue;
114		for (t = rbuf, p = buf + (len - 2); p >= buf;)
115			*t++ = *p--;
116		*t++ = '\0';
117
118		key.data = buf;
119		data.data = rbuf;
120		data.size = key.size = (u_int32_t)len - 1;
121
122		switch (ret =
123		    dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) {
124		case 0:
125			break;
126		default:
127			dbp->err(dbp, ret, "DB->put");
128			if (ret != DB_KEYEXIST)
129				goto err1;
130			break;
131		}
132	}
133	printf("\n");
134
135	/* Acquire a cursor for the database. */
136	if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) {
137		dbp->err(dbp, ret, "DB->cursor");
138		goto err1;
139	}
140
141	/* Initialize the key/data pair so the flags aren't set. */
142	memset(&key, 0, sizeof(key));
143	memset(&data, 0, sizeof(data));
144
145	/* Walk through the database and print out the key/data pairs. */
146	while ((ret = dbcp->get(dbcp, &key, &data, DB_NEXT)) == 0)
147		printf("%.*s : %.*s\n",
148		    (int)key.size, (char *)key.data,
149		    (int)data.size, (char *)data.data);
150	if (ret != DB_NOTFOUND) {
151		dbp->err(dbp, ret, "DBcursor->get");
152		goto err2;
153	}
154
155	/* Close everything down. */
156	if ((ret = dbcp->close(dbcp)) != 0) {
157		dbp->err(dbp, ret, "DBcursor->close");
158		goto err1;
159	}
160	if ((ret = dbp->close(dbp, 0)) != 0) {
161		fprintf(stderr,
162		    "%s: DB->close: %s\n", progname, db_strerror(ret));
163		return (EXIT_FAILURE);
164	}
165	return (EXIT_SUCCESS);
166
167err2:	(void)dbcp->close(dbcp);
168err1:	(void)dbp->close(dbp, 0);
169	return (EXIT_FAILURE);
170}
171
172int
173dbdemo_usage()
174{
175	(void)fprintf(stderr, "usage: ex_access [-r] [database]\n");
176	return (EXIT_FAILURE);
177}
178