1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
5 *
6 * $Id: ex_sequence.c,v 12.9 2008/04/17 01:35:27 alexg 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.h>
22
23#define	DATABASE	"sequence.db"
24#define	SEQUENCE	"my_sequence"
25int main __P((int, char *[]));
26int usage __P((void));
27
28int
29main(argc, argv)
30	int argc;
31	char *argv[];
32{
33	extern int optind;
34	DB *dbp;
35	DB_SEQUENCE *seq;
36	DBT key;
37	int i, ret, rflag;
38	db_seq_t seqnum;
39	char ch;
40	const char *database, *progname = "ex_sequence";
41
42	dbp = NULL;
43	seq = NULL;
44
45	rflag = 0;
46	while ((ch = getopt(argc, argv, "r")) != EOF)
47		switch (ch) {
48		case 'r':
49			rflag = 1;
50			break;
51		case '?':
52		default:
53			return (usage());
54		}
55	argc -= optind;
56	argv += optind;
57
58	/* Accept optional database name. */
59	database = *argv == NULL ? DATABASE : argv[0];
60
61	/* Optionally discard the database. */
62	if (rflag)
63		(void)remove(database);
64
65	/* Create and initialize database object, open the database. */
66	if ((ret = db_create(&dbp, NULL, 0)) != 0) {
67		fprintf(stderr,
68		    "%s: db_create: %s\n", progname, db_strerror(ret));
69		return (EXIT_FAILURE);
70	}
71	dbp->set_errfile(dbp, stderr);
72	dbp->set_errpfx(dbp, progname);
73	if ((ret = dbp->open(dbp,
74	    NULL, database, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
75		dbp->err(dbp, ret, "%s: open", database);
76		goto err;
77	}
78
79	if ((ret = db_sequence_create(&seq, dbp, 0)) != 0) {
80		dbp->err(dbp, ret, "db_sequence_create");
81		goto err;
82	}
83
84	memset(&key, 0, sizeof(DBT));
85	key.data = SEQUENCE;
86	key.size = (u_int32_t)strlen(SEQUENCE);
87
88	if ((ret = seq->open(seq, NULL, &key, DB_CREATE)) != 0) {
89		dbp->err(dbp, ret, "%s: DB_SEQUENCE->open", SEQUENCE);
90		goto err;
91	}
92
93	for (i = 0; i < 10; i++) {
94		if ((ret = seq->get(seq, NULL, 1, &seqnum, 0)) != 0) {
95			dbp->err(dbp, ret, "DB_SEQUENCE->get");
96			goto err;
97		}
98
99		/* There's no portable way to print 64-bit numbers. */
100#ifdef _WIN32
101		printf("Got sequence number %I64d\n", (int64_t)seqnum);
102#else
103		printf(
104		    "Got sequence number %llu\n", (unsigned long long)seqnum);
105#endif
106	}
107
108	/* Close everything down. */
109	if ((ret = seq->close(seq, 0)) != 0) {
110		seq = NULL;
111		dbp->err(dbp, ret, "DB_SEQUENCE->close");
112		goto err;
113	}
114	if ((ret = dbp->close(dbp, 0)) != 0) {
115		fprintf(stderr,
116		    "%s: DB->close: %s\n", progname, db_strerror(ret));
117		return (EXIT_FAILURE);
118	}
119	return (EXIT_SUCCESS);
120
121err:	if (seq != NULL)
122		(void)seq->close(seq, 0);
123	if (dbp != NULL)
124		(void)dbp->close(dbp, 0);
125	return (EXIT_FAILURE);
126}
127
128int
129usage()
130{
131	(void)fprintf(stderr, "usage: ex_sequence [-r] [database]\n");
132	return (EXIT_FAILURE);
133}
134