Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 122
If the key does not exist, then the order that the record is put into the database is
determined by the BTree (key) comparator in use by the database.
For example:
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.OperationStatus; 
...
// Create the data to put into the database
String key1str = "My first string";
String data1str = "My first data";
String key2str = "My second string";
String data2str = "My second data";
String data3str = "My third data";
Cursor cursor = null;
try {
...
// Database and environment open omitted for brevity
...
DatabaseEntry key1 = new DatabaseEntry(key1str.getBytes("UTF-8"));
DatabaseEntry data1 = new DatabaseEntry(data1str.getBytes("UTF-8"));
DatabaseEntry key2 = new DatabaseEntry(key2str.getBytes("UTF-8"));
DatabaseEntry data2 = new DatabaseEntry(data2str.getBytes("UTF-8"));
DatabaseEntry data3 = new DatabaseEntry(data3str.getBytes("UTF-8"));
// Open a cursor using a database handle
cursor = myDatabase.openCursor(null, null);
// Assuming an empty database.
OperationStatus retVal = cursor.put(key1, data1); // SUCCESS
retVal = cursor.put(key2, data2); // SUCCESS
retVal = cursor.put(key2, data3); // SUCCESS if dups allowed, 
// KEYEXIST if not.    
} catch (Exception e) {
// Exception handling goes here
} finally {
// Make sure to close the cursor
cursor.close();
}
Creating bookmarks in pdf documents - add, remove, update PDF bookmarks in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your C# Project with Rapid PDF Internal Navigation Via Bookmark and Outline
creating bookmarks in pdf files; how to bookmark a pdf document
Creating bookmarks in pdf documents - VB.NET PDF bookmark library: add, remove, update PDF bookmarks in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your VB.NET Project with Rapid PDF Internal Navigation Via Bookmark and Outline
export pdf bookmarks to excel; how to add bookmarks to a pdf
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 123
Deleting Records Using Cursors
To delete a record using a cursor, simply position the cursor to the record that you want
to delete and then call Cursor.delete(). Note that after deleting a record, the value of
Cursor.getCurrent() is unchanged until such a time as the cursor is moved again. Also, if
you call Cursor.delete() two or more times in a row without repositioning the cursor, then
all subsequent deletes result in a return value of OperationStatus.KEYEMPTY.
For example:
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus; 
...
Cursor cursor = null;
try {
...
// Database and environment open omitted for brevity
...
// Create DatabaseEntry objects
// searchKey is some String.
DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry();
// Open a cursor using a database handle
cursor = myDatabase.openCursor(null, null);
// Position the cursor. Ignoring the return value for clarity
OperationStatus retVal = cursor.getSearchKey(theKey, theData, 
LockMode.DEFAULT);
// Count the number of records using the given key. If there is only
// one, delete that record.
if (cursor.count() == 1) {
System.out.println("Deleting " + 
new String(theKey.getData(), "UTF-8") +
"|" + 
new String(theData.getData(), "UTF-8"));
cursor.delete();
}
} catch (Exception e) {
// Exception handling goes here
} finally {
// Make sure to close the cursor
C# Create PDF Library SDK to convert PDF from other file formats
Gratis control for creating PDF from multiple image formats PDF with a blank page, bookmarks, links, signatures Load PDF from existing documents and image in
bookmarks pdf files; bookmarks in pdf files
VB.NET Create PDF Library SDK to convert PDF from other file
Gratis control for creating PDF from multiple image formats PDF with a blank page, bookmarks, links, signatures Load PDF from existing documents and image in
create bookmark pdf file; adding bookmarks to pdf document
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 124
cursor.close();
}
Replacing Records Using Cursors
You replace the data for a database record by using Cursor.putCurrent(). This method
takes just one argument — the data that you want to write to the current location in the
database.
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus; 
...
Cursor cursor = null;
try {
...
// Database and environment open omitted for brevity
...
// Create DatabaseEntry objects
// searchKey is some String.
DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
DatabaseEntry theData = new DatabaseEntry();
// Open a cursor using a database handle
cursor = myDatabase.openCursor(null, null);
// Position the cursor. Ignoring the return value for clarity
OperationStatus retVal = cursor.getSearchKey(theKey, theData, 
LockMode.DEFAULT);
// Replacement data
String replaceStr = "My replacement string";
DatabaseEntry replacementData = 
new DatabaseEntry(replaceStr.getBytes("UTF-8"));
cursor.putCurrent(replacementData);
} catch (Exception e) {
// Exception handling goes here
} finally {
// Make sure to close the cursor
cursor.close();
}
Note that this method cannot be used if the record that you are trying to replace is a member
of a duplicate set. This is because records must be sorted by their data and replacement
would violate that sort order.
XDoc.Word for .NET, Advanced .NET Word Processing Features
Viewing, editing, converting, processing, creating, annotating and zooming & rotation; Outlines, bookmarks, & thumbnail Create Word from PDF; Create Word from
add bookmarks to pdf; adding bookmarks to pdf
PDF Image Viewer| What is PDF
such as text extraction, hyperlinks, bookmarks and metadata as version among a suite of PDF-based standards to develop specifications for creating, viewing, and
copy pdf bookmarks; excel print to pdf with bookmarks
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 125
If you want to replace the data contained by a duplicate record, delete the record and create
a new record with the desired key and data.
Cursor Example
In Database Example (page 77) we wrote an application that loaded two Database 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.
To do this, we create the ExampleInventoryRead application. This application reads and
displays all inventory records by:
1. Opening the environment and then the inventory, vendor, and class catalog Database
objects. We do this using the MyDbEnv class. See Stored Class Catalog Management with
MyDbEnv (page 104) for a description of this class.
2. Obtaining a cursor from the inventory Database.
3. Steps through the Database, displaying each record as it goes.
4. To display the Inventory record, the custom tuple binding that we created in
InventoryBinding.java (page 102) is used.
5. Database.get() is used to obtain the vendor that corresponds to the inventory item.
6. A serial binding is used to convert the DatabaseEntry returned by the get() to a Vendor
object.
7. The contents of the Vendor object are displayed.
We implemented the Vendor class in Vendor.java (page 101). We implemented the Inventory
class in Inventory.java (page 100).
The full implementation of ExampleInventoryRead can be found in:
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
where JE_HOME is the location where you placed your JE distribution.
Example 9.1.  ExampleInventoryRead.java
To begin, we import the necessary classes:
// 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;
How to C#: Basic SDK Concept of XDoc.PDF for .NET
annotation features can be integrated into your C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a PDF document
export pdf bookmarks to text; how to create bookmark in pdf automatically
VB.NET PDF: Basic SDK Concept of XDoc.PDF
features can be integrated into your VB.NET project, such as annotation creating, deleting, modifying This class describes bookmarks in a PDF document.
bookmarks pdf; bookmarks in pdf reader
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 126
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; 
Next we declare our class and set up some global variables. Note a MyDbEnv object is
instantiated here. We can do this because its constructor never throws an exception. See
Database Example (page 77) for its implementation details.
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;
Next we create the ExampleInventoryRead.usage() and ExampleInventoryRead.main()
methods. We perform almost all of our exception handling from
ExampleInventoryRead.main(), and so we must catch DatabaseException because the
com.sleepycat.je.* APIs throw them.
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.");
}
In ExampleInventoryRead.run(), we call MyDbEnv.setup() to open our environment
and databases. Then we create the bindings that we need for using our data objects with
DatabaseEntry objects.
private void run(String args[]) throws DatabaseException {
How to C#: Basic SDK Concept of XDoc.PowerPoint
Conversely, conversion from PDF to PowerPoint (.PPTX C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a PowerPoint
add bookmarks pdf; create bookmark pdf file
How to C#: Basic SDK Concept of XDoc.Word
Conversely, conversion from PDF to Word (.docx) is C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a Word document
delete bookmarks pdf; add bookmark pdf
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 127
// 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();
}
Now we write the loop that displays the Inventory records. We do this by opening a cursor on
the inventory database and iterating over all its contents, displaying each as we go.
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();
}
We use ExampleInventoryRead.displayInventoryRecord() 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.
private void displayInventoryRecord(DatabaseEntry theKey,
Inventory theInventory)
How to C#: Basic SDK Concept of XDoc.Excel
Conversely, conversion from PDF to Excel (.XLSX) is also C# project, such as annotation creating, deleting, modifying This class describes bookmarks in a Excel
export bookmarks from pdf to excel; convert excel to pdf with bookmarks
Library Version 12.1.6.0
Using Cursors
12/7/2015
Getting Started with JE
Page 128
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());
}
}
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:
JE_HOME/examples/je/gettingStarted/ExampleInventoryRead.java
where JE_HOME is the location where you placed your JE distribution.
12/7/2015
Getting Started with JE
Page 129
Chapter 10. Secondary Databases
Usually you find database records by means of the record's key. However, the key that you
use for your record will not always contain the information required to provide you with rapid
access to the data that you want to retrieve. For example, suppose your Database contains
records related to users. The key might be a string that is some unique identifier for the
person, such as a user ID. Each record's data, however, would likely contain a complex object
containing details about people such as names, addresses, phone numbers, and so forth. While
your application may frequently want to query a person by user ID (that is, by the information
stored in the key), it may also on occasion want to locate people by, say, their name.
Rather than iterate through all of the records in your database, examining each in turn for
a given person's name, you create indexes based on names and then just search that index
for the name that you want. You can do this using secondary databases. In JE, the Database
that contains your data is called a primary database. A database that provides an alternative
set of keys to access that data is called a secondary database, and these are managed using
SecondaryDatabase class objects. In a secondary database, the keys are your alternative (or
secondary) index, and the data corresponds to a primary record's key.
You create a secondary database by using a SecondaryConfig class object to identify an
implementation of a SecondaryKeyCreator class object that is used to create keys based
on data found in the primary database. You then pass this SecondaryConfig object to the
SecondaryDatabase constructor.
Once opened, JE manages secondary databases for you. Adding or deleting records in your
primary database causes JE to update the secondary as necessary. Further, changing a record's
data in the primary database may cause JE to modify a record in the secondary, depending on
whether the change forces a modification of a key in the secondary database.
Note that you can not write directly to a secondary database. While methods exist
on SecondaryDatabase and SecondaryCursor that appear to allow this, they in fact
always throw UnsupportedOperationException. To change the data referenced by a
SecondaryDatabase record, modify the primary database instead. The exception to this
rule is that delete operations are allowed on the SecondaryDatabase object. See Deleting
Secondary Database Records (page 136) for more information.
Note
Secondary database records are updated/created by JE only if the
SecondaryKeyCreator.createSecondaryKey() method returns true. If false is
returned, then JE will not add the key to the secondary database, and in the event of
a record update it will remove any existing key.
See Implementing Key Creators  (page 132) for more information on this interface
and method.
When you read a record from a secondary database, JE automatically returns the key and data
from the corresponding record in the primary database.
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 130
Opening and Closing Secondary Databases
You manage secondary database opens and closes using the
Environment.openSecondaryDatabase() method. Just as is the case with primary
databases, you must provide Environment.openSecondaryDatabase() with the database's
name and, optionally, other properties such as whether duplicate records are allowed, or
whether the secondary database can be created on open. In addition, you must also provide:
• A handle to the primary database that this secondary database is indexing. Note that this
means that secondary databases are maintained only for the specified Database handle. If
you open the same Database multiple times for write (such as might occur when opening a
database for read-only and read-write in the same application), then you should open the
SecondaryDatabase for each such Database handle.
• A SecondaryConfig object that provides properties specific to a secondary database.
The most important of these is used to identify the key creator for the database. The
key creator is responsible for generating keys for the secondary database. See Secondary
Database Properties (page 135) for details.
Note
Primary databases must not support duplicate records. Secondary records point to
primary records using the primary key, so that key must be unique.
So to open (create) a secondary database, you:
1. Open your primary database.
2. Instantiate your key creator.
3. Instantiate your SecondaryConfig object.
4. Set your key creator object on your SecondaryConfig object.
5. Open your secondary database, specifying your primary database and your
SecondaryConfig at that time.
For example:
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryConfig;
import java.io.File;
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 131
...
DatabaseConfig myDbConfig = new DatabaseConfig();
SecondaryConfig mySecConfig = new SecondaryConfig();
myDbConfig.setAllowCreate(true);
mySecConfig.setAllowCreate(true);
// Duplicates are frequently required for secondary databases.
mySecConfig.setSortedDuplicates(true);
// Open the primary
Environment myEnv = null;
Database myDb = null;
SecondaryDatabase mySecDb = null;
try {
String dbName = "myPrimaryDatabase";
myEnv = new Environment(new File("/tmp/JEENV"), null);
myDb = myEnv.openDatabase(null, dbName, myDbConfig);
// A fake tuple binding that is not actually implemented anywhere
// in this manual. The tuple binding is dependent on the data in use.
// Tuple bindings are described earlier in this manual.
TupleBinding myTupleBinding = new MyTupleBinding();
// Open the secondary.
// Key creators are described in the next section.
FullNameKeyCreator keyCreator = 
new FullNameKeyCreator(myTupleBinding);
// Get a secondary object and set the key creator on it.
mySecConfig.setKeyCreator(keyCreator);
// Perform the actual open
String secDbName = "mySecondaryDatabase";
mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb, 
mySecConfig); 
} catch (DatabaseException de) {
// Exception handling goes here ...
}
To close a secondary database, call its close() method. Note that for best results, you should
close all the secondary databases associated with a primary database before closing the
primary.
For example:
try {
if (mySecDb != null) {
mySecDb.close();
}
Documents you may be interested
Documents you may be interested