summaryrefslogtreecommitdiff
path: root/examples/java/src/db/BtRecExample.java
diff options
context:
space:
mode:
Diffstat (limited to 'examples/java/src/db/BtRecExample.java')
-rw-r--r--examples/java/src/db/BtRecExample.java287
1 files changed, 287 insertions, 0 deletions
diff --git a/examples/java/src/db/BtRecExample.java b/examples/java/src/db/BtRecExample.java
new file mode 100644
index 00000000..28634964
--- /dev/null
+++ b/examples/java/src/db/BtRecExample.java
@@ -0,0 +1,287 @@
+/*-
+ * See the file LICENSE for redistribution information.
+ *
+ * Copyright (c) 1997, 2012 Oracle and/or its affiliates. All rights reserved.
+ *
+ * $Id$
+ */
+
+
+package db;
+
+import com.sleepycat.db.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PrintStream;
+
+public class BtRecExample {
+ static final String progname = "BtRecExample"; // Program name.
+ static final String database = "access.db";
+ static final String wordlist = "../test/tcl/wordlist";
+
+ BtRecExample(BufferedReader reader)
+ throws DatabaseException, IOException, FileNotFoundException {
+
+ OperationStatus status;
+
+ // Remove the previous database.
+ File f = new File(database);
+ f.delete();
+
+ DatabaseConfig config = new DatabaseConfig();
+
+ config.setErrorStream(System.err);
+ config.setErrorPrefix(progname);
+ config.setPageSize(1024); // 1K page sizes.
+
+ config.setBtreeRecordNumbers(true);
+ config.setType(DatabaseType.BTREE);
+ config.setAllowCreate(true);
+ db = new Database(database, null, config);
+
+ //
+ // Insert records into the database, where the key is the word
+ // preceded by its record number, and the data is the same, but
+ // in reverse order.
+ //
+
+ for (int cnt = 1; cnt <= 1000; ++cnt) {
+ String numstr = String.valueOf(cnt);
+ while (numstr.length() < 4)
+ numstr = "0" + numstr;
+ String buf = numstr + '_' + reader.readLine();
+ StringBuffer rbuf = new StringBuffer(buf).reverse();
+
+ StringEntry key = new StringEntry(buf);
+ StringEntry data = new StringEntry(rbuf.toString());
+
+ status = db.putNoOverwrite(null, key, data);
+ if (status != OperationStatus.SUCCESS &&
+ status!= OperationStatus.KEYEXIST)
+ throw new DatabaseException("Database.put failed " + status);
+ }
+ }
+
+ void run() throws DatabaseException {
+ int recno;
+ OperationStatus status;
+
+ // Acquire a cursor for the database.
+ cursor = db.openCursor(null, null);
+
+ //
+ // Prompt the user for a record number, then retrieve and display
+ // that record.
+ //
+ InputStreamReader reader = new InputStreamReader(System.in);
+
+ for (;;) {
+ // Get a record number.
+ String line = askForLine(reader, System.out, "recno #> ");
+ if (line == null)
+ break;
+
+ try {
+ recno = Integer.parseInt(line);
+ } catch (NumberFormatException nfe) {
+ System.err.println("Bad record number: " + nfe);
+ continue;
+ }
+
+ //
+ // Start with a fresh key each time, the db.get() routine returns
+ // the key and data pair, not just the key!
+ //
+ RecnoStringEntry key = new RecnoStringEntry(recno, 4);
+ RecnoStringEntry data = new RecnoStringEntry(4);
+
+ status = cursor.getSearchRecordNumber(key, data, null);
+ if (status != OperationStatus.SUCCESS)
+ throw new DatabaseException("Cursor.setRecno failed: " + status);
+
+ // Display the key and data.
+ show("k/d\t", key, data);
+
+ // Move the cursor a record forward.
+ status = cursor.getNext(key, data, null);
+ if (status != OperationStatus.SUCCESS)
+ throw new DatabaseException("Cursor.getNext failed: " + status);
+
+ // Display the key and data.
+ show("next\t", key, data);
+
+ RecnoStringEntry datano = new RecnoStringEntry(4);
+
+ //
+ // Retrieve the record number for the following record into
+ // local memory.
+ //
+ status = cursor.getRecordNumber(datano, null);
+ if (status != OperationStatus.SUCCESS &&
+ status != OperationStatus.NOTFOUND &&
+ status != OperationStatus.KEYEMPTY)
+ throw new DatabaseException("Cursor.get failed: " + status);
+ else {
+ recno = datano.getRecordNumber();
+ System.out.println("retrieved recno: " + recno);
+ }
+ }
+
+ cursor.close();
+ cursor = null;
+ }
+
+ //
+ // Print out the number of records in the database.
+ //
+ void stats() throws DatabaseException {
+ BtreeStats stats;
+
+ stats = (BtreeStats)db.getStats(null, null);
+ System.out.println(progname + ": database contains " +
+ stats.getNumData() + " records");
+ }
+
+ void show(String msg, RecnoStringEntry key, RecnoStringEntry data)
+ throws DatabaseException {
+
+ System.out.println(msg + key.getString() + ": " + data.getString());
+ }
+
+ public void shutdown() throws DatabaseException {
+ if (cursor != null) {
+ cursor.close();
+ cursor = null;
+ }
+ if (db != null) {
+ db.close();
+ db = null;
+ }
+ }
+
+ public static void main(String[] argv) {
+ try {
+ // Open the word database.
+ FileReader freader = new FileReader(wordlist);
+
+ BtRecExample app = new BtRecExample(new BufferedReader(freader));
+
+ // Close the word database.
+ freader.close();
+ freader = null;
+
+ app.stats();
+ app.run();
+ } catch (FileNotFoundException fnfe) {
+ System.err.println(progname + ": unexpected open error " + fnfe);
+ System.exit (1);
+ } catch (IOException ioe) {
+ System.err.println(progname + ": open " + wordlist + ": " + ioe);
+ System.exit (1);
+ } catch (DatabaseException dbe) {
+ System.err.println("Exception: " + dbe);
+ System.exit(dbe.getErrno());
+ }
+
+ 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();
+ }
+
+ private Cursor cursor;
+ private Database db;
+
+ // Here's an example of how you can extend DatabaseEntry in a
+ // straightforward way to allow easy storage/retrieval of strings.
+ // We've declared it as a static inner class, but it need not be.
+ //
+ static class StringEntry extends DatabaseEntry {
+ StringEntry() {}
+
+ StringEntry(String value) {
+ setString(value);
+ }
+
+ void setString(String value) {
+ byte[] data = value.getBytes();
+ setData(data);
+ setSize(data.length);
+ }
+
+ String getString() {
+ return new String(getData(), 0, getSize());
+ }
+ }
+
+ // Here's an example of how you can extend DatabaseEntry to store
+ // (potentially) both recno's and strings in the same structure.
+ //
+ static class RecnoStringEntry extends DatabaseEntry {
+ RecnoStringEntry(int maxsize) {
+ this(0, maxsize); // let other constructor do most of the work
+ }
+
+ RecnoStringEntry(int value, int maxsize) {
+ arr = new byte[maxsize];
+ setRecordNumber(value);
+ setSize(arr.length);
+ }
+
+ RecnoStringEntry(String value) {
+ byte[] data = value.getBytes();
+ setData(data); // use our local array for data
+ setUserBuffer(data.length, true);
+ }
+
+ void setString(String value) {
+ byte[] data = value.getBytes();
+ setData(data);
+ setSize(data.length);
+ }
+
+ String getString() {
+ return new String(getData(), getOffset(), getSize());
+ }
+
+ byte[] arr;
+ }
+}