mirror of
https://github.com/berkeleydb/libdb.git
synced 2024-11-16 17:16:25 +00:00
154 lines
3.9 KiB
Text
154 lines
3.9 KiB
Text
/*-
|
|
* Copyright (c) 2002,2009 Oracle. All rights reserved.
|
|
*
|
|
*/
|
|
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;
|
|
|
|
class SecondaryExample
|
|
{
|
|
private static final String progname = "SecondaryExample";
|
|
private static final String DATABASE_HOME = "TESTDIR";
|
|
|
|
public static void main(String[] args)
|
|
{
|
|
try {
|
|
SecondaryExample app = new SecondaryExample();
|
|
app.run();
|
|
} catch(Exception e) {
|
|
System.err.println(progname + ": " + e);
|
|
e.printStackTrace(System.err);
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
void run() throws DbException, FileNotFoundException
|
|
{
|
|
DbEnv dbenv = new DbEnv(0);
|
|
|
|
/* Open the environment. */
|
|
dbenv.open(DATABASE_HOME,
|
|
Db.DB_CREATE | Db.DB_INIT_LOCK | Db.DB_INIT_LOG |
|
|
Db.DB_INIT_MPOOL | Db.DB_INIT_TXN, 0);
|
|
|
|
try {
|
|
run_app(dbenv);
|
|
} finally {
|
|
dbenv.close(0);
|
|
}
|
|
}
|
|
|
|
private void run_app(DbEnv dbenv)
|
|
throws DbException, FileNotFoundException
|
|
{
|
|
Db dbp, sdbp;
|
|
Dbt key, pkey, skey, data;
|
|
StudentRecord srec;
|
|
|
|
/* Open/create primary */
|
|
dbp = new Db(dbenv, 0);
|
|
dbp.open(null, "students.db", null, Db.DB_BTREE, Db.DB_CREATE,
|
|
0600);
|
|
|
|
/*
|
|
* Open/create secondary. Note that it supports duplicate data
|
|
* items, since last names might not be unique.
|
|
*/
|
|
sdbp = new Db(dbenv, 0);
|
|
sdbp.set_flags(Db.DB_DUP | Db.DB_DUPSORT);
|
|
sdbp.open(null, "lastname.db", null, Db.DB_BTREE, Db.DB_CREATE,
|
|
0600);
|
|
|
|
try {
|
|
/* Associate the secondary with the primary. */
|
|
dbp.associate(sdbp, new GetName(), 0);
|
|
|
|
/* Add a new record */
|
|
key = new Dbt();
|
|
key.set_data("WC42".getBytes());
|
|
key.set_size(4);
|
|
srec = new StudentRecord();
|
|
srec.student_id = "WC42";
|
|
srec.last_name = "Churchill ";
|
|
srec.first_name = "Winston ";
|
|
data = new Dbt();
|
|
srec.encode(data);
|
|
|
|
System.out.println("Adding a record with primary key " +
|
|
new String(key.get_data()) + " and secondary key " +
|
|
srec.last_name);
|
|
dbp.put(null, key, data, 0);
|
|
|
|
/* Now do a lookup */
|
|
skey = new Dbt();
|
|
pkey = new Dbt();
|
|
data = new Dbt();
|
|
skey.set_data("Churchill ".getBytes());
|
|
skey.set_size(15);
|
|
System.out.println("Searching with secondary key " +
|
|
new String(skey.get_data()));
|
|
sdbp.pget(null, skey, pkey, data, 0);
|
|
|
|
System.out.println("Found a record with primary key " +
|
|
new String(pkey.get_data()));
|
|
} finally {
|
|
dbp.close(0);
|
|
sdbp.close(0);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* getname -- extracts a secondary key (the last name) from a primary
|
|
* key/data pair
|
|
*/
|
|
class GetName implements DbSecondaryKeyCreate {
|
|
public int secondary_key_create(Db secondary,
|
|
Dbt pkey, Dbt pdata, Dbt skey) {
|
|
StudentRecord srec = new StudentRecord();
|
|
srec.decode(pdata);
|
|
|
|
// Make a fixed-length array of last_name
|
|
byte[] last_name_data = srec.last_name.getBytes();
|
|
byte[] last_name_raw = new byte[15];
|
|
System.arraycopy(last_name_data, 0, last_name_raw, 0,
|
|
last_name_data.length);
|
|
|
|
skey.set_data(last_name_raw);
|
|
skey.set_size(last_name_raw.length);
|
|
return (0);
|
|
}
|
|
}
|
|
|
|
class StudentRecord
|
|
{
|
|
String student_id; // assumed to be 4 bytes long
|
|
String last_name; // assumed to be 15 bytes long
|
|
String first_name; // assumed to be 15 bytes long
|
|
|
|
void decode(Dbt dbt) {
|
|
byte[] data = dbt.get_data();
|
|
student_id = new String(data, 0, 4);
|
|
last_name = new String(data, 4, 15);
|
|
first_name = new String(data, 19, 15);
|
|
}
|
|
|
|
void encode(Dbt dbt) {
|
|
byte[] data = new byte[34];
|
|
System.arraycopy(student_id.getBytes(), 0, data, 0, 4);
|
|
byte[] last_name_raw = last_name.getBytes();
|
|
System.arraycopy(last_name_raw, 0, data, 4,
|
|
last_name_raw.length);
|
|
byte[] first_name_raw = first_name.getBytes();
|
|
System.arraycopy(first_name_raw, 0, data, 19,
|
|
first_name_raw.length);
|
|
dbt.set_data(data);
|
|
dbt.set_size(data.length);
|
|
}
|
|
}
|
|
}
|