1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 1997-2009 Oracle. All rights reserved. 5 * 6 * $Id$ 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