summaryrefslogtreecommitdiff
path: root/db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java
diff options
context:
space:
mode:
Diffstat (limited to 'db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java')
-rw-r--r--db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java180
1 files changed, 180 insertions, 0 deletions
diff --git a/db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java b/db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java
new file mode 100644
index 0000000..9f97c4b
--- /dev/null
+++ b/db-4.8.30/examples_java/src/db/BulkAccessNIOExample.java
@@ -0,0 +1,180 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1997-2009 Oracle. All rights reserved.
+ *
+ * $Id$
+ */
+
+package db;
+
+import com.sleepycat.db.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.nio.ByteBuffer;
+
+class BulkAccessNIOExample {
+ private static final String FileName = "access.db";
+
+ public BulkAccessNIOExample() {
+ }
+
+ public static void main(String[] argv) {
+ try {
+ BulkAccessNIOExample app = new BulkAccessNIOExample();
+ app.run();
+ } catch (DatabaseException dbe) {
+ System.err.println("BulkAccessNIOExample: " + dbe.toString());
+ System.exit(1);
+ } catch (FileNotFoundException fnfe) {
+ System.err.println("BulkAccessNIOExample: " + fnfe.toString());
+ System.exit(1);
+ }
+ System.exit(0);
+ }
+
+ // Prompts for a line, and keeps prompting until a non blank
+ // line is returned. Returns null on error.
+ //
+ public static String askForLine(InputStreamReader reader,
+ PrintStream out, String prompt) {
+ String result = "";
+ while (result != null && result.length() == 0) {
+ out.print(prompt);
+ out.flush();
+ result = getLine(reader);
+ }
+ return result;
+ }
+
+ // Not terribly efficient, but does the job.
+ // Works for reading a line from stdin or a file.
+ // Returns null on EOF. If EOF appears in the middle
+ // of a line, returns that line, then null on next call.
+ //
+ public static String getLine(InputStreamReader reader) {
+ StringBuffer b = new StringBuffer();
+ int c;
+ try {
+ while ((c = reader.read()) != -1 && c != '\n') {
+ if (c != '\r')
+ b.append((char)c);
+ }
+ } catch (IOException ioe) {
+ c = -1;
+ }
+
+ if (c == -1 && b.length() == 0)
+ return null;
+ else
+ return b.toString();
+ }
+
+ public void run() throws DatabaseException, FileNotFoundException {
+ // Remove the previous database.
+ new File(FileName).delete();
+
+ // Create the database object.
+ // There is no environment for this simple example.
+ DatabaseConfig config = new DatabaseConfig();
+ config.setErrorStream(System.err);
+ config.setErrorPrefix("BulkAccessNIOExample");
+ config.setType(DatabaseType.BTREE);
+ config.setAllowCreate(true);
+ config.setMode(0644);
+ Database table = new Database(FileName, null, config);
+
+ //
+ // Insert records into the database, where the key is the user
+ // input and the data is the user input in reverse order.
+ //
+ InputStreamReader reader = new InputStreamReader(System.in);
+
+ for (;;) {
+ String line = askForLine(reader, System.out, "input> ");
+ if (line == null || (line.compareToIgnoreCase("end") == 0))
+ break;
+
+ String reversed = (new StringBuffer(line)).reverse().toString();
+
+ // See definition of StringEntry below
+ //
+ StringEntry key = new StringEntry(line, true);
+ StringEntry data = new StringEntry(reversed, true);
+
+ try {
+ if (table.putNoOverwrite(null, key, data) == OperationStatus.KEYEXIST)
+ System.out.println("Key " + line + " already exists.");
+ } catch (DatabaseException dbe) {
+ System.out.println(dbe.toString());
+ }
+ }
+
+ // Acquire a cursor for the table.
+ Cursor cursor = table.openCursor(null, null);
+ DatabaseEntry foo = new DatabaseEntry();
+
+ MultipleKeyNIODataEntry bulk_data = new MultipleKeyNIODataEntry();
+
+ ByteBuffer rawData = ByteBuffer.allocateDirect(1024*1024);
+ bulk_data.setDataNIO(rawData);
+ bulk_data.setUserBuffer(1024 * 1024, true);
+
+ // Walk through the table, printing the key/data pairs.
+ //
+ while (cursor.getNext(foo, bulk_data, null) == OperationStatus.SUCCESS) {
+ StringEntry key, data;
+ key = new StringEntry();
+ data = new StringEntry();
+
+ while (bulk_data.next(key, data))
+ System.out.println(key.getString() + " : " + data.getString());
+ }
+ cursor.close();
+ table.close();
+ }
+
+ // Here's an example of how you can extend DatabaseEntry in a
+ // straightforward way to allow easy storage/retrieval of strings, or
+ // whatever kind of data you wish. We've declared it as a static inner
+ // class, but it need not be.
+ //
+ static class StringEntry extends DatabaseEntry {
+ StringEntry() {
+ }
+
+ StringEntry(String value, boolean nioData) {
+ setString(value, nioData);
+ }
+
+ void setString(String value, boolean nioData) {
+ byte[] data = value.getBytes();
+ if(nioData) {
+ ByteBuffer newBuf = ByteBuffer.allocateDirect(data.length);
+ newBuf.position(0);
+ newBuf.put(data, 0, data.length);
+ newBuf.position(0);
+ setDataNIO(newBuf);
+ } else {
+ setData(data);
+ }
+ }
+
+ String getString() {
+ String ret;
+ if(getData() == null) {
+ ByteBuffer tmp = getDataNIO();
+ tmp.position(getOffset());
+ byte[] data = new byte[getSize()];
+ tmp.get(data, 0, getSize());
+ ret = new String(data, 0, getSize());
+ } else {
+ ret = new String(getData(), getOffset(), getSize());
+ }
+ return ret;
+ }
+ }
+}