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