package org.reldb.dbrowser.ui;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.reldb.rel.client.Connection;
import org.reldb.rel.client.Error;
import org.reldb.rel.client.NullTuples;
import org.reldb.rel.client.Tuple;
import org.reldb.rel.client.Tuples;
import org.reldb.rel.client.Value;
import org.reldb.rel.client.Connection.ExecuteResult;
import org.reldb.rel.client.Connection.HTMLReceiver;
import org.reldb.rel.client.connection.CrashHandler;
import org.reldb.rel.client.connection.string.ClientFromURL;
import org.reldb.rel.client.connection.string.StringReceiverClient;
import org.reldb.rel.exceptions.DatabaseFormatVersionException;
public class DbConnection {
public static final int QUERY_WAIT_MILLISECONDS = 5000;
private Connection connection;
private static String[] bundleJarPath = null;
private static String[] getBundleJarPath(Class<?> klass) {
if (bundleJarPath == null)
try {
Bundle bundle = FrameworkUtil.getBundle(klass);
if (bundle == null) {
System.out.println("DbConnection: Unable to retrieve bundle containing '" + klass + "', so some functionality might be unavailable.");
return null;
}
Vector<String> jarPaths = new Vector<String>();
System.out.println("DbConnection: Search for Rel core JAR files...");
Enumeration<URL> urls = bundle.findEntries("/lib", "rel0*", true);
if (urls != null)
while (urls.hasMoreElements()) {
URL fileURL = FileLocator.toFileURL(urls.nextElement());
File file = new File(fileURL.getFile());
System.out.println("DbConnection: found " + file.getPath());
jarPaths.add(file.getAbsolutePath());
}
else
System.out.println("DbConnection: found nothing.");
bundleJarPath = jarPaths.toArray(new String[0]);
} catch (Exception e) {
System.out.println("DbConnection: Error in getBundleJarPath: " + e);
e.printStackTrace();
return null;
}
return bundleJarPath;
}
public DbConnection(String dbURL, boolean createDatabaseIfNotExists, CrashHandler crashHandler) throws NumberFormatException, MalformedURLException, IOException, DatabaseFormatVersionException {
connection = new Connection(dbURL, createDatabaseIfNotExists, crashHandler, getBundleJarPath(getClass()));
}
public DbConnection(String dbURL, CrashHandler crashHandler) throws NumberFormatException, MalformedURLException, IOException, DatabaseFormatVersionException {
this(dbURL, false, crashHandler);
}
private static class Bundler {
}
public static void convertToLatestFormat(String dbURL, PrintStream conversionOutput) throws DatabaseFormatVersionException, IOException {
Connection.convertToLatestFormat(dbURL, conversionOutput, getBundleJarPath((new Bundler()).getClass()));
}
public String getDbURL() {
return connection.getDbURL();
}
public StringReceiverClient obtainStringReceiverClient() {
try {
return ClientFromURL.openConnection(connection.getDbURL(), false, connection.getCrashHandler(), connection.getAdditionalJars());
} catch (Exception e) {
System.out.println("DbConnection: Unable to obtain StringReceiverClient for a live DbConnection: " + e);
return null;
}
}
public ExecuteResult execute(String query) {
return connection.exec(query);
}
public Tuples getTuples(String query) {
return connection.getTuples(query, QUERY_WAIT_MILLISECONDS);
}
public void evaluate(String query, HTMLReceiver htmlReceiver) {
connection.evaluate(query, htmlReceiver);
}
public Value evaluate(String query) {
try {
Value result = connection.evaluate(query).awaitResult(QUERY_WAIT_MILLISECONDS);
if (result instanceof Error) {
MessageDialog.openError(Display.getDefault().getActiveShell(), "Error", result.toString());
return new NullTuples();
}
return result;
} catch (IOException e) {
e.printStackTrace();
return new NullTuples();
}
}
public int hasRevExtensions() {
String query = "sys.rev.Version";
try {
Value response = (Value)connection.evaluate(query).awaitResult(QUERY_WAIT_MILLISECONDS);
if (response instanceof Tuples) {
int version = -1;
for (Tuple tuple: (Tuples)response)
version = tuple.get("ver").toInt();
return version;
}
return -1;
} catch (IOException e) {
System.out.println("Unable to obtain version of Rev extensions. Are they not installed?");
return -1;
}
}
private String[] keywordCache = null;
public String[] getKeywords() {
if (keywordCache == null) {
String query = "sys.Keywords";
try {
System.out.println("Obtaining keyword list from database.");
Value response = (Value)connection.evaluate(query).awaitResult(QUERY_WAIT_MILLISECONDS);
if (response instanceof Tuples) {
Vector<String> keywords = new Vector<String>();
for (Tuple tuple: (Tuples)response) {
String keyword = tuple.get("Keyword").toString();
keywords.add(keyword);
}
keywordCache = keywords.toArray(new String[0]);
} else
keywordCache = new String[0];
} catch (IOException e) {
System.out.println("Unable to obtain keywords from database.");
keywordCache = new String[0];
}
}
return keywordCache;
}
}