package com.sleepycat.examples;
import com.sleepycat.db.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintStream;
public class BtRecExample
{
static final String progname = "BtRecExample"; static final String database = "access.db";
static final String wordlist = "../test/wordlist";
BtRecExample(BufferedReader reader)
throws DbException, IOException, FileNotFoundException
{
int ret;
File f = new File(database);
f.delete();
dbp = new Db(null, 0);
dbp.set_error_stream(System.err);
dbp.set_errpfx(progname);
dbp.set_pagesize(1024);
dbp.set_flags(Db.DB_RECNUM); dbp.open(null, database, null, Db.DB_BTREE, Db.DB_CREATE, 0664);
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();
StringDbt key = new StringDbt(buf);
StringDbt data = new StringDbt(rbuf.toString());
if ((ret = dbp.put(null, key, data, Db.DB_NOOVERWRITE)) != 0) {
if (ret != Db.DB_KEYEXIST)
throw new DbException("Db.put failed" + ret);
}
}
}
void run()
throws DbException
{
int recno;
int ret;
dbcp = dbp.cursor(null, 0);
InputStreamReader reader = new InputStreamReader(System.in);
for (;;) {
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;
}
RecnoStringDbt key = new RecnoStringDbt(recno, 100);
RecnoStringDbt data = new RecnoStringDbt(100);
if ((ret = dbcp.get(key, data, Db.DB_SET_RECNO)) != 0) {
throw new DbException("Dbc.get failed", ret);
}
show("k/d\t", key, data);
if ((ret = dbcp.get(key, data, Db.DB_NEXT)) != 0) {
throw new DbException("Dbc.get failed", ret);
}
show("next\t", key, data);
RecnoStringDbt datano = new RecnoStringDbt(100);
if ((ret = dbcp.get(key, datano, Db.DB_GET_RECNO)) != 0) {
if (ret != Db.DB_NOTFOUND && ret != Db.DB_KEYEMPTY) {
throw new DbException("Dbc.get failed", ret);
}
}
else {
recno = datano.getRecno();
System.out.println("retrieved recno: " + recno);
}
}
dbcp.close();
dbcp = null;
}
void stats()
throws DbException
{
DbBtreeStat statp;
statp = (DbBtreeStat)dbp.stat(0);
System.out.println(progname + ": database contains " +
statp.bt_ndata + " records");
}
void show(String msg, RecnoStringDbt key, RecnoStringDbt data)
throws DbException
{
System.out.println(msg + key.getString() + ": " + data.getString());
}
public void shutdown()
throws DbException
{
if (dbcp != null) {
dbcp.close();
dbcp = null;
}
if (dbp != null) {
dbp.close(0);
dbp = null;
}
}
public static void main(String argv[])
{
try {
FileReader freader = new FileReader(wordlist);
BtRecExample app = new BtRecExample(new BufferedReader(freader));
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 (DbException dbe) {
System.err.println("Exception: " + dbe);
System.exit(dbe.get_errno());
}
System.exit(0);
}
static public 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;
}
static public 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 Dbc dbcp;
private Db dbp;
static
class StringDbt extends Dbt
{
StringDbt(byte[] arr)
{
set_flags(Db.DB_DBT_USERMEM);
set_data(arr);
set_size(arr.length);
}
StringDbt()
{
set_flags(Db.DB_DBT_MALLOC); }
StringDbt(String value)
{
setString(value);
set_flags(Db.DB_DBT_MALLOC); }
void setString(String value)
{
byte[] data = value.getBytes();
set_data(data);
set_size(data.length);
set_ulen(data.length);
}
String getString()
{
return new String(get_data(), 0, get_size());
}
}
static
class RecnoStringDbt extends Dbt
{
RecnoStringDbt(int maxsize)
{
this(0, maxsize); }
RecnoStringDbt(int value, int maxsize)
{
set_flags(Db.DB_DBT_USERMEM); arr = new byte[maxsize];
set_data(arr); set_ulen(maxsize); setRecno(value);
}
RecnoStringDbt(String value, int maxsize)
{
set_flags(Db.DB_DBT_USERMEM); arr = new byte[maxsize];
set_data(arr); set_ulen(maxsize); setString(value);
}
void setRecno(int value)
{
set_recno_key_data(value);
set_size(arr.length);
}
void setString(String value)
{
byte[] data = value.getBytes();
set_data(data);
set_size(data.length);
}
int getRecno()
{
return get_recno_key_data();
}
String getString()
{
return new String(get_data(), 0, get_size());
}
byte arr[];
}
}