use of org.apache.derby.iapi.sql.conn.LanguageConnectionContext in project derby by apache.
the class EmbedConnection method setReadOnly.
/**
* You can put a connection in read-only mode as a hint to enable
* database optimizations.
*
* <P><B>Note:</B> setReadOnly cannot be called while in the
* middle of a transaction.
*
* @param readOnly true enables read-only mode; false disables
* read-only mode.
* @exception SQLException if a database-access error occurs.
*/
public final void setReadOnly(boolean readOnly) throws SQLException {
synchronized (getConnectionSynchronization()) {
setupContextStack();
try {
LanguageConnectionContext lcc = privilegedGetLCC();
lcc.setReadOnly(readOnly);
InterruptStatus.restoreIntrFlagIfSeen(lcc);
} catch (StandardException e) {
throw handleException(e);
} finally {
restoreContextStack();
}
}
}
use of org.apache.derby.iapi.sql.conn.LanguageConnectionContext in project derby by apache.
the class EmbedConnection method setTransactionIsolation.
/**
* You can call this method to try to change the transaction
* isolation level using one of the TRANSACTION_* values.
*
* <P><B>Note:</B> setTransactionIsolation causes the current
* transaction to commit if the isolation level is changed. Otherwise, if
* the requested isolation level is the same as the current isolation
* level, this method is a no-op.
*
* @param level one of the TRANSACTION_* isolation values with the
* exception of TRANSACTION_NONE; some databases may not support
* other values
* @exception SQLException if a database-access error occurs.
* @see DatabaseMetaData#supportsTransactionIsolationLevel
*/
public void setTransactionIsolation(int level) throws SQLException {
if (level == getTransactionIsolation())
return;
// Convert the isolation level to the internal one
int iLevel;
switch(level) {
case java.sql.Connection.TRANSACTION_READ_UNCOMMITTED:
iLevel = TransactionControl.READ_UNCOMMITTED_ISOLATION_LEVEL;
break;
case java.sql.Connection.TRANSACTION_READ_COMMITTED:
iLevel = TransactionControl.READ_COMMITTED_ISOLATION_LEVEL;
break;
case java.sql.Connection.TRANSACTION_REPEATABLE_READ:
iLevel = TransactionControl.REPEATABLE_READ_ISOLATION_LEVEL;
break;
case java.sql.Connection.TRANSACTION_SERIALIZABLE:
iLevel = TransactionControl.SERIALIZABLE_ISOLATION_LEVEL;
break;
default:
throw newSQLException(SQLState.UNIMPLEMENTED_ISOLATION_LEVEL, level);
}
synchronized (getConnectionSynchronization()) {
setupContextStack();
try {
LanguageConnectionContext lcc = privilegedGetLCC();
lcc.setIsolationLevel(iLevel);
InterruptStatus.restoreIntrFlagIfSeen(lcc);
} catch (StandardException e) {
throw handleException(e);
} finally {
restoreContextStack();
}
}
}
use of org.apache.derby.iapi.sql.conn.LanguageConnectionContext in project derby by apache.
the class EmbedConnection method checkUserIsNotARole.
/**
* If applicable, check that we don't connect with a user name
* that equals a role.
*
* @exception SQLException Will throw if the current authorization
* id in {@code lcc} (which is already normalized to
* case normal form - CNF) equals an existing role name
* (which is also stored in CNF).
*/
private void checkUserIsNotARole() throws SQLException {
TransactionResourceImpl tr = getTR();
try {
tr.startTransaction();
LanguageConnectionContext lcc = tr.getLcc();
String username = lcc.getSessionUserId();
DataDictionary dd = lcc.getDataDictionary();
// introduced in 10.4):
if (lcc.usesSqlAuthorization() && dd.checkVersion(DataDictionary.DD_VERSION_DERBY_10_4, null)) {
TransactionController tc = lcc.getTransactionExecute();
String failedString = MessageService.getTextMessage(MessageId.AUTH_INVALID);
if (dd.getRoleDefinitionDescriptor(username) != null) {
throw newSQLException(SQLState.NET_CONNECT_AUTH_FAILED, failedString);
}
}
tr.rollback();
InterruptStatus.restoreIntrFlagIfSeen(lcc);
} catch (StandardException e) {
try {
tr.rollback();
} catch (StandardException ee) {
}
throw handleException(e);
}
}
use of org.apache.derby.iapi.sql.conn.LanguageConnectionContext in project derby by apache.
the class EmbedConnection method checkIsDBOwner.
/**
* Check if actual authenticationId is equal to the database owner's.
*
* @param operation attempted operation which needs database owner powers
* @throws SQLException if actual authenticationId is different
* from authenticationId of database owner.
*/
private void checkIsDBOwner(int operation) throws SQLException {
final LanguageConnectionContext lcc = privilegedGetLCC();
final String actualId = lcc.getSessionUserId();
final String dbOwnerId = lcc.getDataDictionary().getAuthorizationDatabaseOwner();
if (!actualId.equals(dbOwnerId)) {
switch(operation) {
case OP_ENCRYPT:
throw newSQLException(SQLState.AUTH_ENCRYPT_NOT_DB_OWNER, actualId, tr.getDBName());
case OP_DECRYPT:
throw newSQLException(SQLState.AUTH_DECRYPT_NOT_DB_OWNER, actualId, tr.getDBName());
case OP_SHUTDOWN:
throw newSQLException(SQLState.AUTH_SHUTDOWN_NOT_DB_OWNER, actualId, tr.getDBName());
case OP_HARD_UPGRADE:
throw newSQLException(SQLState.AUTH_HARD_UPGRADE_NOT_DB_OWNER, actualId, tr.getDBName());
case OP_REPLICATION:
throw newSQLException(SQLState.AUTH_REPLICATION_NOT_DB_OWNER, actualId, tr.getDBName());
default:
if (SanityManager.DEBUG) {
SanityManager.THROWASSERT("illegal checkIsDBOwner operation");
}
throw newSQLException(SQLState.AUTH_DATABASE_CONNECTION_REFUSED);
}
}
}
use of org.apache.derby.iapi.sql.conn.LanguageConnectionContext in project derby by apache.
the class EmbedDatabaseMetaData method prepareSPS.
/*
** Given a SPS name and a query text it returns a
** java.sql.PreparedStatement for the SPS. If the SPS
** doeesn't exist is created.
**
*/
private PreparedStatement prepareSPS(String spsName, String spsText, boolean net) throws StandardException, SQLException {
LanguageConnectionContext lcc = getLanguageConnectionContext();
/* We now need to do this in sub transaction because we could possibly recompile SPS
* later, and the recompile is in a sub transaction, and will update the SYSSTATEMENTS
* entry. Don't want to block.
*/
lcc.beginNestedTransaction(true);
DataDictionary dd = getLanguageConnectionContext().getDataDictionary();
SPSDescriptor spsd = dd.getSPSDescriptor(spsName, net ? dd.getSysIBMSchemaDescriptor() : dd.getSystemSchemaDescriptor());
lcc.commitNestedTransaction();
if (spsd == null) {
throw Util.notImplemented(spsName);
}
/* manish:
There should be a nicer way of getting a
java.sql.PreparedStatement from an SPS descriptor!
*/
/*
** It is unnecessarily expensive to get the
** the statement, and then send an EXECUTE
** statement, but we have no (easy) way of turning
** the statement into a java.sql.PreparedStatement.
*/
String queryText = "EXECUTE STATEMENT " + (net ? "SYSIBM" : "SYS") + ".\"" + spsName + "\"";
return getEmbedConnection().prepareMetaDataStatement(queryText);
}
Aggregations