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