diff options
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.java | 180 |
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; + } + } +} |