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 155 156
|
<?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>Using Cursors with Secondary Databases</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" />
<link rel="up" href="indexes.html" title="Chapter 5. Secondary Databases" />
<link rel="prev" href="secondaryDelete.html" title="Deleting Secondary Database Records" />
<link rel="next" href="joins.html" title="Database Joins" />
</head>
<body>
<div xmlns="" class="navheader">
<div class="libver">
<p>Library Version 11.2.5.3</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">
<span xmlns="http://www.w3.org/1999/xhtml">Using Cursors with Secondary Databases</span>
</th>
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="secondaryDelete.html">Prev</a> </td>
<th width="60%" align="center">Chapter 5. Secondary Databases</th>
<td width="20%" align="right"> <a accesskey="n" href="joins.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="secondaryCursor"></a>
<span>Using Cursors with Secondary Databases</span>
</h2>
</div>
</div>
</div>
<p>
Just like cursors on a primary database, you can use
<span>cursors on secondary databases</span>
to iterate over the records in a secondary database. Like
<span>cursors used with primary databases,</span>
you can also use
<span>cursors with secondary databases</span>
to search for specific records in a database, to seek to the first
or last record in the database, to get the next duplicate record,
and so forth. For a complete description on cursors and their capabilities, see
<a class="xref" href="Cursors.html" title="Chapter 4. Using Cursors">Using Cursors</a>.
</p>
<p>
However, when you use
<span>cursors with secondary databases:</span>
</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>
Any data returned is the data contained on the primary database
record referenced by the secondary record.
</p>
</li>
<li>
<p>
You cannot use <code class="literal">DB_GET_BOTH</code> and related flags with
<code class="methodname">DB->get()</code>
and a secondary database. Instead, you must use
<span><code class="methodname">DB->pget()</code>.</span>
Also, in that case the primary and secondary key given on the call to
<code class="methodname">DB->pget()</code>
must match the secondary key and associated primary record key in
order for that primary record to be returned as a result of the
call.
</p>
</li>
</ul>
</div>
<p>
For example, suppose you are using the databases, classes, and key
<span>extractors</span>
described in <a class="xref" href="keyCreator.html" title="Implementing Key Extractors">Implementing Key
<span>Extractors</span>
</a>.
Then the following searches for a person's
name in the secondary database, and deletes all secondary and primary
records that use that name.
</p>
<a id="c_index8"></a>
<pre class="programlisting">#include <db.h>
#include <string.h>
...
DB *sdbp; /* Secondary DB handle */
DBC *cursorp; /* Cursor */
DBT key, data; /* DBTs used for the delete */
char *search_name = "John Doe"; /* Name to delete */
/* Primary and secondary database opens omitted for brevity. */
/* Get a cursor on the secondary database */
sdbp->cursor(sdbp, NULL, &cursorp, 0);
/*
* Zero out the DBT before using it.
*/
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = search_name;
key.size = strlen(search_name) + 1;
/* Position the cursor */
while (cursorp->get(cursorp, &key, &data, DB_SET) == 0)
cursorp->del(cursorp, 0); </pre>
</div>
<div class="navfooter">
<hr />
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left"><a accesskey="p" href="secondaryDelete.html">Prev</a> </td>
<td width="20%" align="center">
<a accesskey="u" href="indexes.html">Up</a>
</td>
<td width="40%" align="right"> <a accesskey="n" href="joins.html">Next</a></td>
</tr>
<tr>
<td width="40%" align="left" valign="top">Deleting Secondary Database Records </td>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
<td width="40%" align="right" valign="top"> Database Joins</td>
</tr>
</table>
</div>
</body>
</html>
|