1m4_ignore([dnl
2#include <sys/types.h>
3#include <sys/stat.h>
4
5#include <errno.h>
6#include <stdarg.h>
7#include <stdlib.h>
8#include <string.h>
9#include <unistd.h>
10
11#include <db.h>
12
13#define	MAXIMUM_RETRY	5
14
15int add_fruit(DB_ENV *, DB *, char *, char *);
16
17void  db_open(DB_ENV *a, DB **b, char *c, int d) {
18	a = NULL; b = NULL; c = NULL; d = 0;
19}
20void usage(){}
21void env_open(DB_ENV **a) { a = NULL; }
22void env_dir_create() {}
23])
24m4_indent([dnl
25int
26main(int argc, char *argv[])
27{
28	extern int optind;
29	DB *db_cats, *db_color, *db_fruit;
30	DB_ENV *dbenv;
31	int ch;
32m4_blank
33	while ((ch = getopt(argc, argv, "")) != EOF)
34		switch (ch) {
35		case '?':
36		default:
37			usage();
38		}
39	argc -= optind;
40	argv += optind;
41m4_blank
42	env_dir_create();
43	env_open(&dbenv);
44m4_blank
45	/* Open database: Key is fruit class; Data is specific type. */
46	db_open(dbenv, &db_fruit, "fruit", 0);
47m4_blank
48	/* Open database: Key is a color; Data is an integer. */
49	db_open(dbenv, &db_color, "color", 0);
50m4_blank
51	/*
52	 * Open database:
53	 *	Key is a name; Data is: company name, cat breeds.
54	 */
55	db_open(dbenv, &db_cats, "cats", 1);
56m4_blank
57m4_cbold([dnl
58	add_fruit(dbenv, db_fruit, "apple", "yellow delicious");])
59m4_blank
60	return (0);
61}
62m4_blank
63m4_cbold([dnl
64int
65add_fruit(DB_ENV *dbenv, DB *db, char *fruit, char *name)
66{
67	DBT key, data;
68	DB_TXN *tid;
69	int fail, ret, t_ret;
70m4_blank
71	/* Initialization. */
72	memset(&key, 0, sizeof(key));
73	memset(&data, 0, sizeof(data));
74	key.data = fruit;
75	key.size = strlen(fruit);
76	data.data = name;
77	data.size = strlen(name);
78m4_blank
79	for (fail = 0;;) {
80		/* Begin the transaction. */
81		if ((ret = dbenv-__GT__txn_begin(dbenv, NULL, &tid, 0)) != 0) {
82			dbenv-__GT__err(dbenv, ret, "DB_ENV-__GT__txn_begin");
83			exit (1);
84		}
85m4_blank
86		/* Store the value. */
87		switch (ret = db-__GT__put(db, tid, &key, &data, 0)) {
88		case 0:
89			/* Success: commit the change. */
90			if ((ret = tid-__GT__commit(tid, 0)) != 0) {
91				dbenv-__GT__err(dbenv, ret, "DB_TXN-__GT__commit");
92				exit (1);
93			}
94			return (0);
95		case DB_LOCK_DEADLOCK:
96		default:
97			/* Retry the operation. */
98			if ((t_ret = tid-__GT__abort(tid)) != 0) {
99				dbenv-__GT__err(dbenv, t_ret, "DB_TXN-__GT__abort");
100				exit (1);
101			}
102			if (fail++ == MAXIMUM_RETRY)
103				return (ret);
104			break;
105		}
106	}
107}])])
108