Files
cpython-source-deps/docs/gsg/C/secondaryCursor.html
2017-09-04 13:40:25 -05:00

158 lines
5.7 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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.62.4" />
<link rel="home" href="index.html" title="Getting Started with Berkeley DB" />
<link rel="up" href="indexes.html" title="Chapter 5. Secondary Databases" />
<link rel="previous" href="secondaryDelete.html" title="Deleting Secondary Database Records" />
<link rel="next" href="joins.html" title="Database Joins" />
</head>
<body>
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr>
<th colspan="3" align="center">
Using Cursors with Secondary Databases
</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></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 href="Cursors.html">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 <tt class="literal">DB_GET_BOTH</tt> and related flags with
<tt class="methodname">DB-&gt;get()</tt>
and a secondary database. Instead, you must use
<span><tt class="methodname">DB-&gt;pget()</tt>.</span>
Also, in that case the primary and secondary key given on the call to
<tt class="methodname">DB-&gt;pget()</tt>
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 href="keyCreator.html">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 &lt;db.h&gt;
#include &lt;string.h&gt;
...
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-&gt;cursor(sdbp, NULL, &amp;cursorp, 0);
/*
* Zero out the DBT before using it.
*/
memset(&amp;key, 0, sizeof(DBT));
memset(&amp;data, 0, sizeof(DBT));
key.data = search_name;
key.size = strlen(search_name) + 1;
/* Position the cursor */
while (cursorp-&gt;get(cursorp, &amp;key, &amp;data, DB_SET) == 0)
cursorp-&gt;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>