diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2018-12-16 13:53:48 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2018-12-16 13:54:52 -0600 |
| commit | 7d813eaad8eaca04a687d1bb942316232d1c54fd (patch) | |
| tree | 8f5adb9da22b1f9fb79892fb6cf2de23fac32c71 /src/ca/scaexec.cpp | |
| parent | 1b7a9d3734119e658c91ebd9742ab5a3ce94cce4 (diff) | |
| download | wix-7d813eaad8eaca04a687d1bb942316232d1c54fd.tar.gz wix-7d813eaad8eaca04a687d1bb942316232d1c54fd.tar.bz2 wix-7d813eaad8eaca04a687d1bb942316232d1c54fd.zip | |
Import implementation of SqlCA from old repo's scasched/scaexec.
Diffstat (limited to 'src/ca/scaexec.cpp')
| -rw-r--r-- | src/ca/scaexec.cpp | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/src/ca/scaexec.cpp b/src/ca/scaexec.cpp new file mode 100644 index 00000000..7a30f52a --- /dev/null +++ b/src/ca/scaexec.cpp | |||
| @@ -0,0 +1,393 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | |||
| 6 | /******************************************************************** | ||
| 7 | * CreateDatabase - CUSTOM ACTION ENTRY POINT for creating databases | ||
| 8 | * | ||
| 9 | * Input: deferred CustomActionData - DbKey\tServer\tInstance\tDatabase\tAttributes\tIntegratedAuth\tUser\tPassword | ||
| 10 | * ****************************************************************/ | ||
| 11 | extern "C" UINT __stdcall CreateDatabase(MSIHANDLE hInstall) | ||
| 12 | { | ||
| 13 | //AssertSz(FALSE, "debug CreateDatabase here"); | ||
| 14 | UINT er = ERROR_SUCCESS; | ||
| 15 | HRESULT hr = S_OK; | ||
| 16 | |||
| 17 | LPWSTR pwzData = NULL; | ||
| 18 | IDBCreateSession* pidbSession = NULL; | ||
| 19 | BSTR bstrErrorDescription = NULL; | ||
| 20 | LPWSTR pwz = NULL; | ||
| 21 | LPWSTR pwzDatabaseKey = NULL; | ||
| 22 | LPWSTR pwzServer = NULL; | ||
| 23 | LPWSTR pwzInstance = NULL; | ||
| 24 | LPWSTR pwzDatabase = NULL; | ||
| 25 | LPWSTR pwzTemp = NULL; | ||
| 26 | int iAttributes; | ||
| 27 | BOOL fIntegratedAuth; | ||
| 28 | LPWSTR pwzUser = NULL; | ||
| 29 | LPWSTR pwzPassword = NULL; | ||
| 30 | BOOL fHaveDbFileSpec = FALSE; | ||
| 31 | SQL_FILESPEC sfDb; | ||
| 32 | BOOL fHaveLogFileSpec = FALSE; | ||
| 33 | SQL_FILESPEC sfLog; | ||
| 34 | BOOL fInitializedCom = FALSE; | ||
| 35 | |||
| 36 | memset(&sfDb, 0, sizeof(sfDb)); | ||
| 37 | memset(&sfLog, 0, sizeof(sfLog)); | ||
| 38 | |||
| 39 | hr = WcaInitialize(hInstall, "CreateDatabase"); | ||
| 40 | ExitOnFailure(hr, "failed to initialize"); | ||
| 41 | |||
| 42 | hr = ::CoInitialize(NULL); | ||
| 43 | ExitOnFailure(hr, "failed to intialize COM"); | ||
| 44 | fInitializedCom = TRUE; | ||
| 45 | |||
| 46 | hr = WcaGetProperty( L"CustomActionData", &pwzData); | ||
| 47 | ExitOnFailure(hr, "failed to get CustomActionData"); | ||
| 48 | |||
| 49 | WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData); | ||
| 50 | |||
| 51 | pwz = pwzData; | ||
| 52 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabaseKey); // SQL Server | ||
| 53 | ExitOnFailure(hr, "failed to read database key from custom action data: %ls", pwz); | ||
| 54 | hr = WcaReadStringFromCaData(&pwz, &pwzServer); // SQL Server | ||
| 55 | ExitOnFailure(hr, "failed to read server from custom action data: %ls", pwz); | ||
| 56 | hr = WcaReadStringFromCaData(&pwz, &pwzInstance); // SQL Server Instance | ||
| 57 | ExitOnFailure(hr, "failed to read server instance from custom action data: %ls", pwz); | ||
| 58 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabase); // SQL Database | ||
| 59 | ExitOnFailure(hr, "failed to read server instance from custom action data: %ls", pwz); | ||
| 60 | hr = WcaReadIntegerFromCaData(&pwz, &iAttributes); | ||
| 61 | ExitOnFailure(hr, "failed to read attributes from custom action data: %ls", pwz); | ||
| 62 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fIntegratedAuth)); // Integrated Windows Authentication? | ||
| 63 | ExitOnFailure(hr, "failed to read integrated auth flag from custom action data: %ls", pwz); | ||
| 64 | hr = WcaReadStringFromCaData(&pwz, &pwzUser); // SQL User | ||
| 65 | ExitOnFailure(hr, "failed to read user from custom action data: %ls", pwz); | ||
| 66 | hr = WcaReadStringFromCaData(&pwz, &pwzPassword); // SQL User Password | ||
| 67 | ExitOnFailure(hr, "failed to read user from custom action data: %ls", pwz); | ||
| 68 | |||
| 69 | // db file spec | ||
| 70 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fHaveDbFileSpec)); | ||
| 71 | ExitOnFailure(hr, "failed to read db file spec from custom action data: %ls", pwz); | ||
| 72 | |||
| 73 | if (fHaveDbFileSpec) | ||
| 74 | { | ||
| 75 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 76 | ExitOnFailure(hr, "failed to read db file spec name from custom action data: %ls", pwz); | ||
| 77 | hr = ::StringCchCopyW(sfDb.wzName, countof(sfDb.wzName), pwzTemp); | ||
| 78 | ExitOnFailure(hr, "failed to copy db file spec name: %ls", pwzTemp); | ||
| 79 | |||
| 80 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 81 | ExitOnFailure(hr, "failed to read db file spec filename from custom action data: %ls", pwz); | ||
| 82 | hr = ::StringCchCopyW(sfDb.wzFilename, countof(sfDb.wzFilename), pwzTemp); | ||
| 83 | ExitOnFailure(hr, "failed to copy db file spec filename: %ls", pwzTemp); | ||
| 84 | |||
| 85 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 86 | ExitOnFailure(hr, "failed to read db file spec size from custom action data: %ls", pwz); | ||
| 87 | hr = ::StringCchCopyW(sfDb.wzSize, countof(sfDb.wzSize), pwzTemp); | ||
| 88 | ExitOnFailure(hr, "failed to copy db file spec size value: %ls", pwzTemp); | ||
| 89 | |||
| 90 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 91 | ExitOnFailure(hr, "failed to read db file spec max size from custom action data: %ls", pwz); | ||
| 92 | hr = ::StringCchCopyW(sfDb.wzMaxSize, countof(sfDb.wzMaxSize), pwzTemp); | ||
| 93 | ExitOnFailure(hr, "failed to copy db file spec max size: %ls", pwzTemp); | ||
| 94 | |||
| 95 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 96 | ExitOnFailure(hr, "failed to read db file spec grow from custom action data: %ls", pwz); | ||
| 97 | hr = ::StringCchCopyW(sfDb.wzGrow, countof(sfDb.wzGrow), pwzTemp); | ||
| 98 | ExitOnFailure(hr, "failed to copy db file spec grow value: %ls", pwzTemp); | ||
| 99 | } | ||
| 100 | |||
| 101 | // log file spec | ||
| 102 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fHaveLogFileSpec)); | ||
| 103 | ExitOnFailure(hr, "failed to read log file spec from custom action data: %ls", pwz); | ||
| 104 | if (fHaveLogFileSpec) | ||
| 105 | { | ||
| 106 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 107 | ExitOnFailure(hr, "failed to read log file spec name from custom action data: %ls", pwz); | ||
| 108 | hr = ::StringCchCopyW(sfLog.wzName, countof(sfDb.wzName), pwzTemp); | ||
| 109 | ExitOnFailure(hr, "failed to copy log file spec name: %ls", pwzTemp); | ||
| 110 | |||
| 111 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 112 | ExitOnFailure(hr, "failed to read log file spec filename from custom action data: %ls", pwz); | ||
| 113 | hr = ::StringCchCopyW(sfLog.wzFilename, countof(sfDb.wzFilename), pwzTemp); | ||
| 114 | ExitOnFailure(hr, "failed to copy log file spec filename: %ls", pwzTemp); | ||
| 115 | |||
| 116 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 117 | ExitOnFailure(hr, "failed to read log file spec size from custom action data: %ls", pwz); | ||
| 118 | hr = ::StringCchCopyW(sfLog.wzSize, countof(sfDb.wzSize), pwzTemp); | ||
| 119 | ExitOnFailure(hr, "failed to copy log file spec size value: %ls", pwzTemp); | ||
| 120 | |||
| 121 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 122 | ExitOnFailure(hr, "failed to read log file spec max size from custom action data: %ls", pwz); | ||
| 123 | hr = ::StringCchCopyW(sfLog.wzMaxSize, countof(sfDb.wzMaxSize), pwzTemp); | ||
| 124 | ExitOnFailure(hr, "failed to copy log file spec max size: %ls", pwzTemp); | ||
| 125 | |||
| 126 | hr = WcaReadStringFromCaData(&pwz, &pwzTemp); | ||
| 127 | ExitOnFailure(hr, "failed to read log file spec grow from custom action data: %ls", pwz); | ||
| 128 | hr = ::StringCchCopyW(sfLog.wzGrow, countof(sfDb.wzGrow), pwzTemp); | ||
| 129 | ExitOnFailure(hr, "failed to copy log file spec grow value: %ls", pwzTemp); | ||
| 130 | } | ||
| 131 | |||
| 132 | if (iAttributes & SCADB_CONFIRM_OVERWRITE) | ||
| 133 | { | ||
| 134 | // Check if the database already exists | ||
| 135 | hr = SqlDatabaseExists(pwzServer, pwzInstance, pwzDatabase, fIntegratedAuth, pwzUser, pwzPassword, &bstrErrorDescription); | ||
| 136 | MessageExitOnFailure(hr, msierrSQLFailedCreateDatabase, "failed to check if database exists: '%ls', error: %ls", pwzDatabase, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription); | ||
| 137 | |||
| 138 | if (S_OK == hr) // found an existing database, confirm that they don't want to stop before it gets trampled, in no UI case just continue anyways | ||
| 139 | { | ||
| 140 | hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS); | ||
| 141 | if (IDNO == WcaErrorMessage(msierrSQLDatabaseAlreadyExists, hr, MB_YESNO, 1, pwzDatabase)) | ||
| 142 | ExitOnFailure(hr, "failed to initialize"); | ||
| 143 | } | ||
| 144 | } | ||
| 145 | |||
| 146 | hr = SqlDatabaseEnsureExists(pwzServer, pwzInstance, pwzDatabase, fIntegratedAuth, pwzUser, pwzPassword, fHaveDbFileSpec ? &sfDb : NULL, fHaveLogFileSpec ? &sfLog : NULL, &bstrErrorDescription); | ||
| 147 | if ((iAttributes & SCADB_CONTINUE_ON_ERROR) && FAILED(hr)) | ||
| 148 | { | ||
| 149 | WcaLog(LOGMSG_STANDARD, "Error 0x%x: failed to create SQL database but continuing, error: %ls, Database: %ls", hr, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription, pwzDatabase); | ||
| 150 | hr = S_OK; | ||
| 151 | } | ||
| 152 | MessageExitOnFailure(hr, msierrSQLFailedCreateDatabase, "failed to create to database: '%ls', error: %ls", pwzDatabase, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription); | ||
| 153 | |||
| 154 | hr = WcaProgressMessage(COST_SQL_CONNECTDB, FALSE); | ||
| 155 | LExit: | ||
| 156 | ReleaseStr(pwzDatabaseKey); | ||
| 157 | ReleaseStr(pwzServer); | ||
| 158 | ReleaseStr(pwzInstance); | ||
| 159 | ReleaseStr(pwzDatabase); | ||
| 160 | ReleaseStr(pwzUser); | ||
| 161 | ReleaseStr(pwzPassword); | ||
| 162 | ReleaseObject(pidbSession); | ||
| 163 | ReleaseBSTR(bstrErrorDescription); | ||
| 164 | |||
| 165 | if (fInitializedCom) | ||
| 166 | { | ||
| 167 | ::CoUninitialize(); | ||
| 168 | } | ||
| 169 | |||
| 170 | if (FAILED(hr)) | ||
| 171 | { | ||
| 172 | er = ERROR_INSTALL_FAILURE; | ||
| 173 | } | ||
| 174 | return WcaFinalize(er); | ||
| 175 | } | ||
| 176 | |||
| 177 | |||
| 178 | /******************************************************************** | ||
| 179 | DropDatabase - CUSTOM ACTION ENTRY POINT for removing databases | ||
| 180 | |||
| 181 | Input: deferred CustomActionData - DbKey\tServer\tInstance\tDatabase\tAttributes\tIntegratedAuth\tUser\tPassword | ||
| 182 | * ****************************************************************/ | ||
| 183 | extern "C" UINT __stdcall DropDatabase(MSIHANDLE hInstall) | ||
| 184 | { | ||
| 185 | //Assert(FALSE); | ||
| 186 | UINT er = ERROR_SUCCESS; | ||
| 187 | HRESULT hr = S_OK; | ||
| 188 | |||
| 189 | LPWSTR pwzData = NULL; | ||
| 190 | IDBCreateSession* pidbSession = NULL; | ||
| 191 | BSTR bstrErrorDescription = NULL; | ||
| 192 | LPWSTR pwz = NULL; | ||
| 193 | LPWSTR pwzDatabaseKey = NULL; | ||
| 194 | LPWSTR pwzServer = NULL; | ||
| 195 | LPWSTR pwzInstance = NULL; | ||
| 196 | LPWSTR pwzDatabase = NULL; | ||
| 197 | long lAttributes; | ||
| 198 | BOOL fIntegratedAuth; | ||
| 199 | LPWSTR pwzUser = NULL; | ||
| 200 | LPWSTR pwzPassword = NULL; | ||
| 201 | BOOL fInitializedCom = TRUE; | ||
| 202 | |||
| 203 | hr = WcaInitialize(hInstall, "DropDatabase"); | ||
| 204 | ExitOnFailure(hr, "failed to initialize"); | ||
| 205 | |||
| 206 | hr = ::CoInitialize(NULL); | ||
| 207 | ExitOnFailure(hr, "failed to intialize COM"); | ||
| 208 | fInitializedCom = TRUE; | ||
| 209 | |||
| 210 | hr = WcaGetProperty( L"CustomActionData", &pwzData); | ||
| 211 | ExitOnFailure(hr, "failed to get CustomActionData"); | ||
| 212 | |||
| 213 | WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData); | ||
| 214 | |||
| 215 | pwz = pwzData; | ||
| 216 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabaseKey); | ||
| 217 | ExitOnFailure(hr, "failed to read database key"); | ||
| 218 | hr = WcaReadStringFromCaData(&pwz, &pwzServer); | ||
| 219 | ExitOnFailure(hr, "failed to read server"); | ||
| 220 | hr = WcaReadStringFromCaData(&pwz, &pwzInstance); | ||
| 221 | ExitOnFailure(hr, "failed to read instance"); | ||
| 222 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabase); | ||
| 223 | ExitOnFailure(hr, "failed to read database"); | ||
| 224 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&lAttributes)); | ||
| 225 | ExitOnFailure(hr, "failed to read attributes"); | ||
| 226 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fIntegratedAuth)); // Integrated Windows Authentication? | ||
| 227 | ExitOnFailure(hr, "failed to read integrated auth flag"); | ||
| 228 | hr = WcaReadStringFromCaData(&pwz, &pwzUser); | ||
| 229 | ExitOnFailure(hr, "failed to read user"); | ||
| 230 | hr = WcaReadStringFromCaData(&pwz, &pwzPassword); | ||
| 231 | ExitOnFailure(hr, "failed to read password"); | ||
| 232 | |||
| 233 | hr = SqlDropDatabase(pwzServer, pwzInstance, pwzDatabase, fIntegratedAuth, pwzUser, pwzPassword, &bstrErrorDescription); | ||
| 234 | if ((lAttributes & SCADB_CONTINUE_ON_ERROR) && FAILED(hr)) | ||
| 235 | { | ||
| 236 | WcaLog(LOGMSG_STANDARD, "Error 0x%x: failed to drop SQL database but continuing, error: %ls, Database: %ls", hr, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription, pwzDatabase); | ||
| 237 | hr = S_OK; | ||
| 238 | } | ||
| 239 | MessageExitOnFailure(hr, msierrSQLFailedDropDatabase, "failed to drop to database: '%ls', error: %ls", pwzDatabase, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription); | ||
| 240 | |||
| 241 | hr = WcaProgressMessage(COST_SQL_CONNECTDB, FALSE); | ||
| 242 | |||
| 243 | LExit: | ||
| 244 | ReleaseStr(pwzDatabaseKey); | ||
| 245 | ReleaseStr(pwzServer); | ||
| 246 | ReleaseStr(pwzInstance); | ||
| 247 | ReleaseStr(pwzDatabase); | ||
| 248 | ReleaseStr(pwzUser); | ||
| 249 | ReleaseStr(pwzPassword); | ||
| 250 | ReleaseStr(pwzData); | ||
| 251 | ReleaseObject(pidbSession); | ||
| 252 | ReleaseBSTR(bstrErrorDescription); | ||
| 253 | |||
| 254 | if (fInitializedCom) | ||
| 255 | { | ||
| 256 | ::CoUninitialize(); | ||
| 257 | } | ||
| 258 | |||
| 259 | if (FAILED(hr)) | ||
| 260 | { | ||
| 261 | er = ERROR_INSTALL_FAILURE; | ||
| 262 | } | ||
| 263 | return WcaFinalize(er); | ||
| 264 | } | ||
| 265 | |||
| 266 | |||
| 267 | /******************************************************************** | ||
| 268 | ExecuteSqlStrings - CUSTOM ACTION ENTRY POINT for running SQL strings | ||
| 269 | |||
| 270 | Input: deferred CustomActionData - DbKey\tServer\tInstance\tDatabase\tAttributes\tIntegratedAuth\tUser\tPassword\tSQLKey1\tSQLString1\tSQLKey2\tSQLString2\tSQLKey3\tSQLString3\t... | ||
| 271 | rollback CustomActionData - same as above | ||
| 272 | * ****************************************************************/ | ||
| 273 | extern "C" UINT __stdcall ExecuteSqlStrings(MSIHANDLE hInstall) | ||
| 274 | { | ||
| 275 | //Assert(FALSE); | ||
| 276 | UINT er = ERROR_SUCCESS; | ||
| 277 | HRESULT hr = S_OK; | ||
| 278 | HRESULT hrDB = S_OK; | ||
| 279 | |||
| 280 | LPWSTR pwzData = NULL; | ||
| 281 | IDBCreateSession* pidbSession = NULL; | ||
| 282 | BSTR bstrErrorDescription = NULL; | ||
| 283 | |||
| 284 | LPWSTR pwz = NULL; | ||
| 285 | LPWSTR pwzDatabaseKey = NULL; | ||
| 286 | LPWSTR pwzServer = NULL; | ||
| 287 | LPWSTR pwzInstance = NULL; | ||
| 288 | LPWSTR pwzDatabase = NULL; | ||
| 289 | int iAttributesDB; | ||
| 290 | int iAttributesSQL; | ||
| 291 | BOOL fIntegratedAuth; | ||
| 292 | LPWSTR pwzUser = NULL; | ||
| 293 | LPWSTR pwzPassword = NULL; | ||
| 294 | LPWSTR pwzSqlKey = NULL; | ||
| 295 | LPWSTR pwzSql = NULL; | ||
| 296 | BOOL fInitializedCom = FALSE; | ||
| 297 | |||
| 298 | hr = WcaInitialize(hInstall, "ExecuteSqlStrings"); | ||
| 299 | ExitOnFailure(hr, "failed to initialize"); | ||
| 300 | |||
| 301 | hr = ::CoInitialize(NULL); | ||
| 302 | ExitOnFailure(hr, "failed to intialize COM"); | ||
| 303 | fInitializedCom = TRUE; | ||
| 304 | |||
| 305 | hr = WcaGetProperty( L"CustomActionData", &pwzData); | ||
| 306 | ExitOnFailure(hr, "failed to get CustomActionData"); | ||
| 307 | |||
| 308 | WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzData); | ||
| 309 | |||
| 310 | pwz = pwzData; | ||
| 311 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabaseKey); | ||
| 312 | ExitOnFailure(hr, "failed to read database key"); | ||
| 313 | hr = WcaReadStringFromCaData(&pwz, &pwzServer); | ||
| 314 | ExitOnFailure(hr, "failed to read server"); | ||
| 315 | hr = WcaReadStringFromCaData(&pwz, &pwzInstance); | ||
| 316 | ExitOnFailure(hr, "failed to read instance"); | ||
| 317 | hr = WcaReadStringFromCaData(&pwz, &pwzDatabase); | ||
| 318 | ExitOnFailure(hr, "failed to read database"); | ||
| 319 | hr = WcaReadIntegerFromCaData(&pwz, &iAttributesDB); | ||
| 320 | ExitOnFailure(hr, "failed to read attributes"); | ||
| 321 | hr = WcaReadIntegerFromCaData(&pwz, reinterpret_cast<int *>(&fIntegratedAuth)); // Integrated Windows Authentication? | ||
| 322 | ExitOnFailure(hr, "failed to read integrated auth flag"); | ||
| 323 | hr = WcaReadStringFromCaData(&pwz, &pwzUser); | ||
| 324 | ExitOnFailure(hr, "failed to read user"); | ||
| 325 | hr = WcaReadStringFromCaData(&pwz, &pwzPassword); | ||
| 326 | ExitOnFailure(hr, "failed to read password"); | ||
| 327 | |||
| 328 | // Store off the result of the connect, only exit if we don't care if the database connection succeeds | ||
| 329 | // Wait to fail until later to see if we actually have work to do that is not set to continue on error | ||
| 330 | hrDB = SqlConnectDatabase(pwzServer, pwzInstance, pwzDatabase, fIntegratedAuth, pwzUser, pwzPassword, &pidbSession); | ||
| 331 | if ((iAttributesDB & SCADB_CONTINUE_ON_ERROR) && FAILED(hrDB)) | ||
| 332 | { | ||
| 333 | WcaLog(LOGMSG_STANDARD, "Error 0x%x: continuing after failure to connect to database: %ls", hrDB, pwzDatabase); | ||
| 334 | ExitFunction1(hr = S_OK); | ||
| 335 | } | ||
| 336 | |||
| 337 | while (S_OK == hr && S_OK == (hr = WcaReadStringFromCaData(&pwz, &pwzSqlKey))) | ||
| 338 | { | ||
| 339 | hr = WcaReadIntegerFromCaData(&pwz, &iAttributesSQL); | ||
| 340 | ExitOnFailure(hr, "failed to read attributes for SQL string: %ls", pwzSqlKey); | ||
| 341 | |||
| 342 | hr = WcaReadStringFromCaData(&pwz, &pwzSql); | ||
| 343 | ExitOnFailure(hr, "failed to read SQL string for key: %ls", pwzSqlKey); | ||
| 344 | |||
| 345 | // If the SqlString row is set to continue on error and the DB connection failed, skip attempting to execute | ||
| 346 | if ((iAttributesSQL & SCASQL_CONTINUE_ON_ERROR) && FAILED(hrDB)) | ||
| 347 | { | ||
| 348 | WcaLog(LOGMSG_STANDARD, "Error 0x%x: continuing after failure to connect to database: %ls", hrDB, pwzDatabase); | ||
| 349 | continue; | ||
| 350 | } | ||
| 351 | |||
| 352 | // Now check if the DB connection succeeded | ||
| 353 | MessageExitOnFailure(hr = hrDB, msierrSQLFailedConnectDatabase, "failed to connect to database: '%ls'", pwzDatabase); | ||
| 354 | |||
| 355 | WcaLog(LOGMSG_VERBOSE, "Executing SQL string: %ls", pwzSql); | ||
| 356 | hr = SqlSessionExecuteQuery(pidbSession, pwzSql, NULL, NULL, &bstrErrorDescription); | ||
| 357 | if ((iAttributesSQL & SCASQL_CONTINUE_ON_ERROR) && FAILED(hr)) | ||
| 358 | { | ||
| 359 | WcaLog(LOGMSG_STANDARD, "Error 0x%x: failed to execute SQL string but continuing, error: %ls, SQL key: %ls SQL string: %ls", hr, NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription, pwzSqlKey, pwzSql); | ||
| 360 | hr = S_OK; | ||
| 361 | } | ||
| 362 | MessageExitOnFailure(hr, msierrSQLFailedExecString, "failed to execute SQL string, error: %ls, SQL key: %ls SQL string: %ls", NULL == bstrErrorDescription ? L"unknown error" : bstrErrorDescription, pwzSqlKey, pwzSql); | ||
| 363 | |||
| 364 | WcaProgressMessage(COST_SQL_STRING, FALSE); | ||
| 365 | } | ||
| 366 | if (E_NOMOREITEMS == hr) | ||
| 367 | { | ||
| 368 | hr = S_OK; | ||
| 369 | } | ||
| 370 | |||
| 371 | LExit: | ||
| 372 | ReleaseStr(pwzDatabaseKey); | ||
| 373 | ReleaseStr(pwzServer); | ||
| 374 | ReleaseStr(pwzInstance); | ||
| 375 | ReleaseStr(pwzDatabase); | ||
| 376 | ReleaseStr(pwzUser); | ||
| 377 | ReleaseStr(pwzPassword); | ||
| 378 | ReleaseStr(pwzData); | ||
| 379 | |||
| 380 | ReleaseBSTR(bstrErrorDescription); | ||
| 381 | ReleaseObject(pidbSession); | ||
| 382 | |||
| 383 | if (fInitializedCom) | ||
| 384 | { | ||
| 385 | ::CoUninitialize(); | ||
| 386 | } | ||
| 387 | |||
| 388 | if (FAILED(hr)) | ||
| 389 | { | ||
| 390 | er = ERROR_INSTALL_FAILURE; | ||
| 391 | } | ||
| 392 | return WcaFinalize(er); | ||
| 393 | } | ||
