X-Git-Url: http://git.cyclocoop.org/%24dirpuce/puce%24spip_lang_rtl.gif?a=blobdiff_plain;f=includes%2Flibs%2Frdbms%2Fdatabase%2FDatabaseMssql.php;h=4c187f2357fecf4379860b637ab069fd77c33f5a;hb=3975e04cf4d14d92bdb95d144f7258205df4efb5;hp=773e548d87277d3c9dedb3b70ef1a5b8f4610576;hpb=8d68145a16c3bdf1c42dec80b4294592bfd09af0;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php index 773e548d87..4c187f2357 100644 --- a/includes/libs/rdbms/database/DatabaseMssql.php +++ b/includes/libs/rdbms/database/DatabaseMssql.php @@ -359,6 +359,28 @@ class DatabaseMssql extends Database { } } + protected function wasKnownStatementRollbackError() { + $errors = sqlsrv_errors( SQLSRV_ERR_ALL ); + if ( !$errors ) { + return false; + } + // The transaction vs statement rollback behavior depends on XACT_ABORT, so make sure + // that the "statement has been terminated" error (3621) is specifically present. + // https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql + $statementOnly = false; + $codeWhitelist = [ '2601', '2627', '547' ]; + foreach ( $errors as $error ) { + if ( $error['code'] == '3621' ) { + $statementOnly = true; + } elseif ( !in_array( $error['code'], $codeWhitelist ) ) { + $statementOnly = false; + break; + } + } + + return $statementOnly; + } + /** * @return int */