/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2001, 2015 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
package db.repquote_gsg;
import java.io.FileNotFoundException;
// BufferedReader and InputStreamReader needed for our command line
// prompt.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import com.sleepycat.db.Cursor;
import com.sleepycat.db.Database;
import com.sleepycat.db.DatabaseConfig;
import com.sleepycat.db.DatabaseEntry;
import com.sleepycat.db.DatabaseException;
import com.sleepycat.db.DatabaseType;
import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockMode;
import com.sleepycat.db.OperationStatus;
import db.repquote_gsg.SimpleConfig;
public class SimpleTxn
{
private SimpleConfig simpleConfig;
private Environment dbenv;
public SimpleTxn()
throws DatabaseException
{
simpleConfig = null;
dbenv = null;
}
public static void usage()
{
System.err.println("usage: " + SimpleConfig.progname + " -h home");
System.exit(1);
}
public static void main(String[] argv)
throws Exception
{
SimpleConfig config = new SimpleConfig();
// Extract the command line parameters.
for (int i = 0; i < argv.length; i++)
{
if (argv[i].compareTo("-h") == 0) {
// home - a string arg.
i++;
config.home = argv[i];
} else {
System.err.println("Unrecognized option: " + argv[i]);
usage();
}
}
// Error check command line.
if (config.home.length() == 0)
usage();
SimpleTxn runner = null;
try {
runner = new SimpleTxn();
runner.init(config);
runner.doloop();
runner.terminate();
} catch (DatabaseException dbe) {
System.err.println("Caught an exception during " +
"initialization or processing: " + dbe.toString());
if (runner != null)
runner.terminate();
}
System.exit(0);
} // end main
public int init(SimpleConfig config)
throws DatabaseException
{
int ret = 0;
simpleConfig = config;
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setErrorStream(System.err);
envConfig.setErrorPrefix(SimpleConfig.progname);
envConfig.setCacheSize(SimpleConfig.CACHESIZE);
envConfig.setTxnNoSync(true);
envConfig.setAllowCreate(true);
envConfig.setRunRecovery(true);
envConfig.setInitializeLocking(true);
envConfig.setInitializeLogging(true);
envConfig.setInitializeCache(true);
envConfig.setTransactional(true);
try {
dbenv = new Environment(simpleConfig.getHome(), envConfig);
} catch(FileNotFoundException e) {
System.err.println("FileNotFound exception: " + e.toString());
System.err.println(
"Ensure that the environment directory is pre-created.");
ret = 1;
}
return ret;
}
// Provides the main data processing function for our application.
// This function provides a command line prompt to which the user
// can provide a ticker string and a stock price. Once a value is
// entered to the application, the application writes the value to
// the database and then displays the entire database.
public int doloop()
throws DatabaseException, UnsupportedEncodingException
{
Database db = null;
for (;;)
{
if (db == null) {
DatabaseConfig dbconf = new DatabaseConfig();
dbconf.setType(DatabaseType.BTREE);
dbconf.setAllowCreate(true);
dbconf.setTransactional(true);
try {
db = dbenv.openDatabase(null, // txn handle
SimpleConfig.progname, // db filename
null, // db name
dbconf);
} catch (FileNotFoundException fnfe) {
System.err.println("File not found exception" +
fnfe.toString());
// Get here only if the environment home directory
// somehow does not exist.
}
}
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
// Listen for input, and add it to the database.
System.out.print("QUOTESERVER> ");
System.out.flush();
String nextline = null;
try {
nextline = stdin.readLine();
} catch (IOException ioe) {
System.err.println("Unable to get data from stdin");
break;
}
String[] words = nextline.split("\\s");
// A blank line causes the DB to be dumped to stdout.
if (words.length == 0 ||
(words.length == 1 && words[0].length() == 0)) {
try {
printStocks(db);
} catch (DatabaseException e) {
System.err.println("Got db exception reading " +
"DB: " + e.toString());
break;
}
continue;
}
if (words.length == 1 &&
(words[0].compareToIgnoreCase("quit") == 0 ||
words[0].compareToIgnoreCase("exit") == 0)) {
break;
} else if (words.length != 2) {
System.err.println("Format: TICKER VALUE");
continue;
}
DatabaseEntry key =
new DatabaseEntry(words[0].getBytes("UTF-8"));
DatabaseEntry data =
new DatabaseEntry(words[1].getBytes("UTF-8"));
db.put(null, key, data);
}
if (db != null)
db.close(true);
return 0;
}
public void terminate()
throws DatabaseException
{
dbenv.close();
}
// Display all the stock quote information in the database.
// Return type is void because error conditions are propagated
// via exceptions.
private void printStocks(Database db)
throws DatabaseException
{
Cursor dbc = db.openCursor(null, null);
System.out.println("\tSymbol\tPrice");
System.out.println("\t======\t=====");
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry data = new DatabaseEntry();
OperationStatus ret;
for (ret = dbc.getFirst(key, data, LockMode.DEFAULT);
ret == OperationStatus.SUCCESS;
ret = dbc.getNext(key, data, LockMode.DEFAULT)) {
String keystr = new String
(key.getData(), key.getOffset(), key.getSize());
String datastr = new String
(data.getData(), data.getOffset(), data.getSize());
System.out.println("\t"+keystr+"\t"+datastr);
}
dbc.close();
}
} // end class