File: txncursor.html

package info (click to toggle)
db 5.1.29-9
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 150,348 kB
  • sloc: ansic: 400,169; java: 94,399; tcl: 70,967; sh: 37,399; cs: 30,758; cpp: 21,132; perl: 14,227; xml: 9,854; makefile: 3,777; yacc: 1,003; awk: 942; sql: 801; erlang: 461; python: 216; php: 24; asm: 14
file content (154 lines) | stat: -rw-r--r-- 5,195 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Transactional Cursors</title>
    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
    <link rel="up" href="usingtxns.html" title="Chapter 3. Transaction Basics" />
    <link rel="prev" href="nestedtxn.html" title="Nested Transactions" />
    <link rel="next" href="txnindices.html" title="Secondary Indices with Transaction Applications" />
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Transactional Cursors</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="nestedtxn.html">Prev</a> </td>
          <th width="60%" align="center">Chapter 3. Transaction Basics</th>
          <td width="20%" align="right"> <a accesskey="n" href="txnindices.html">Next</a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="txncursor"></a>Transactional Cursors</h2>
          </div>
        </div>
      </div>
      <p>
            You can transaction-protect your cursor operations by
            specifying a transaction handle at the time that you create
            your cursor.  Beyond that, you do not ever
            provide a transaction handle directly to a cursor method.
        </p>
      <p>
            Note that if you transaction-protect a cursor, then you must
            make sure that the cursor is closed before you either commit or
            abort the transaction. For example:
        </p>
      <pre class="programlisting">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#include "db.h"

int
main(void)
{
    DBT key, data;
    DBC *cursorp;
    DB_TXN *txn = NULL;
    int ret, c_ret;
    char *replacementString = "new string";

    ...
    /* environment and db handle creation omitted */
    ...

    /* Get the txn handle */
    txn = NULL;
    ret = envp-&gt;txn_begin(envp, NULL, &amp;txn, 0);
    if (ret != 0) {
        envp-&gt;err(envp, ret, "Transaction begin failed.");
        goto err;
    }

    /* Get the cursor, supply the txn handle at that time */
    ret = dbp-&gt;cursor(dbp, txn, &amp;cursorp, 0);
    if (ret != 0) {
        envp-&gt;err(envp, ret, "Cursor open failed.");
        txn-&gt;abort(txn);
        goto err;
    }

    /* 
     * Now use the cursor. Note that we do not supply any txn handles to 
     * these methods.
     */
    /* Prepare the DBTs */
    memset(&amp;key, 0, sizeof(DBT));
    memset(&amp;data, 0, sizeof(DBT));
    while (cursor-&gt;get(&amp;key, &amp;data, DB_NEXT) == 0) {
        data-&gt;data = (void *)replacementString;
        data-&gt;size = (strlen(replacementString) + 1) * sizeof(char);
        c_ret = cursor-&gt;put(cursor, &amp;key, &amp;data, DB_CURRENT);
        if (c_ret != 0) {
            /* abort the transaction and goto error */ 
            envp-&gt;err(envp, ret, "Cursor put failed.");
            cursorp-&gt;close(cursorp);
            cursorp = NULL;
            txn-&gt;abort(txn);
            goto err;
        }
    }

    /* 
     * Commit the transaction. Note that the transaction handle
     * can no longer be used.
     */ 
    ret = cursorp-&gt;close(cursorp);
    if (ret != 0) {
        envp-&gt;err(envp, ret, "Cursor close failed.");
        txn-&gt;abort(txn);
        goto err;
    }
    ret = txn-&gt;commit(txn, 0);
    if (ret != 0) {
        envp-&gt;err(envp, ret, "Transaction commit failed.");
        goto err;
    }

err:
    /* Close the cursor (if the handle is not NULL)
     * and perform whatever other cleanup is required */

    /* Close the database */

    /* Close the environment */

    ...

    if (c_ret != 0)
        ret = c_ret;
    
    return (ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
} </pre>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="nestedtxn.html">Prev</a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="usingtxns.html">Up</a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="txnindices.html">Next</a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">Nested Transactions </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">Home</a>
          </td>
          <td width="40%" align="right" valign="top"> Secondary Indices with Transaction Applications</td>
        </tr>
      </table>
    </div>
  </body>
</html>