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_cat(DB_ENV *dbenv, DB *db, char *name, ...); 16 17int add_color(DB_ENV *a, DB *b, char *c, int d) { 18 a = NULL; b = NULL; c = NULL; d = 0; 19 return (0); 20} 21int add_fruit(DB_ENV *a, DB *b, char *c, char *d) { 22 a = NULL; b = NULL; c = NULL; d = 0; 23 return (0); 24} 25void db_open(DB_ENV *a, DB **b, char *c, int d) { 26 a = NULL; b = NULL; c = NULL; d = 0; 27} 28void usage(){} 29void env_open(DB_ENV **a) { a = NULL; } 30void env_dir_create() {} 31]) 32m4_indent([dnl 33int 34main(int argc, char *argv[]) 35{ 36 extern int optind; 37 DB *db_cats, *db_color, *db_fruit; 38 DB_ENV *dbenv; 39 int ch; 40m4_blank 41 while ((ch = getopt(argc, argv, "")) != EOF) 42 switch (ch) { 43 case '?': 44 default: 45 usage(); 46 } 47 argc -= optind; 48 argv += optind; 49m4_blank 50 env_dir_create(); 51 env_open(&dbenv); 52m4_blank 53 /* Open database: Key is fruit class; Data is specific type. */ 54 db_open(dbenv, &db_fruit, "fruit", 0); 55m4_blank 56 /* Open database: Key is a color; Data is an integer. */ 57 db_open(dbenv, &db_color, "color", 0); 58m4_blank 59 /* 60 * Open database: 61 * Key is a name; Data is: company name, cat breeds. 62 */ 63 db_open(dbenv, &db_cats, "cats", 1); 64m4_blank 65 add_fruit(dbenv, db_fruit, "apple", "yellow delicious"); 66m4_blank 67 add_color(dbenv, db_color, "blue", 0); 68 add_color(dbenv, db_color, "blue", 3); 69m4_blank 70m4_cbold([dnl 71 add_cat(dbenv, db_cats, 72 "Amy Adams", 73 "Oracle", 74 "abyssinian", 75 "bengal", 76 "chartreaux", 77 NULL);]) 78m4_blank 79 return (0); 80} 81m4_blank 82m4_cbold([dnl 83int 84add_cat(DB_ENV *dbenv, DB *db, char *name, ...) 85{ 86 va_list ap; 87 DBC *dbc; 88 DBT key, data; 89 DB_TXN *tid; 90 int fail, ret, t_ret; 91 char *s; 92m4_blank 93 /* Initialization. */ 94 fail = 0; 95m4_blank 96 memset(&key, 0, sizeof(key)); 97 memset(&data, 0, sizeof(data)); 98 key.data = name; 99 key.size = strlen(name); 100m4_blank 101retry: /* Begin the transaction. */ 102 if ((ret = dbenv-__GT__txn_begin(dbenv, NULL, &tid, 0)) != 0) { 103 dbenv-__GT__err(dbenv, ret, "DB_ENV-__GT__txn_begin"); 104 exit (1); 105 } 106m4_blank 107 /* Delete any previously existing item. */ 108 switch (ret = db-__GT__del(db, tid, &key, 0)) { 109 case 0: 110 case DB_NOTFOUND: 111 break; 112 case DB_LOCK_DEADLOCK: 113 default: 114 /* Retry the operation. */ 115 if ((t_ret = tid-__GT__abort(tid)) != 0) { 116 dbenv-__GT__err(dbenv, t_ret, "DB_TXN-__GT__abort"); 117 exit (1); 118 } 119 if (fail++ == MAXIMUM_RETRY) 120 return (ret); 121 goto retry; 122 } 123m4_blank 124 /* Create a cursor. */ 125 if ((ret = db-__GT__cursor(db, tid, &dbc, 0)) != 0) { 126 dbenv-__GT__err(dbenv, ret, "db-__GT__cursor"); 127 exit (1); 128 } 129m4_blank 130 /* Append the items, in order. */ 131 va_start(ap, name); 132 while ((s = va_arg(ap, char *)) != NULL) { 133 data.data = s; 134 data.size = strlen(s); 135 switch (ret = dbc-__GT__c_put(dbc, &key, &data, DB_KEYLAST)) { 136 case 0: 137 break; 138 case DB_LOCK_DEADLOCK: 139 default: 140 va_end(ap); 141m4_blank 142 /* Retry the operation. */ 143 if ((t_ret = dbc-__GT__c_close(dbc)) != 0) { 144 dbenv-__GT__err( 145 dbenv, t_ret, "dbc-__GT__c_close"); 146 exit (1); 147 } 148 if ((t_ret = tid-__GT__abort(tid)) != 0) { 149 dbenv-__GT__err(dbenv, t_ret, "DB_TXN-__GT__abort"); 150 exit (1); 151 } 152 if (fail++ == MAXIMUM_RETRY) 153 return (ret); 154 goto retry; 155 } 156 } 157 va_end(ap); 158m4_blank 159 /* Success: commit the change. */ 160 if ((ret = dbc-__GT__c_close(dbc)) != 0) { 161 dbenv-__GT__err(dbenv, ret, "dbc-__GT__c_close"); 162 exit (1); 163 } 164 if ((ret = tid-__GT__commit(tid, 0)) != 0) { 165 dbenv-__GT__err(dbenv, ret, "DB_TXN-__GT__commit"); 166 exit (1); 167 } 168 return (0); 169}])]) 170