mirror of
https://github.com/berkeleydb/je.git
synced 2024-11-15 01:46:24 +00:00
284 lines
13 KiB
HTML
284 lines
13 KiB
HTML
<?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>Cursor Example</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 Java Edition" />
|
||
<link rel="up" href="Cursors.html" title="Chapter 9. Using Cursors" />
|
||
<link rel="prev" href="ReplacingEntryWCursor.html" title="Replacing Records Using Cursors" />
|
||
<link rel="next" href="indexes.html" title="Chapter 10. Secondary Databases" />
|
||
</head>
|
||
<body>
|
||
<div xmlns="" class="navheader">
|
||
<div class="libver">
|
||
<p>Library Version 12.2.7.5</p>
|
||
</div>
|
||
<table width="100%" summary="Navigation header">
|
||
<tr>
|
||
<th colspan="3" align="center">Cursor Example</th>
|
||
</tr>
|
||
<tr>
|
||
<td width="20%" align="left"><a accesskey="p" href="ReplacingEntryWCursor.html">Prev</a> </td>
|
||
<th width="60%" align="center">Chapter 9. Using Cursors</th>
|
||
<td width="20%" align="right"> <a accesskey="n" href="indexes.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="cursorUsage"></a>Cursor Example</h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>In <a class="xref" href="dbUsage.html" title="Database Example">Database Example</a> we wrote an
|
||
application that loaded two <code class="classname">Database</code> objects with vendor
|
||
and inventory information. In this example, we will use those databases to
|
||
display all of the items in the inventory database. As a part of showing
|
||
any given inventory item, we will look up the vendor who can provide the
|
||
item and show the vendor's contact information.</p>
|
||
<p>To do this, we create the <code class="classname">ExampleInventoryRead</code>
|
||
application. This application reads and displays all inventory records by:</p>
|
||
<div class="orderedlist">
|
||
<ol type="1">
|
||
<li>
|
||
<p>Opening the environment and then the inventory, vendor, and
|
||
class catalog <code class="classname">Database</code> objects. We do this using the
|
||
<code class="classname">MyDbEnv</code> class. See <a class="xref" href="dbtUsage.html#dbenvStoredClass" title="Example 8.4 Stored Class Catalog Management with MyDbEnv">Stored Class Catalog Management with MyDbEnv</a>
|
||
for a description of this class.</p>
|
||
</li>
|
||
<li>
|
||
<p>Obtaining a cursor from the inventory <code class="classname">Database</code>.</p>
|
||
</li>
|
||
<li>
|
||
<p>Steps through the <code class="classname">Database</code>, displaying
|
||
each record as it goes.</p>
|
||
</li>
|
||
<li>
|
||
<p>To display the Inventory record, the custom tuple binding that
|
||
we created in <a class="xref" href="dbtUsage.html#InventoryBinding" title="Example 8.3 InventoryBinding.java">InventoryBinding.java</a> is used.</p>
|
||
</li>
|
||
<li>
|
||
<p><code class="methodname">Database.get()</code> is used to obtain the vendor that corresponds to
|
||
the inventory item.</p>
|
||
</li>
|
||
<li>
|
||
<p>A serial binding is used to convert the
|
||
<code class="classname">DatabaseEntry</code> returned
|
||
by the <code class="methodname">get()</code> to a Vendor object.</p>
|
||
</li>
|
||
<li>
|
||
<p>The contents of the Vendor object are displayed.</p>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
<p>We implemented the <code class="classname">Vendor</code> class in <a class="xref" href="dbtUsage.html#vendor" title="Example 8.2 Vendor.java">Vendor.java</a>. We implemented the
|
||
<code class="classname">Inventory</code> class in <a class="xref" href="dbtUsage.html#inventory" title="Example 8.1 Inventory.java">Inventory.java</a>.</p>
|
||
<p>The full implementation of <code class="classname">ExampleInventoryRead</code>
|
||
can be found in:
|
||
</p>
|
||
<pre class="programlisting"><span class="emphasis"><em>JE_HOME</em></span>/examples/je/gettingStarted/ExampleInventoryRead.java</pre>
|
||
<p>
|
||
where <code class="literal"><span class="emphasis"><em>JE_HOME</em></span></code> is the location where you
|
||
placed your JE
|
||
distribution.
|
||
</p>
|
||
<div class="example">
|
||
<a id="EIR"></a>
|
||
<p class="title">
|
||
<b>Example 9.1 ExampleInventoryRead.java</b>
|
||
</p>
|
||
<div class="example-contents">
|
||
<p>To begin, we import the necessary classes:</p>
|
||
<a id="je_cursor10"></a>
|
||
<pre class="programlisting">// file ExampleInventoryRead.java
|
||
package je.gettingStarted;
|
||
|
||
import com.sleepycat.bind.EntryBinding;
|
||
import com.sleepycat.bind.serial.SerialBinding;
|
||
import com.sleepycat.bind.tuple.TupleBinding;
|
||
|
||
import com.sleepycat.je.Cursor;
|
||
import com.sleepycat.je.DatabaseEntry;
|
||
import com.sleepycat.je.DatabaseException;
|
||
import com.sleepycat.je.LockMode;
|
||
import com.sleepycat.je.OperationStatus;
|
||
|
||
import java.io.File;
|
||
import java.io.IOException; </pre>
|
||
<p>Next we declare our class and set up some global variables. Note a
|
||
<code class="classname">MyDbEnv</code> object is instantiated here. We can do
|
||
this because its constructor never throws an exception. See <a class="xref" href="dbUsage.html" title="Database Example">Database Example</a> for its implementation
|
||
details.</p>
|
||
<a id="je_cursor11"></a>
|
||
<pre class="programlisting">public class ExampleInventoryRead {
|
||
|
||
private static File myDbEnvPath =
|
||
new File("/tmp/JEDB");
|
||
|
||
// Encapsulates the database environment and databases.
|
||
private static MyDbEnv myDbEnv = new MyDbEnv();
|
||
|
||
private static TupleBinding inventoryBinding;
|
||
private static EntryBinding vendorBinding;</pre>
|
||
<p>
|
||
Next we create the <code class="methodname">ExampleInventoryRead.usage()</code> and
|
||
<code class="methodname">ExampleInventoryRead.main()</code> methods.
|
||
We perform almost all of our exception handling from <code class="methodname">ExampleInventoryRead.main()</code>, and so we
|
||
must catch <code class="classname">DatabaseException</code> because the <code class="literal">com.sleepycat.je.*</code>
|
||
APIs throw them.
|
||
</p>
|
||
<a id="je_cursor12"></a>
|
||
<pre class="programlisting"> private static void usage() {
|
||
System.out.println("ExampleInventoryRead [-h <env directory>]");
|
||
System.exit(0);
|
||
}
|
||
|
||
public static void main(String args[]) {
|
||
ExampleInventoryRead eir = new ExampleInventoryRead();
|
||
try {
|
||
eir.run(args);
|
||
} catch (DatabaseException dbe) {
|
||
System.err.println("ExampleInventoryRead: " + dbe.toString());
|
||
dbe.printStackTrace();
|
||
} finally {
|
||
myDbEnv.close();
|
||
}
|
||
System.out.println("All done.");
|
||
}</pre>
|
||
<p>In <code class="methodname">ExampleInventoryRead.run()</code>, we call <code class="methodname">MyDbEnv.setup()</code> to
|
||
open our environment and databases. Then we create the bindings that we need for using our data objects with
|
||
<code class="classname">DatabaseEntry</code> objects.
|
||
</p>
|
||
<a id="je_cursor13"></a>
|
||
<pre class="programlisting"> private void run(String args[]) throws DatabaseException {
|
||
// Parse the arguments list
|
||
parseArgs(args);
|
||
|
||
myDbEnv.setup(myDbEnvPath, // path to the environment home
|
||
true); // is this environment read-only?
|
||
|
||
// Setup our bindings.
|
||
inventoryBinding = new InventoryBinding();
|
||
vendorBinding =
|
||
new SerialBinding(myDbEnv.getClassCatalog(),
|
||
Vendor.class);
|
||
showAllInventory();
|
||
}</pre>
|
||
<p>Now we write the loop that displays the <code class="classname">Inventory</code>
|
||
records. We do this by opening a cursor on the inventory database and
|
||
iterating over all its contents, displaying each as we go.</p>
|
||
<a id="je_cursor14"></a>
|
||
<pre class="programlisting"> private void showAllInventory()
|
||
throws DatabaseException {
|
||
// Get a cursor
|
||
Cursor cursor = myDbEnv.getInventoryDB().openCursor(null, null);
|
||
|
||
// DatabaseEntry objects used for reading records
|
||
DatabaseEntry foundKey = new DatabaseEntry();
|
||
DatabaseEntry foundData = new DatabaseEntry();
|
||
|
||
try { // always want to make sure the cursor gets closed.
|
||
while (cursor.getNext(foundKey, foundData,
|
||
LockMode.DEFAULT) == OperationStatus.SUCCESS) {
|
||
Inventory theInventory =
|
||
(Inventory)inventoryBinding.entryToObject(foundData);
|
||
displayInventoryRecord(foundKey, theInventory);
|
||
}
|
||
} catch (Exception e) {
|
||
System.err.println("Error on inventory cursor:");
|
||
System.err.println(e.toString());
|
||
e.printStackTrace();
|
||
} finally {
|
||
cursor.close();
|
||
}
|
||
|
||
} </pre>
|
||
<p>We use <code class="methodname">ExampleInventoryRead.displayInventoryRecord()</code> to actually show the record. This
|
||
method first displays all the relevant information from the retrieved
|
||
Inventory object. It then uses the vendor database to retrieve and
|
||
display the vendor. Because the vendor database is keyed by vendor name,
|
||
and because each inventory object contains this key, it is trivial to
|
||
retrieve the appropriate vendor record.</p>
|
||
<a id="je_cursor15"></a>
|
||
<pre class="programlisting"> private void displayInventoryRecord(DatabaseEntry theKey,
|
||
Inventory theInventory)
|
||
throws DatabaseException {
|
||
|
||
DatabaseEntry searchKey = null;
|
||
try {
|
||
String theSKU = new String(theKey.getData(), "UTF-8");
|
||
System.out.println(theSKU + ":");
|
||
System.out.println("\t " + theInventory.getItemName());
|
||
System.out.println("\t " + theInventory.getCategory());
|
||
System.out.println("\t " + theInventory.getVendor());
|
||
System.out.println("\t\tNumber in stock: " +
|
||
theInventory.getVendorInventory());
|
||
System.out.println("\t\tPrice per unit: " +
|
||
theInventory.getVendorPrice());
|
||
System.out.println("\t\tContact: ");
|
||
|
||
searchKey =
|
||
new DatabaseEntry(theInventory.getVendor().getBytes("UTF-8"));
|
||
} catch (IOException willNeverOccur) {}
|
||
DatabaseEntry foundVendor = new DatabaseEntry();
|
||
|
||
if (myDbEnv.getVendorDB().get(null, searchKey, foundVendor,
|
||
LockMode.DEFAULT) != OperationStatus.SUCCESS) {
|
||
System.out.println("Could not find vendor: " +
|
||
theInventory.getVendor() + ".");
|
||
System.exit(-1);
|
||
} else {
|
||
Vendor theVendor =
|
||
(Vendor)vendorBinding.entryToObject(foundVendor);
|
||
System.out.println("\t\t " + theVendor.getAddress());
|
||
System.out.println("\t\t " + theVendor.getCity() + ", " +
|
||
theVendor.getState() + " " + theVendor.getZipcode());
|
||
System.out.println("\t\t Business Phone: " +
|
||
theVendor.getBusinessPhoneNumber());
|
||
System.out.println("\t\t Sales Rep: " +
|
||
theVendor.getRepName());
|
||
System.out.println("\t\t " +
|
||
theVendor.getRepPhoneNumber());
|
||
}
|
||
}</pre>
|
||
<p>The remainder of this application provides a utility method used
|
||
to parse the command line options. From the perspective of this
|
||
document, this is relatively uninteresting. You can see how this is
|
||
implemented by looking at:
|
||
</p>
|
||
<pre class="programlisting"><span class="emphasis"><em>JE_HOME</em></span>/examples/je/gettingStarted/ExampleInventoryRead.java</pre>
|
||
<p>
|
||
where <code class="literal"><span class="emphasis"><em>JE_HOME</em></span></code> is the location where you
|
||
placed your JE distribution.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<br class="example-break" />
|
||
</div>
|
||
<div class="navfooter">
|
||
<hr />
|
||
<table width="100%" summary="Navigation footer">
|
||
<tr>
|
||
<td width="40%" align="left"><a accesskey="p" href="ReplacingEntryWCursor.html">Prev</a> </td>
|
||
<td width="20%" align="center">
|
||
<a accesskey="u" href="Cursors.html">Up</a>
|
||
</td>
|
||
<td width="40%" align="right"> <a accesskey="n" href="indexes.html">Next</a></td>
|
||
</tr>
|
||
<tr>
|
||
<td width="40%" align="left" valign="top">Replacing Records Using Cursors </td>
|
||
<td width="20%" align="center">
|
||
<a accesskey="h" href="index.html">Home</a>
|
||
</td>
|
||
<td width="40%" align="right" valign="top"> Chapter 10. Secondary Databases</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</body>
|
||
</html>
|