~ubuntu-branches/ubuntu/maverick/evolution-data-server/maverick-proposed

« back to all changes in this revision

Viewing changes to libdb/examples_c/ex_apprec/ex_apprec.c

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2010-05-17 17:02:06 UTC
  • mfrom: (1.1.79 upstream) (1.6.12 experimental)
  • Revision ID: james.westby@ubuntu.com-20100517170206-4ufr52vwrhh26yh0
Tags: 2.30.1-1ubuntu1
* Merge from debian experimental. Remaining change:
  (LP: #42199, #229669, #173703, #360344, #508494)
  + debian/control:
    - add Vcs-Bzr tag
    - don't use libgnome
    - Use Breaks instead of Conflicts against evolution 2.25 and earlier.
  + debian/evolution-data-server.install,
    debian/patches/45_libcamel_providers_version.patch:
    - use the upstream versioning, not a Debian-specific one 
  + debian/libedata-book1.2-dev.install, debian/libebackend-1.2-dev.install,
    debian/libcamel1.2-dev.install, debian/libedataserverui1.2-dev.install:
    - install html documentation
  + debian/rules:
    - don't build documentation it's shipped with the tarball

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*-
2
 
 * See the file LICENSE for redistribution information.
3
 
 *
4
 
 * Copyright (c) 1996-2002
5
 
 *      Sleepycat Software.  All rights reserved.
6
 
 *
7
 
 * $Id$
8
 
 */
9
 
 
10
 
#include <sys/types.h>
11
 
#include <sys/stat.h>
12
 
 
13
 
#include <errno.h>
14
 
#include <stddef.h>
15
 
#include <stdio.h>
16
 
#include <stdlib.h>
17
 
#include <string.h>
18
 
#include <unistd.h>
19
 
 
20
 
#include <db.h>
21
 
 
22
 
#include "ex_apprec.h"
23
 
 
24
 
int     apprec_dispatch __P((DB_ENV *, DBT *, DB_LSN *, db_recops));
25
 
int     open_env __P((const char *, FILE *, const char *, DB_ENV **));
26
 
int     verify_absence __P((DB_ENV *, const char *));
27
 
int     verify_presence __P((DB_ENV *, const char *));
28
 
 
29
 
int
30
 
main(argc, argv)
31
 
        int argc;
32
 
        char *argv[];
33
 
{
34
 
        extern char *optarg;
35
 
        extern int optind;
36
 
        DB_ENV *dbenv;
37
 
        DB_LSN lsn;
38
 
        DB_TXN *txn;
39
 
        DBT dirnamedbt;
40
 
        int ret;
41
 
        const char *home;
42
 
        char ch, dirname[256];
43
 
        const char *progname = "ex_apprec";             /* Program name. */
44
 
 
45
 
        /* Default home. */
46
 
        home = "TESTDIR";
47
 
 
48
 
        while ((ch = getopt(argc, argv, "h:")) != EOF)
49
 
                switch (ch) {
50
 
                case 'h':
51
 
                        home = optarg;
52
 
                        break;
53
 
                default:
54
 
                        fprintf(stderr, "usage: %s [-h home]", progname);
55
 
                        exit(EXIT_FAILURE);
56
 
                }
57
 
 
58
 
        printf("Set up environment.\n");
59
 
        if ((ret = open_env(home, stderr, progname, &dbenv)) != 0)
60
 
                return (EXIT_FAILURE);
61
 
 
62
 
        printf("Create a directory in a transaction.\n");
63
 
        /*
64
 
         * This application's convention is to log the full directory name,
65
 
         * including trailing nul.
66
 
         */
67
 
        memset(&dirnamedbt, 0, sizeof(dirnamedbt));
68
 
        sprintf(dirname, "%s/MYDIRECTORY", home);
69
 
        dirnamedbt.data = dirname;
70
 
        dirnamedbt.size = strlen(dirname) + 1;
71
 
 
72
 
        if ((ret = dbenv->txn_begin(dbenv, NULL, &txn, 0)) != 0) {
73
 
                dbenv->err(dbenv, ret, "txn_begin");
74
 
                return (EXIT_FAILURE);
75
 
        }
76
 
 
77
 
        /* Remember, always log actions before you execute them! */
78
 
        memset(&lsn, 0, sizeof(lsn));
79
 
        if ((ret =
80
 
            ex_apprec_mkdir_log(dbenv, txn, &lsn, 0, &dirnamedbt)) != 0) {
81
 
                dbenv->err(dbenv, ret, "mkdir_log");
82
 
                return (EXIT_FAILURE);
83
 
        }
84
 
        if (mkdir(dirname, 0755) != 0) {
85
 
                dbenv->err(dbenv, errno, "mkdir");
86
 
                return (EXIT_FAILURE);
87
 
        }
88
 
 
89
 
        printf("Verify the directory's presence: ");
90
 
        verify_presence(dbenv, dirname);
91
 
        printf("check.\n");
92
 
 
93
 
        /* Now abort the transaction and verify that the directory goes away. */
94
 
        printf("Abort the transaction.\n");
95
 
        if ((ret = txn->abort(txn)) != 0) {
96
 
                dbenv->err(dbenv, ret, "txn_abort");
97
 
                return (EXIT_FAILURE);
98
 
        }
99
 
 
100
 
        printf("Verify the directory's absence: ");
101
 
        verify_absence(dbenv, dirname);
102
 
        printf("check.\n");
103
 
 
104
 
        /* Now do the same thing over again, only with a commit this time. */
105
 
        printf("Create a directory in a transaction.\n");
106
 
        memset(&dirnamedbt, 0, sizeof(dirnamedbt));
107
 
        sprintf(dirname, "%s/MYDIRECTORY", home);
108
 
        dirnamedbt.data = dirname;
109
 
        dirnamedbt.size = strlen(dirname) + 1;
110
 
        if ((ret = dbenv->txn_begin(dbenv, NULL, &txn, 0)) != 0) {
111
 
                dbenv->err(dbenv, ret, "txn_begin");
112
 
                return (EXIT_FAILURE);
113
 
        }
114
 
 
115
 
        memset(&lsn, 0, sizeof(lsn));
116
 
        if ((ret =
117
 
            ex_apprec_mkdir_log(dbenv, txn, &lsn, 0, &dirnamedbt)) != 0) {
118
 
                dbenv->err(dbenv, ret, "mkdir_log");
119
 
                return (EXIT_FAILURE);
120
 
        }
121
 
        if (mkdir(dirname, 0755) != 0) {
122
 
                dbenv->err(dbenv, errno, "mkdir");
123
 
                return (EXIT_FAILURE);
124
 
        }
125
 
 
126
 
        printf("Verify the directory's presence: ");
127
 
        verify_presence(dbenv, dirname);
128
 
        printf("check.\n");
129
 
 
130
 
        /* Now abort the transaction and verify that the directory goes away. */
131
 
        printf("Commit the transaction.\n");
132
 
        if ((ret = txn->commit(txn, 0)) != 0) {
133
 
                dbenv->err(dbenv, ret, "txn_commit");
134
 
                return (EXIT_FAILURE);
135
 
        }
136
 
 
137
 
        printf("Verify the directory's presence: ");
138
 
        verify_presence(dbenv, dirname);
139
 
        printf("check.\n");
140
 
 
141
 
        printf("Now remove the directory, then run recovery.\n");
142
 
        if ((ret = dbenv->close(dbenv, 0)) != 0) {
143
 
                fprintf(stderr, "DB_ENV->close: %s\n", db_strerror(ret));
144
 
                return (EXIT_FAILURE);
145
 
        }
146
 
        if (rmdir(dirname) != 0) {
147
 
                fprintf(stderr,
148
 
                    "%s: rmdir failed with error %s", progname,
149
 
                    strerror(errno));
150
 
        }
151
 
        verify_absence(dbenv, dirname);
152
 
 
153
 
        /* Opening with DB_RECOVER runs recovery. */
154
 
        if ((ret = open_env(home, stderr, progname, &dbenv)) != 0)
155
 
                return (EXIT_FAILURE);
156
 
 
157
 
        printf("Verify the directory's presence: ");
158
 
        verify_presence(dbenv, dirname);
159
 
        printf("check.\n");
160
 
 
161
 
        /* Close the handle. */
162
 
        if ((ret = dbenv->close(dbenv, 0)) != 0) {
163
 
                fprintf(stderr, "DB_ENV->close: %s\n", db_strerror(ret));
164
 
                return (EXIT_FAILURE);
165
 
        }
166
 
 
167
 
        return (EXIT_SUCCESS);
168
 
}
169
 
 
170
 
int
171
 
open_env(home, errfp, progname, dbenvp)
172
 
        const char *home, *progname;
173
 
        FILE *errfp;
174
 
        DB_ENV **dbenvp;
175
 
{
176
 
        DB_ENV *dbenv;
177
 
        int ret;
178
 
 
179
 
        /*
180
 
         * Create an environment object and initialize it for error
181
 
         * reporting.
182
 
         */
183
 
        if ((ret = db_env_create(&dbenv, 0)) != 0) {
184
 
                fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
185
 
                return (ret);
186
 
        }
187
 
        dbenv->set_errfile(dbenv, errfp);
188
 
        dbenv->set_errpfx(dbenv, progname);
189
 
 
190
 
        /* Set up our custom recovery dispatch function. */
191
 
        if ((ret = dbenv->set_app_dispatch(dbenv, apprec_dispatch)) != 0) {
192
 
                dbenv->err(dbenv, ret, "set_app_dispatch");
193
 
                return (ret);
194
 
        }
195
 
 
196
 
        /*
197
 
         * Open the environment with full transactional support, running
198
 
         * recovery.
199
 
         */
200
 
        if ((ret =
201
 
            dbenv->open(dbenv, home, DB_CREATE | DB_RECOVER | DB_INIT_LOCK |
202
 
            DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN, 0)) != 0) {
203
 
                dbenv->err(dbenv, ret, "environment open: %s", home);
204
 
                dbenv->close(dbenv, 0);
205
 
                return (ret);
206
 
        }
207
 
 
208
 
        *dbenvp = dbenv;
209
 
        return (0);
210
 
}
211
 
 
212
 
/*
213
 
 * Sample application dispatch function to handle user-specified log record
214
 
 * types.
215
 
 */
216
 
int
217
 
apprec_dispatch(dbenv, dbt, lsn, op)
218
 
        DB_ENV *dbenv;
219
 
        DBT *dbt;
220
 
        DB_LSN *lsn;
221
 
        db_recops op;
222
 
{
223
 
        u_int32_t rectype;
224
 
 
225
 
        /* Pull the record type out of the log record. */
226
 
        memcpy(&rectype, dbt->data, sizeof(rectype));
227
 
 
228
 
        switch (rectype) {
229
 
        case DB_ex_apprec_mkdir:
230
 
                return (ex_apprec_mkdir_recover(dbenv, dbt, lsn, op, NULL));
231
 
        default:
232
 
                /*
233
 
                 * We've hit an unexpected, allegedly user-defined record
234
 
                 * type.
235
 
                 */
236
 
                dbenv->errx(dbenv, "Unexpected log record type encountered");
237
 
                return (EINVAL);
238
 
        }
239
 
}
240
 
 
241
 
int
242
 
verify_absence(dbenv, dirname)
243
 
        DB_ENV *dbenv;
244
 
        const char *dirname;
245
 
{
246
 
 
247
 
        if (access(dirname, F_OK) == 0) {
248
 
                dbenv->errx(dbenv, "Error--directory present!");
249
 
                exit(EXIT_FAILURE);
250
 
        }
251
 
 
252
 
        return (0);
253
 
}
254
 
 
255
 
int
256
 
verify_presence(dbenv, dirname)
257
 
        DB_ENV *dbenv;
258
 
        const char *dirname;
259
 
{
260
 
 
261
 
        if (access(dirname, F_OK) != 0) {
262
 
                dbenv->errx(dbenv, "Error--directory not present!");
263
 
                exit(EXIT_FAILURE);
264
 
        }
265
 
 
266
 
        return (0);
267
 
}