/***************************************************************************/ /* EXECUTE.C */ /* Copyright (C) 1995-96 SYWARE Inc., All rights reserved */ /***************************************************************************/ // Commenting #define out - causing compiler error - not sure if needed, compiles // okay without it. //#define WINVER 0x0400 #include "precomp.h" #include "wbemidl.h" #include //smart pointer _COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices); _COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject); //_COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext ); _COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator); #include "drdbdr.h" /***************************************************************************/ RETCODE SQL_API SQLExecute( HSTMT hstmt) /* statement to execute. */ { LPSTMT lpstmt; LPSQLNODE lpSqlNode; SQLNODEIDX idxParameter; LPSQLNODE lpSqlNodeParameter; LPPARAMETER lpParameter; SDWORD cbValue; BOOL fDataTruncated; /* Get handle */ lpstmt = (LPSTMT) hstmt; lpstmt->errcode = ERR_SUCCESS; //To make guarentee Ole is initialized per thread COleInitializationManager myOleManager; MyImpersonator im (lpstmt, "SQLExecute"); /* Error if in the middle of a statement already */ if (lpstmt->fStmtType != STMT_TYPE_NONE) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } if (lpstmt->fNeedData) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } /* Error if no SQL statement available */ if (lpstmt->lpSqlStmt == NULL) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } /* Get the root of the SQL tree */ lpSqlNode = ToNode(lpstmt->lpSqlStmt, ROOT_SQLNODE); if (lpSqlNode->sqlNodeType != NODE_TYPE_ROOT) { lpstmt->errcode = ERR_INTERNAL; return SQL_ERROR; } /* Count of rows is not available */ lpstmt->cRowCount = -1; /* Do parameter substitution */ lpstmt->fNeedData = FALSE; lpstmt->idxParameter = NO_SQLNODE; lpstmt->cbParameterOffset = -1; fDataTruncated = FALSE; idxParameter = lpSqlNode->node.root.parameters; while (idxParameter != NO_SQLNODE) { /* Get the parameter node in the SQL tree */ lpSqlNodeParameter = ToNode(lpstmt->lpSqlStmt, idxParameter); /* Find the parameter specification in the list of bound parameters */ for (lpParameter = lpstmt->lpParameter; lpParameter != NULL; lpParameter = lpParameter->lpNext) { if (lpParameter->ipar == lpSqlNodeParameter->node.parameter.Id) break; } if (lpParameter == NULL) { lpstmt->fNeedData = FALSE; lpstmt->errcode = ERR_PARAMETERMISSING; return SQL_ERROR; } /* Get length of parameter */ if (lpParameter->pcbValue != NULL) cbValue = *(lpParameter->pcbValue); else cbValue = SQL_NTS; /* Is this a data-at-exec parameter? */ if ((cbValue != SQL_DATA_AT_EXEC) && (cbValue > SQL_LEN_DATA_AT_EXEC(0))) { /* No. Mark it */ lpSqlNodeParameter->node.parameter.AtExec = FALSE; /* Copy the value into the parameter node */ lpstmt->errcode = SetParameterValue(lpstmt, lpSqlNodeParameter, NULL, lpParameter->fCType, lpParameter->rgbValue, cbValue); if (lpstmt->errcode == ERR_DATATRUNCATED) { fDataTruncated = TRUE; lpstmt->errcode = ERR_SUCCESS; } if (lpstmt->errcode != ERR_SUCCESS) { lpstmt->fNeedData = FALSE; return SQL_ERROR; } } else { /* Yes. Mark it */ lpSqlNodeParameter->node.parameter.AtExec = TRUE; /* Set flag saying data is still needed */ lpstmt->fNeedData = TRUE; lpstmt->cbParameterOffset = 0; } /* Point to the next parameter */ idxParameter = lpSqlNodeParameter->node.parameter.Next; } /* Are any parameters still needed? */ if (lpstmt->fNeedData) /* Yes. let caller know that */ return SQL_NEED_DATA; else { /* No. Perform the operation now */ lpstmt->errcode = ExecuteQuery(lpstmt, NULL); if ((lpstmt->errcode == ERR_DATATRUNCATED) || (lpstmt->errcode == ERR_DDLIGNORED) || (lpstmt->errcode == ERR_DDLCAUSEDACOMMIT)) return SQL_SUCCESS_WITH_INFO; if (lpstmt->errcode != ERR_SUCCESS) return SQL_ERROR; } if (fDataTruncated) { lpstmt->errcode = ERR_DATATRUNCATED; return SQL_SUCCESS_WITH_INFO; } return SQL_SUCCESS; } /***************************************************************************/ RETCODE SQL_API SQLExecDirect( HSTMT hstmt, UCHAR FAR *szSqlStr, SDWORD cbSqlStr) { LPSTMT lpstmt; RETCODE rc; //To make guarentee Ole is initialized per thread COleInitializationManager myOleManager; //Check if size is given as SQL_NTS, if so calculate real size if ( (cbSqlStr == SQL_NTS) && szSqlStr) cbSqlStr = lstrlen((char*)szSqlStr); /* Get handle */ lpstmt = (LPSTMT) hstmt; lpstmt->errcode = ERR_SUCCESS; MyImpersonator im (lpstmt, "SQLExecDirect"); /* Prepare the statement */ rc = SQLPrepare(hstmt, szSqlStr, cbSqlStr); if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO)) return rc; /* Execute it */ rc = SQLExecute(hstmt); /* If execution caused a commit and the commit wiped out the prepared */ /* statement, try again. It will work this time since the transaction */ /* has been committed */ if ((rc == SQL_ERROR) && (lpstmt->errcode == ERR_DDLSTATEMENTLOST)) { rc = SQLExecDirect(hstmt, szSqlStr, cbSqlStr); if ((rc == SQL_SUCCESS) || (rc == SQL_SUCCESS_WITH_INFO)) { lpstmt->errcode = ERR_DDLCAUSEDACOMMIT; rc = SQL_SUCCESS_WITH_INFO; } return rc; } /* If execution failed, get rid of prepared statement */ if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO) && (rc != SQL_NEED_DATA)) { FreeTree(lpstmt->lpSqlStmt); lpstmt->lpSqlStmt = NULL; lpstmt->fPreparedSql = FALSE; if (lpstmt->lpISAMStatement != NULL) { ISAMFreeStatement(lpstmt->lpISAMStatement); lpstmt->lpISAMStatement = NULL; } lpstmt->fNeedData = FALSE; lpstmt->idxParameter = NO_SQLNODE; lpstmt->cbParameterOffset = -1; lpstmt->cRowCount = -1; } /* If not a SELECT statement, get rid of prepared statement */ else if ((lpstmt->fStmtType != STMT_TYPE_SELECT) && (rc != SQL_NEED_DATA)) { FreeTree(lpstmt->lpSqlStmt); lpstmt->lpSqlStmt = NULL; lpstmt->fPreparedSql = FALSE; if (lpstmt->lpISAMStatement != NULL) { ISAMFreeStatement(lpstmt->lpISAMStatement); lpstmt->lpISAMStatement = NULL; } lpstmt->fNeedData = FALSE; lpstmt->idxParameter = NO_SQLNODE; lpstmt->cbParameterOffset = -1; } /* Otherwise, set flag so statement will be discarded in SQLFreeStmt() */ else { lpstmt->fPreparedSql = FALSE; } return rc; } /***************************************************************************/ RETCODE SQL_API SQLNativeSql( HDBC hdbc, UCHAR FAR *szSqlStrIn, SDWORD cbSqlStrIn, UCHAR FAR *szSqlStr, SDWORD cbSqlStrMax, SDWORD FAR *pcbSqlStr) { LPDBC lpdbc; lpdbc = (LPDBC) hdbc; lpdbc->errcode = ERR_NOTSUPPORTED; return SQL_ERROR; } /***************************************************************************/ RETCODE SQL_API SQLParamData( HSTMT hstmt, PTR FAR *prgbValue) { LPSTMT lpstmt; LPSQLNODE lpSqlNode; LPSQLNODE lpSqlNodeParameter; LPPARAMETER lpParameter; /* Get handle */ lpstmt = (LPSTMT) hstmt; lpstmt->errcode = ERR_SUCCESS; //To make guarentee Ole is initialized per thread COleInitializationManager myOleManager; MyImpersonator im (lpstmt, "SQLParamData"); /* Error if no more parameters to return */ if (!(lpstmt->fNeedData)) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } /* Error if data was not provided for the previous parameter */ if (lpstmt->cbParameterOffset == -1) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } /* Point at next parameter */ if (lpstmt->idxParameter == NO_SQLNODE) { lpSqlNode = ToNode(lpstmt->lpSqlStmt, ROOT_SQLNODE); lpstmt->idxParameter = lpSqlNode->node.root.parameters; } else { lpSqlNodeParameter = ToNode(lpstmt->lpSqlStmt, lpstmt->idxParameter); lpstmt->idxParameter = lpSqlNodeParameter->node.parameter.Next; } /* Skip over all parameters that are not SQL_DATA_AT_EXEC */ while (TRUE) { if (lpstmt->idxParameter == NO_SQLNODE) { /* If no more paramaeters, execute the query now */ lpstmt->fNeedData = FALSE; lpstmt->cbParameterOffset = -1; lpstmt->errcode = ExecuteQuery(lpstmt, NULL); /* If an SQLExecDirect() on something other than a SELECT, get */ /* rid of prepared statement */ if ((lpstmt->fStmtType != STMT_TYPE_SELECT) && !lpstmt->fPreparedSql) { FreeTree(lpstmt->lpSqlStmt); lpstmt->lpSqlStmt = NULL; } /* Leave */ if ((lpstmt->errcode == ERR_DATATRUNCATED) || (lpstmt->errcode == ERR_DDLIGNORED) || (lpstmt->errcode == ERR_DDLCAUSEDACOMMIT)) return SQL_SUCCESS_WITH_INFO; if (lpstmt->errcode != ERR_SUCCESS) return SQL_ERROR; return SQL_SUCCESS; } lpSqlNodeParameter = ToNode(lpstmt->lpSqlStmt, lpstmt->idxParameter); if (lpSqlNodeParameter->node.parameter.AtExec) break; lpstmt->idxParameter = lpSqlNodeParameter->node.parameter.Next; } /* Find the parameter definition (create by SQLBindParameter) */ for (lpParameter = lpstmt->lpParameter; lpParameter != NULL; lpParameter = lpParameter->lpNext) { if (lpParameter->ipar == lpSqlNodeParameter->node.parameter.Id) break; } if (lpParameter == NULL) { lpstmt->errcode = ERR_INTERNAL; return SQL_ERROR; } /* Return rgbValue */ if (prgbValue != NULL) *prgbValue = lpParameter->rgbValue; lpstmt->cbParameterOffset = -1; return SQL_NEED_DATA; } /***************************************************************************/ RETCODE SQL_API SQLPutData( HSTMT hstmt, PTR rgbValue, SDWORD cbValue) { LPSTMT lpstmt; LPSQLNODE lpSqlNodeParameter; LPPARAMETER lpParameter; /* Get handle */ lpstmt = (LPSTMT) hstmt; lpstmt->errcode = ERR_SUCCESS; //To make guarentee Ole is initialized per thread COleInitializationManager myOleManager; MyImpersonator im (lpstmt, "SQLPutData"); /* Error if no parameter value needed */ if (!(lpstmt->fNeedData) || (lpstmt->idxParameter == NO_SQLNODE)) { lpstmt->errcode = ERR_CURSORSTATE; return SQL_ERROR; } /* Find the parameter definition (create by SQLBindParameter) */ lpSqlNodeParameter = ToNode(lpstmt->lpSqlStmt, lpstmt->idxParameter); for (lpParameter = lpstmt->lpParameter; lpParameter != NULL; lpParameter = lpParameter->lpNext) { if (lpParameter->ipar == lpSqlNodeParameter->node.parameter.Id) break; } if (lpParameter == NULL) { lpstmt->errcode = ERR_INTERNAL; return SQL_ERROR; } /* Save the value */ if (lpstmt->cbParameterOffset == -1) lpstmt->cbParameterOffset = 0; lpstmt->errcode = SetParameterValue(lpstmt, lpSqlNodeParameter, &(lpstmt->cbParameterOffset), lpParameter->fCType, rgbValue, cbValue); if (lpstmt->errcode == ERR_DATATRUNCATED) return SQL_SUCCESS_WITH_INFO; else if (lpstmt->errcode != ERR_SUCCESS) { lpstmt->fNeedData = FALSE; lpstmt->idxParameter = NO_SQLNODE; return SQL_ERROR; } return SQL_SUCCESS; } /***************************************************************************/ RETCODE SQL_API SQLCancel( HSTMT hstmt) { return SQLFreeStmt(hstmt, SQL_CLOSE); } /***************************************************************************/