view src/main/java/nl/cwi/monetdb/jdbc/MonetDataSource.java @ 93:eeb71f7d36bf embedded

Fixed a bug on the JDBC MAPI connection from the old code! Fixed the connection properties for an JDBC Embedded connection. To start a JDBC Embedded connection, the user must start the embedded database beforehand with the method MonetDBEmbeddedDatabase.StartDatabase().
author Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
date Fri, 06 Jan 2017 12:36:33 +0000 (2017-01-06)
parents 6f74e01c57da
children 08bc9009d190
line wrap: on
line source
/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0.  If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
 */

package nl.cwi.monetdb.jdbc;

import java.sql.*;
import javax.sql.*;
import java.util.*;
import java.io.*;
import java.util.logging.Logger;

/**
 * A DataSource suitable for the MonetDB database.
 * 
 * This DataSource allows retrieval of a Connection using the JNDI bean like
 * framework.  A DataSource has numerous advantages over using the DriverManager
 * to retrieve a Connection object.  Using the DataSource interface enables a
 * more transparent application where the location or database can be changed
 * without changing any application code.
 * 
 * Additionally, pooled connections can be used when using a DataSource.
 *
 * @author Fabian Groffen
 * @version 0.1
 */
public class MonetDataSource extends MonetWrapper implements DataSource {

	private String user;
	private String password; // insecure, but how to do it better?
    private String description = "MonetDB database";
	private String url = "jdbc:monetdb://localhost/";
    private int loginTimeout;
    private boolean isEmbedded;
    private final MonetDriver driver = new MonetDriver();

	// the following properties are also standard:
	// private String dataSourceName;
	// private String networkProtocol;
	// private String serverName;
	// private String role;

    public MonetDataSource() {}

	/**
	 * Attempts to establish a connection with the data source that this DataSource object represents.
	 *
	 * @return a MonetConnection
	 * @throws SQLException if connecting to the database fails
	 */
	@Override
	public Connection getConnection() throws SQLException {
		return getConnection(user, password);
	}

	/**
	 * Attempts to establish a connection with the data source that this DataSource object represents.
	 *
	 * @param username the username to use
	 * @param password the password to use
	 * @return a MonetConnection
	 * @throws SQLException if connecting to the database fails
	 */
	@Override
	public Connection getConnection(String username, String password) throws SQLException {
		Properties props = new Properties();
		props.put("user", username);
		props.put("password", password);
        if (loginTimeout > 0) {
            props.put("so_timeout", Integer.toString(loginTimeout));
        }
		if(isEmbedded) {
            props.put("embedded", "true");
        }
		return driver.connect(url, props);
	}

	/**
	 * Gets the maximum time in seconds that this data source can wait while attempting to connect to a database.
	 *
	 * @return login timeout default is 0 (infinite)
	 */
	@Override
	public int getLoginTimeout() {
		return loginTimeout;
	}

	/**
	 * Sets the maximum time in seconds that this data source will wait while attempting to connect to a database.
	 *
	 * @param seconds the number of seconds to wait before aborting the connect
	 */
	@Override
	public void setLoginTimeout(int seconds) {
		loginTimeout = seconds;
	}

	/**
	 * Retrieves the log writer for this DataSource object.
	 *
	 * @return null, since there is no log writer
	 */
	@Override
	public PrintWriter getLogWriter() {
		return null;
	}

	/**
	 * Sets the log writer for this DataSource object to the given java.io.PrintWriter object.
	 *
	 * @param out a PrintWriter - ignored
	 */
	@Override
	public void setLogWriter(PrintWriter out) {}

	/**
	 * Sets the password to use when connecting.  There is no getter
	 * for obvious reasons.
	 *
	 * @param password the password
	 */
	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * Gets the username
	 *
	 * @return the username
	 */
	public String getUser() {
		return user;
	}

	/**
	 * Sets the username
	 *
	 * @param user the username
	 */
	public void setUser(String user) {
		this.user = user;
	}

	/**
	 * Gets the connection URL
	 *
	 * @return the connection URL
	 */
	public String getURL() {
		return url;
	}

	/**
	 * Sets the connection URL
	 *
	 * @param url the connection URL
	 */
	public void setURL(String url) {
		this.url = url;
	}

	/**
	 * Gets the description
	 *
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Sets the description
	 *
	 * @param description the description
	 */
	public void setDescription(String description) {
		this.description = description;
	}

    /**
     * Gets the embedded connection directory. If not, then a MAPI connection will be created instead.
     *
     * @return If the connection will be embedded. If not, then a MAPI connection will be created instead.
     */
    public boolean isEmbedded() {
        return isEmbedded;
    }

    /**
     * Sets the connection to be embedded
     *
     * @param isEmbedded A boolean to indicate if the connection will be embedded
     */
    public void setIsEmbedded(boolean isEmbedded) {
        this.isEmbedded = isEmbedded;
    }

    /**
	 * Return the parent Logger of all the Loggers used by this data
	 * source.  This should be the Logger farthest from the root Logger
	 * that is still an ancestor of all of the Loggers used by this data
	 * source.  Configuring this Logger will affect all of the log
	 * messages generated by the data source. In the worst case, this
	 * may be the root Logger.
	 *
	 * @return the parent Logger for this data source
	 * @throws SQLFeatureNotSupportedException if the data source does not use java.util.logging
	 */
	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		throw new SQLFeatureNotSupportedException("java.util.logging not in use", "0A000");
	}
}