use of nl.topicus.jdbc.exception.CloudSpannerSQLException in project spanner-jdbc by olavloite.
the class CloudSpannerConnection method setReadOnly.
@Override
public void setReadOnly(boolean readOnly) throws SQLException {
checkClosed();
if (transaction.isRunning())
throw new CloudSpannerSQLException("There is currently a transaction running. Commit or rollback the running transaction before changing read-only mode.", Code.FAILED_PRECONDITION);
this.readOnly = readOnly;
}
use of nl.topicus.jdbc.exception.CloudSpannerSQLException in project spanner-jdbc by olavloite.
the class CloudSpannerStatement method execute.
@Override
public boolean execute(String sql) throws SQLException {
String[] sqlTokens = getTokens(sql);
CustomDriverStatement custom = getCustomDriverStatement(sqlTokens);
if (custom != null)
return custom.execute(sqlTokens);
Statement statement = null;
boolean ddl = isDDLStatement(sqlTokens);
if (!ddl) {
try {
statement = CCJSqlParserUtil.parse(sanitizeSQL(sql));
} catch (JSQLParserException | TokenMgrException e) {
throw new CloudSpannerSQLException("Error while parsing sql statement " + sql + ": " + e.getLocalizedMessage(), Code.INVALID_ARGUMENT, e);
}
}
if (!ddl && statement instanceof Select) {
determineForceSingleUseReadContext((Select) statement);
if (!isForceSingleUseReadContext() && getConnection().isBatchReadOnly()) {
List<Partition> partitions = partitionQuery(com.google.cloud.spanner.Statement.of(sql));
currentResultSets = new ArrayList<>(partitions.size());
for (Partition p : partitions) {
currentResultSets.add(new CloudSpannerPartitionResultSet(this, getBatchReadOnlyTransaction(), p, sql));
}
} else {
try (ReadContext context = getReadContext()) {
com.google.cloud.spanner.ResultSet rs = context.executeQuery(com.google.cloud.spanner.Statement.of(sql));
currentResultSets = Arrays.asList(new CloudSpannerResultSet(this, rs, sql));
currentResultSetIndex = 0;
lastUpdateCount = -1;
}
}
return true;
} else {
lastUpdateCount = executeUpdate(sql);
currentResultSetIndex = 0;
currentResultSets = null;
return false;
}
}
use of nl.topicus.jdbc.exception.CloudSpannerSQLException in project spanner-jdbc by olavloite.
the class CloudSpannerPreparedStatement method execute.
@Override
public boolean execute() throws SQLException {
CustomDriverStatement custom = getCustomDriverStatement(sqlTokens);
if (custom != null)
return custom.execute(sqlTokens);
Statement statement = null;
boolean ddl = isDDLStatement();
if (!ddl) {
try {
statement = CCJSqlParserUtil.parse(sanitizeSQL(sql));
} catch (JSQLParserException | TokenMgrException e) {
throw new CloudSpannerSQLException(PARSE_ERROR + sql + ": " + e.getLocalizedMessage(), Code.INVALID_ARGUMENT, e);
}
}
if (!ddl && statement instanceof Select) {
determineForceSingleUseReadContext((Select) statement);
com.google.cloud.spanner.Statement.Builder builder = createSelectBuilder(statement, sql);
if (!isForceSingleUseReadContext() && getConnection().isBatchReadOnly()) {
List<Partition> partitions = partitionQuery(builder.build());
currentResultSets = new ArrayList<>(partitions.size());
for (Partition p : partitions) {
currentResultSets.add(new CloudSpannerPartitionResultSet(this, getBatchReadOnlyTransaction(), p, sql));
}
} else {
try (ReadContext context = getReadContext()) {
com.google.cloud.spanner.ResultSet rs = context.executeQuery(builder.build());
currentResultSets = Arrays.asList(new CloudSpannerResultSet(this, rs, sql));
currentResultSetIndex = 0;
lastUpdateCount = -1;
}
}
return true;
} else {
lastUpdateCount = executeUpdate();
currentResultSets = null;
currentResultSetIndex = 0;
return false;
}
}
use of nl.topicus.jdbc.exception.CloudSpannerSQLException in project spanner-jdbc by olavloite.
the class CloudSpannerPreparedStatement method createInsertWithSelectStatement.
private InsertWorker createInsertWithSelectStatement(Insert insert, boolean forceUpdate) throws SQLException {
Select select = insert.getSelect();
if (select == null) {
throw new CloudSpannerSQLException("Insert statement must contain a select statement", Code.INVALID_ARGUMENT);
}
boolean isDuplicate = insert.isUseDuplicate();
InsertWorker.DMLOperation mode;
if (forceUpdate)
mode = DMLOperation.UPDATE;
else if (isDuplicate)
mode = DMLOperation.ONDUPLICATEKEYUPDATE;
else
mode = DMLOperation.INSERT;
return new InsertWorker(getConnection(), select, insert, getParameterStore(), getConnection().isAllowExtendedMode(), mode);
}
use of nl.topicus.jdbc.exception.CloudSpannerSQLException in project spanner-jdbc by olavloite.
the class CloudSpannerTransaction method setSavepoint.
public void setSavepoint(Savepoint savepoint) throws SQLException {
Preconditions.checkNotNull(savepoint);
checkTransaction();
if (transactionThread == null)
throw new CloudSpannerSQLException(SAVEPOINTS_NOT_IN_READ_ONLY, Code.FAILED_PRECONDITION);
transactionThread.setSavepoint(savepoint);
}
Aggregations