📄 tdscore.java
字号:
case Driver.TDS80:
case Driver.TDS81:
executeSQL70(sql, procName, parameters, noMetaData, sendNow);
break;
default:
throw new IllegalStateException("Unknown TDS version " + tdsVersion);
}
if (sendNow) {
out.flush();
connectionLock.release();
connectionLock = null;
sendFailed = false;
endOfResponse = false;
endOfResults = true;
wait(timeOut);
} else {
sendFailed = false;
}
} catch (IOException ioe) {
connection.setClosed();
throw Support.linkException(
new SQLException(
Messages.get(
"error.generic.ioerror", ioe.getMessage()),
"08S01"), ioe);
}
} finally {
if ((sendNow || sendFailed) && connectionLock != null) {
connectionLock.release();
connectionLock = null;
}
// Clear the in batch flag
if (sendNow) {
inBatch = false;
}
}
}
/**
* Prepares the SQL for use with Microsoft server.
*
* @param sql the SQL statement to prepare.
* @param params the actual parameter list
* @param needCursor true if a cursorprepare is required
* @param resultSetType value of the resultSetType parameter when
* the Statement was created
* @param resultSetConcurrency value of the resultSetConcurrency parameter
* whenthe Statement was created
* @return name of the procedure or prepared statement handle.
* @exception SQLException
*/
String microsoftPrepare(String sql,
ParamInfo[] params,
boolean needCursor,
int resultSetType,
int resultSetConcurrency)
throws SQLException {
//
checkOpen();
messages.clearWarnings();
int prepareSql = connection.getPrepareSql();
if (prepareSql == TEMPORARY_STORED_PROCEDURES) {
StringBuffer spSql = new StringBuffer(sql.length() + 32 + params.length * 15);
String procName = connection.getProcName();
spSql.append("create proc ");
spSql.append(procName);
spSql.append(' ');
for (int i = 0; i < params.length; i++) {
spSql.append("@P");
spSql.append(i);
spSql.append(' ');
spSql.append(params[i].sqlType);
if (i + 1 < params.length) {
spSql.append(',');
}
}
// continue building proc
spSql.append(" as ");
spSql.append(Support.substituteParamMarkers(sql, params));
try {
submitSQL(spSql.toString());
return procName;
} catch (SQLException e) {
if ("08S01".equals(e.getSQLState())) {
// Serious (I/O) error, rethrow
throw e;
}
// This exception probably caused by failure to prepare
// Add a warning
messages.addWarning(Support.linkException(
new SQLWarning(
Messages.get("error.prepare.prepfailed",
e.getMessage()),
e.getSQLState(), e.getErrorCode()),
e));
}
} else if (prepareSql == PREPARE) {
int scrollOpt, ccOpt;
ParamInfo prepParam[] = new ParamInfo[needCursor ? 6 : 4];
// Setup prepare handle param
prepParam[0] = new ParamInfo(Types.INTEGER, null, ParamInfo.OUTPUT);
// Setup parameter descriptor param
prepParam[1] = new ParamInfo(Types.LONGVARCHAR,
Support.getParameterDefinitions(params),
ParamInfo.UNICODE);
// Setup sql statemement param
prepParam[2] = new ParamInfo(Types.LONGVARCHAR,
Support.substituteParamMarkers(sql, params),
ParamInfo.UNICODE);
// Setup options param
prepParam[3] = new ParamInfo(Types.INTEGER, new Integer(1), ParamInfo.INPUT);
if (needCursor) {
// Select the correct type of Server side cursor to
// match the scroll and concurrency options.
scrollOpt = MSCursorResultSet.getCursorScrollOpt(resultSetType,
resultSetConcurrency, true);
ccOpt = MSCursorResultSet.getCursorConcurrencyOpt(resultSetConcurrency);
// Setup scroll options parameter
prepParam[4] = new ParamInfo(Types.INTEGER,
new Integer(scrollOpt),
ParamInfo.OUTPUT);
// Setup concurrency options parameter
prepParam[5] = new ParamInfo(Types.INTEGER,
new Integer(ccOpt),
ParamInfo.OUTPUT);
}
columns = null; // Will be populated if preparing a select
try {
executeSQL(null, needCursor ? "sp_cursorprepare" : "sp_prepare",
prepParam, false, 0, -1, -1, true);
int resultCount = 0;
while (!endOfResponse) {
nextToken();
if (isResultSet()) {
resultCount++;
}
}
// columns will now hold meta data for any select statements
if (resultCount != 1) {
// More than one result set was returned or none
// therefore metadata not available or unsafe.
columns = null;
}
Integer prepareHandle = (Integer) prepParam[0].getOutValue();
if (prepareHandle != null) {
return prepareHandle.toString();
}
// Probably an exception occured, check for it
messages.checkErrors();
} catch (SQLException e) {
if ("08S01".equals(e.getSQLState())) {
// Serious (I/O) error, rethrow
throw e;
}
// This exception probably caused by failure to prepare
// Add a warning
messages.addWarning(Support.linkException(
new SQLWarning(
Messages.get("error.prepare.prepfailed",
e.getMessage()),
e.getSQLState(), e.getErrorCode()),
e));
}
}
return null;
}
/**
* Creates a light weight stored procedure on a Sybase server.
*
* @param sql SQL statement to prepare
* @param params the actual parameter list
* @return name of the procedure
* @throws SQLException if an error occurs
*/
synchronized String sybasePrepare(String sql, ParamInfo[] params)
throws SQLException {
checkOpen();
messages.clearWarnings();
if (sql == null || sql.length() == 0) {
throw new IllegalArgumentException(
"sql parameter must be at least 1 character long.");
}
String procName = connection.getProcName();
if (procName == null || procName.length() != 11) {
throw new IllegalArgumentException(
"procName parameter must be 11 characters long.");
}
// TODO Check if output parameters are handled ok
// Check no text/image parameters
for (int i = 0; i < params.length; i++) {
if ("text".equals(params[i].sqlType)
|| "unitext".equals(params[i].sqlType)
|| "image".equals(params[i].sqlType)) {
return null; // Sadly no way
}
}
Semaphore mutex = null;
try {
mutex = connection.getMutex();
out.setPacketType(SYBQUERY_PKT);
out.write((byte)TDS5_DYNAMIC_TOKEN);
byte buf[] = Support.encodeString(connection.getCharset(), sql);
out.write((short) (buf.length + 41));
out.write((byte) 1);
out.write((byte) 0);
out.write((byte) 10);
out.writeAscii(procName.substring(1));
out.write((short) (buf.length + 26));
out.writeAscii("create proc ");
out.writeAscii(procName.substring(1));
out.writeAscii(" as ");
out.write(buf);
out.flush();
endOfResponse = false;
clearResponseQueue();
messages.checkErrors();
return procName;
} catch (IOException ioe) {
connection.setClosed();
throw Support.linkException(
new SQLException(
Messages.get(
"error.generic.ioerror", ioe.getMessage()),
"08S01"), ioe);
} catch (SQLException e) {
if ("08S01".equals(e.getSQLState())) {
// Serious error rethrow
throw e;
}
// This exception probably caused by failure to prepare
// Return null;
return null;
} finally {
if (mutex != null) {
mutex.release();
}
}
}
/**
* Drops a Sybase temporary stored procedure.
*
* @param procName the temporary procedure name
* @throws SQLException if an error occurs
*/
synchronized void sybaseUnPrepare(String procName)
throws SQLException {
checkOpen();
messages.clearWarnings();
if (procName == null || procName.length() != 11) {
throw new IllegalArgumentException(
"procName parameter must be 11 characters long.");
}
Semaphore mutex = null;
try {
mutex = connection.getMutex();
out.setPacketType(SYBQUERY_PKT);
out.write((byte)TDS5_DYNAMIC_TOKEN);
out.write((short) (15));
out.write((byte) 4);
out.write((byte) 0);
out.write((byte) 10);
out.writeAscii(procName.substring(1));
out.write((short)0);
out.flush();
endOfResponse = false;
clearResponseQueue();
messages.checkErrors();
} catch (IOException ioe) {
connection.setClosed();
throw Support.linkException(
new SQLException(
Messages.get(
"error.generic.ioerror", ioe.getMessage()),
"08S01"), ioe);
} catch (SQLException e) {
if ("08S01".equals(e.getSQLState())) {
// Serious error rethrow
throw e;
}
// This exception probably caused by failure to unprepare
} finally {
if (mutex != null) {
mutex.release();
}
}
}
/**
* Enlist the current connection in a distributed transaction or request the location of the
* MSDTC instance controlling the server we are connected to.
*
* @param type set to 0 to request TM address or 1 to enlist connection
* @param oleTranID the 40 OLE transaction ID
* @return a <code>byte[]</code> array containing the TM address data
* @throws SQLException
*/
synchronized byte[] enlistConnection(int type, byte[] oleTranID) throws SQLException {
Semaphore mutex = null;
try {
mutex = connection.getMutex();
out.setPacketType(MSDTC_PKT);
out.write((short)type);
switch (type) {
case 0: // Get result set with location of MSTDC
out.write((short)0);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -