c# web api pdf : Display bookmarks in pdf software SDK dll winforms windows web page web forms BerkeleyDB-JE-GSG14-part696

Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 132
if (myDb != null) {
myDb.close(); 
}
if (myEnv != null) {
myEnv.close();
}
} catch (DatabaseException dbe) {
// Exception handling goes here
}
Implementing Key Creators
You must provide every secondary database with a class that creates keys from primary
records. You identify this class using the SecondaryConfig.setKeyCreator() method.
You can create keys using whatever data you want. Typically you will base your key on some
information found in a record's data, but you can also use information found in the primary
record's key. How you build your keys is entirely dependent upon the nature of the index that
you want to maintain.
You implement a key creator by writing a class that implements the
SecondaryKeyCreator interface. This interface requires you to implement the
SecondaryKeyCreator.createSecondaryKey() method.
One thing to remember when implementing this method is that you will need a way to extract
the necessary information from the data's DatabaseEntry and/or the key's DatabaseEntry
that are provided on calls to this method. If you are using complex objects, then you
are probably using the Bind APIs to perform this conversion. The easiest thing to do is to
instantiate the EntryBinding or TupleBinding that you need to perform the conversion, and
then provide this to your key creator's constructor. The Bind APIs are introduced in Using the
BIND APIs (page 86).
SecondaryKeyCreator.createSecondaryKey() returns a boolean. A return value of false
indicates that no secondary key exists, and therefore no record should be added to the
secondary database for that primary record. If a record already exists in the secondary
database, it is deleted.
For example, suppose your primary database uses the following class for its record data:
package je.gettingStarted;
public class PersonData {
private String userID;
private String surname;
private String familiarName;
public PersonData(String userID, String surname, 
String familiarName) {
this.userID = userID;
Display bookmarks in pdf - 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
add bookmarks to pdf reader; adding bookmarks to pdf document
Display bookmarks in pdf - 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
create pdf bookmark; how to create bookmark in pdf with
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 133
this.surname = surname;
this.familiarName = familiarName;
}
public String getUserID() {
return userID;
}
public String getSurname() {
return surname;
}
public String getFamiliarName() {
return familiarName;
}
Also, suppose that you have created a custom tuple binding, PersonDataBinding, that you
use to convert PersonData objects to and from DatabaseEntry objects. (Custom tuple
bindings are described in Custom Tuple Bindings (page 94).)
Finally, suppose you want a secondary database that is keyed based on the person's full name.
Then in this case you might create a key creator as follows:
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.SecondaryKeyCreator;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.SecondaryDatabase;
import java.io.IOException;
public class FullNameKeyCreator implements SecondaryKeyCreator {
private TupleBinding theBinding;
public FullNameKeyCreator(TupleBinding theBinding1) {
theBinding = theBinding1;
}
public boolean createSecondaryKey(SecondaryDatabase secDb,
DatabaseEntry keyEntry, 
DatabaseEntry dataEntry,
DatabaseEntry resultEntry) {
try {
PersonData pd = 
.NET PDF SDK - Description of All PDF Processing Control Feastures
PDF Viewer in HTML5; Outstanding rendering of PDF documents; Full page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail display; Integrated text
bookmark pdf acrobat; pdf reader with bookmarks
XDoc.Word for .NET, Advanced .NET Word Processing Features
& rotation; Outlines, bookmarks, & thumbnail display; Integrated annotation; More about Web Viewer ▶. Conversion. Word Create. Create Word from PDF; Create Word
create pdf bookmarks from word; excel pdf bookmarks
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 134
(PersonData) theBinding.entryToObject(dataEntry);
String fullName = pd.getFamiliarName() + " " + 
pd.getSurname();
resultEntry.setData(fullName.getBytes("UTF-8"));
} catch (IOException willNeverOccur) {}
return true;
}
Finally, you use this key creator as follows:
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryConfig;
...
Environment myEnv = null;
Database myDb = null;
SecondaryDatabase mySecDb = null;
try {
// Environment and primary database open omitted for brevity
...
TupleBinding myDataBinding = new MyTupleBinding();
FullNameKeyCreator fnkc = new FullNameKeyCreator(myDataBinding);
SecondaryConfig mySecConfig = new SecondaryConfig();
mySecConfig.setKeyCreator(fnkc);
//Perform the actual open
String secDbName = "mySecondaryDatabase";
mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb, 
mySecConfig);
} catch (DatabaseException de) {
// Exception handling goes here
} finally {
try {
if (mySecDb != null) {
mySecDb.close();
}
if (myDb != null) {
myDb.close(); 
XDoc.PowerPoint for .NET, All Mature Features Introductions
& rotation; Outlines, bookmarks, & thumbnail display; Integrated annotation; More about Web Viewer ▶. PowerPoint Convert. Convert PowerPoint to PDF; Convert
how to add bookmarks to pdf files; editing bookmarks in pdf
XDoc.Excel for .NET, Comprehensive .NET Excel Imaging Features
zooming & rotation; Outlines, bookmarks, & thumbnail display; Integrated annotation; More about Web Viewer ▶. Excel Convert. Convert Excel to PDF; Convert Excel
creating bookmarks pdf; how to bookmark a pdf document
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 135
}
if (myEnv != null) {
myEnv.close();
}
} catch (DatabaseException dbe) {
// Exception handling goes here
}
}
Secondary Database Properties
Secondary databases accept SecondaryConfig objects. SecondaryConfig is a subclass of
DatabaseConfig, so it can manage all of the same properties as does DatabaseConfig. See
Database Properties (page 75) for more information.
In addition to the DatabaseConfig properties, SecondaryConfig also allows you to manage
the following properties:
• SecondaryConfig.setAllowPopulate()
If true, the secondary database can be auto-populated. This means that on open, if
the secondary database is empty then the primary database is read in its entirety and
additions/modifications to the secondary's records occur automatically.
• SecondaryConfig.setKeyCreator()
Identifies the key creator object to be used for secondary key creation. See Implementing
Key Creators  (page 132) for more information.
Reading Secondary Databases
Like a primary database, you can read records from your secondary database either by
using the SecondaryDatabase.get() method, or by using a SecondaryCursor. The main
difference between reading secondary and primary databases is that when you read a
secondary database record, the secondary record's data is not returned to you. Instead, the
primary key and data corresponding to the secondary key are returned to you.
For example, assuming your secondary database contains keys related to a person's full name:
package je.gettingStarted;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.SecondaryDatabase;
...
try {
// Omitting all database and environment opens
...
C# PDF Convert to HTML SDK: Convert PDF to html files in C#.net
SDK, preserves all the original anchors, links, bookmarks and font This C#.NET PDF to HTML conversion library can browser when it is trying to display a PDF
creating bookmarks in pdf documents; add bookmarks to pdf online
C# powerpoint - Convert PowerPoint to HTML in C#.NET
to HTML converter toolkit SDK, preserves all the original anchors, links, bookmarks and font issue of web browser when it is trying to display a PowerPoint
bookmarks pdf file; split pdf by bookmark
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 136
String searchName = "John Doe";
DatabaseEntry searchKey = 
new DatabaseEntry(searchName.getBytes("UTF-8"));
DatabaseEntry primaryKey = new DatabaseEntry();
DatabaseEntry primaryData = new DatabaseEntry();
// Get the primary key and data for the user 'John Doe'.
OperationStatus retVal = mySecondaryDatabase.get(null, searchKey, 
primaryKey, 
primaryData, 
LockMode.DEFAULT); 
} catch (Exception e) {
// Exception handling goes here
}
Note that, just like Database.get(), if your secondary database supports duplicate records
then SecondaryDatabase.get() only return the first record found in a matching duplicates
set. If you want to see all the records related to a specific secondary key, then use a
SecondaryCursor (described in  Using Secondary Cursors  (page 137)).
Deleting Secondary Database Records
In general, you can not modify a secondary database directly. In order to modify a secondary
database, you should modify the primary database and simply allow JE to manage the
secondary modifications for you.
However, as a convenience, you can delete SecondaryDatabase records directly. Doing so
causes the associated primary key/data pair to be deleted. This in turn causes JE to delete all
SecondaryDatabase records that reference the primary record.
You can use the SecondaryDatabase.delete() method to delete a secondary database
record. Note that if your SecondaryDatabase contains duplicate records, then deleting a
record from the set of duplicates causes all of the duplicates to be deleted as well.
Note
SecondaryDatabase.delete() causes the previously described delete operations to
occur only if the primary database is opened for write access.
For example:
package je.gettingStarted;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.SecondaryDatabase;
...
try {
C# Word - Convert Word to HTML in C#.NET
VB.NET How-to, VB.NET PDF, VB.NET Word, VB SDK, preserves all the original anchors, links, bookmarks and font of web browser when it is trying to display a Word
display bookmarks in pdf; bookmarks in pdf from word
C# Excel - Convert Excel to HTML in C#.NET
to HTML converter toolkit SDK, preserves all the original anchors, links, bookmarks and font crashing issue of web browser when it is trying to display a Excel
create bookmarks pdf; create bookmarks in pdf
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 137
// Omitting all database and environment opens
...
String searchName = "John Doe";
DatabaseEntry searchKey = 
new DatabaseEntry(searchName.getBytes("UTF-8"));
// Delete the first secondary record that uses "John Doe" as
// a key. This causes the primary record referenced by this secondary
// record to be deleted.
OperationStatus retVal = mySecondaryDatabase.delete(null, searchKey);
} catch (Exception e) {
// Exception handling goes here
}
Using Secondary Cursors
Just like cursors on a primary database, you can use secondary cursors to iterate over the
records in a secondary database. Like normal cursors, you can also use secondary cursors 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, to get the next non-duplicate record, and so forth. For a
complete description on cursors and their capabilities, see Using Cursors (page 111).
However, when you use secondary cursors:
• Any data returned is the data contained on the primary database record referenced by the
secondary record.
• SecondaryCursor.getSearchBoth() and related methods do not search based on a
key/data pair. Instead, you search based on a secondary key and a primary key. The data
returned is the primary data that most closely matches the two keys provided for the
search.
For example, suppose you are using the databases, classes, and key creators described in
Implementing Key Creators  (page 132). Then the following searches for a person's name in
the secondary database, and deletes all secondary and primary records that use that name.
package je.gettingStarted;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryCursor;
...
try {
// Database and environment opens omitted for brevity
...
String secondaryName = "John Doe";
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 138
DatabaseEntry secondaryKey = 
new DatabaseEntry(secondaryName.getBytes("UTF-8"));
DatabaseEntry foundData = new DatabaseEntry();
SecondaryCursor mySecCursor = 
mySecondaryDatabase.openSecondaryCursor(null, null);
OperationStatus retVal = mySecCursor.getSearchKey(secondaryKey, 
foundData, 
LockMode.DEFAULT);
while (retVal == OperationStatus.SUCCESS) {
mySecCursor.delete();
retVal = mySecCursor.getNextDup(secondaryKey, 
foundData, 
LockMode.DEFAULT);
} catch (Exception e) {
// Exception handling goes here
}
Database Joins
If you have two or more secondary databases associated with a primary database, then you
can retrieve primary records based on the intersection of multiple secondary entries. You do
this using a JoinCursor.
Throughout this document we have presented a class that stores inventory information on
grocery items. That class is fairly simple with a limited number of data members, few of
which would be interesting from a query perspective. But suppose, instead, that we were
storing information on something with many more characteristics that can be queried, such as
an automobile. In that case, you may be storing information such as color, number of doors,
fuel mileage, automobile type, number of passengers, make, model, and year, to name just a
few.
In this case, you would still likely be using some unique value to key your primary entries
(in the United States, the automobile's VIN would be ideal for this purpose). You would then
create a class that identifies all the characteristics of the automobiles in your inventory. You
would also have to create some mechanism by which you would move instances of this class
in and out of Java byte arrays. We described the concepts and mechanisms by which you can
perform these activities in Database Records (page 81).
To query this data, you might then create multiple secondary databases, one for each of the
characteristics that you want to query. For example, you might create a secondary for color,
another for number of doors, another for number of passengers, and so forth. Of course, you
will need a unique key creator for each such secondary database. You do all of this using the
concepts and techniques described throughout this chapter.
Once you have created this primary database and all interesting secondaries, what you have
is the ability to retrieve automobile records based on a single characteristic. You can, for
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 139
example, find all the automobiles that are red. Or you can find all the automobiles that have
four doors. Or all the automobiles that are minivans.
The next most natural step, then, is to form compound queries, or joins. For example, you
might want to find all the automobiles that are red, and that were built by Toyota, and that
are minivans. You can do this using a JoinCursor class instance.
Using Join Cursors
To use a join cursor:
• Open two or more secondary cursors. These cursors must be obtained from secondary
databases that are associated with the same primary database.
• Position each such cursor to the secondary key value in which you are interested. For
example, to build on the previous description, the cursor for the color database is
positioned to the red records while the cursor for the model database is positioned to the
minivan records, and the cursor for the make database is positioned to Toyota.
• Create an array of secondary cursors, and place in it each of the cursors that are
participating in your join query.
• Obtain a join cursor. You do this using the Database.join() method. You must pass this
method the array of secondary cursors that you opened and positioned in the previous
steps.
• Iterate over the set of matching records using JoinCursor.getNext() until
OperationStatus is not SUCCESS.
• Close your join cursor.
• If you are done with them, close all your secondary cursors.
For example:
package je.gettingStarted;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.JoinCursor;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.SecondaryCursor;
import com.sleepycat.je.SecondaryDatabase;
...
// Database and secondary database opens omitted for brevity.
// Assume a primary database handle:
//   automotiveDB
// Assume 3 secondary database handles:
//   automotiveColorDB  -- index based on automobile color
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 140
//   automotiveTypeDB  -- index based on automobile type
//   automotiveMakeDB   -- index based on the manufacturer
// Query strings:
String theColor = "red";
String theType = "minivan";
String theMake = "Toyota";
// Secondary cursors used for the query:
SecondaryCursor colorSecCursor = null;
SecondaryCursor typeSecCursor = null;
SecondaryCursor makeSecCursor = null;
// The join cursor
JoinCursor joinCursor = null;
// These are needed for our queries
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
// All cursor operations are enclosed in a try block to ensure that they
// get closed in the event of an exception.
try {
// Database entries used for the query:
DatabaseEntry color = new DatabaseEntry(theColor.getBytes("UTF-8"));
DatabaseEntry type = new DatabaseEntry(theType.getBytes("UTF-8"));
DatabaseEntry make = new DatabaseEntry(theMake.getBytes("UTF-8"));
colorSecCursor = automotiveColorDB.openSecondaryCursor(null, null); 
typeSecCursor = automotiveTypeDB.openSecondaryCursor(null, null); 
makeSecCursor = automotiveMakeDB.openSecondaryCursor(null, null); 
// Position all our secondary cursors to our query values.
OperationStatus colorRet = 
colorSecCursor.getSearchKey(color, foundData, LockMode.DEFAULT);
OperationStatus typeRet = 
typeSecCursor.getSearchKey(type, foundData, LockMode.DEFAULT);
OperationStatus makeRet = 
makeSecCursor.getSearchKey(make, foundData, LockMode.DEFAULT);
// If all our searches returned successfully, we can proceed
if (colorRet == OperationStatus.SUCCESS &&
typeRet == OperationStatus.SUCCESS &&
makeRet == OperationStatus.SUCCESS) {
// Get a secondary cursor array and populate it with our
// positioned cursors
SecondaryCursor[] cursorArray = {colorSecCursor,
Library Version 12.1.6.0
Secondary Databases
12/7/2015
Getting Started with JE
Page 141
typeSecCursor, 
makeSecCursor};
// Create the join cursor
joinCursor = automotiveDB.join(cursorArray, null);
// Now iterate over the results, handling each in turn
while (joinCursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
OperationStatus.SUCCESS) {
// Do something with the key and data retrieved in
// foundKey and foundData
}
}
} catch (DatabaseException dbe) {
// Error reporting goes here
} catch (Exception e) {
// Error reporting goes here
} finally {
try {
// Make sure to close out all our cursors
if (colorSecCursor != null) {
colorSecCursor.close();
}
if (typeSecCursor != null) {
typeSecCursor.close();
}
if (makeSecCursor != null) {
makeSecCursor.close();
}
if (joinCursor != null) {
joinCursor.close();
}
} catch (DatabaseException dbe) {
// Error reporting goes here
}
JoinCursor Properties
You can set JoinCursor properties using the JoinConfig class. Currently there is just one
property that you can set:
• JoinConfig.setNoSort()
Specifies whether automatic sorting of input cursors is disabled. The cursors are sorted from
the one that refers to the least number of data items to the one that refers to the most.
If the data is structured so that cursors with many data items also share many common
elements, higher performance will result from listing those cursors before cursors with
Documents you may be interested
Documents you may be interested