예제 #1
0
    public async Task CreateDropDatabaseUsingTrustedAuth()
    {
        if (!EnsureWireCrypt(FbWireCrypt.Disabled))
        {
            return;
        }
        if (!EnsureServerType(FbServerType.Default))
        {
            return;
        }

        if (ServerVersion >= new Version(3, 0, 0, 0))
        {
            await using (var cmd = Connection.CreateCommand())
            {
                cmd.CommandText = "create or alter global mapping admin_trusted_auth using plugin win_sspi from any user to role rdb$admin";
                await cmd.ExecuteNonQueryAsync();
            }
        }
        try
        {
            var csb = BuildConnectionStringBuilder(ServerType, Compression, WireCrypt);
            csb.UserID   = string.Empty;
            csb.Password = string.Empty;
            csb.Database = $"{Guid.NewGuid()}.fdb";
            var cs = csb.ToString();
            Assert.DoesNotThrowAsync(() => FbConnection.CreateDatabaseAsync(cs, overwrite: true));
            Assert.DoesNotThrowAsync(() => FbConnection.DropDatabaseAsync(cs));
        }
        finally
        {
            if (ServerVersion >= new Version(3, 0, 0, 0))
            {
                await using (var cmd = Connection.CreateCommand())
                {
                    cmd.CommandText = "drop global mapping admin_trusted_auth";
                    await cmd.ExecuteNonQueryAsync();
                }
            }
        }
    }
예제 #2
0
        /// <summary>
        /// Starts the ordered execution of the SQL statements that are in <see cref="SqlStatements"/> collection.
        /// </summary>
        /// <param name="autoCommit">Specifies if the transaction should be committed after a DDL command execution</param>
        public async Task ExecuteAsync(bool autoCommit = true, CancellationToken cancellationToken = default)
        {
            if ((_statements?.Count ?? 0) == 0)
            {
                throw new InvalidOperationException("There are no commands for execution.");
            }

            _shouldClose = false;

            foreach (var statement in Statements)
            {
                if (!(statement.StatementType == SqlStatementType.Connect ||
                      statement.StatementType == SqlStatementType.CreateDatabase ||
                      statement.StatementType == SqlStatementType.Disconnect ||
                      statement.StatementType == SqlStatementType.DropDatabase ||
                      statement.StatementType == SqlStatementType.SetAutoDDL ||
                      statement.StatementType == SqlStatementType.SetDatabase ||
                      statement.StatementType == SqlStatementType.SetNames ||
                      statement.StatementType == SqlStatementType.SetSQLDialect))
                {
                    await ProvideCommandAsync(cancellationToken).ConfigureAwait(false);

                    _sqlCommand.CommandText = statement.Text;
                    if (_sqlTransaction == null && !(statement.StatementType == SqlStatementType.Commit || statement.StatementType == SqlStatementType.Rollback))
                    {
                        _sqlTransaction = await _sqlConnection.BeginTransactionAsync(FbTransaction.DefaultIsolationLevel, null, cancellationToken).ConfigureAwait(false);
                    }
                    _sqlCommand.Transaction = _sqlTransaction;
                }

                try
                {
                    switch (statement.StatementType)
                    {
                    case SqlStatementType.AlterCharacterSet:
                    case SqlStatementType.AlterDatabase:
                    case SqlStatementType.AlterDomain:
                    case SqlStatementType.AlterException:
                    case SqlStatementType.AlterFunction:
                    case SqlStatementType.AlterIndex:
                    case SqlStatementType.AlterPackage:
                    case SqlStatementType.AlterProcedure:
                    case SqlStatementType.AlterRole:
                    case SqlStatementType.AlterSequence:
                    case SqlStatementType.AlterTable:
                    case SqlStatementType.AlterTrigger:
                    case SqlStatementType.AlterView:
                    case SqlStatementType.CommentOn:
                    case SqlStatementType.CreateCollation:
                    case SqlStatementType.CreateDomain:
                    case SqlStatementType.CreateException:
                    case SqlStatementType.CreateFunction:
                    case SqlStatementType.CreateGenerator:
                    case SqlStatementType.CreateIndex:
                    case SqlStatementType.CreatePackage:
                    case SqlStatementType.CreatePackageBody:
                    case SqlStatementType.CreateProcedure:
                    case SqlStatementType.CreateRole:
                    case SqlStatementType.CreateSequence:
                    case SqlStatementType.CreateShadow:
                    case SqlStatementType.CreateTable:
                    case SqlStatementType.CreateTrigger:
                    case SqlStatementType.CreateView:
                    case SqlStatementType.DeclareCursor:
                    case SqlStatementType.DeclareExternalFunction:
                    case SqlStatementType.DeclareFilter:
                    case SqlStatementType.DeclareStatement:
                    case SqlStatementType.DeclareTable:
                    case SqlStatementType.Delete:
                    case SqlStatementType.DropCollation:
                    case SqlStatementType.DropDomain:
                    case SqlStatementType.DropException:
                    case SqlStatementType.DropExternalFunction:
                    case SqlStatementType.DropFunction:
                    case SqlStatementType.DropFilter:
                    case SqlStatementType.DropGenerator:
                    case SqlStatementType.DropIndex:
                    case SqlStatementType.DropPackage:
                    case SqlStatementType.DropPackageBody:
                    case SqlStatementType.DropProcedure:
                    case SqlStatementType.DropSequence:
                    case SqlStatementType.DropRole:
                    case SqlStatementType.DropShadow:
                    case SqlStatementType.DropTable:
                    case SqlStatementType.DropTrigger:
                    case SqlStatementType.DropView:
                    case SqlStatementType.EventInit:
                    case SqlStatementType.EventWait:
                    case SqlStatementType.Execute:
                    case SqlStatementType.ExecuteImmediate:
                    case SqlStatementType.ExecuteProcedure:
                    case SqlStatementType.Grant:
                    case SqlStatementType.Insert:
                    case SqlStatementType.InsertCursor:
                    case SqlStatementType.Merge:
                    case SqlStatementType.Open:
                    case SqlStatementType.Prepare:
                    case SqlStatementType.Revoke:
                    case SqlStatementType.RecreateFunction:
                    case SqlStatementType.RecreatePackage:
                    case SqlStatementType.RecreatePackageBody:
                    case SqlStatementType.RecreateProcedure:
                    case SqlStatementType.RecreateTable:
                    case SqlStatementType.RecreateTrigger:
                    case SqlStatementType.RecreateView:
                    case SqlStatementType.SetGenerator:
                    case SqlStatementType.Update:
                    case SqlStatementType.Whenever:
                        OnCommandExecuting(_sqlCommand, statement.StatementType);

                        var rowsAffected = await ExecuteCommandAsync(autoCommit, cancellationToken).ConfigureAwait(false);

                        _requiresNewConnection = false;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, rowsAffected);
                        break;

                    case SqlStatementType.ExecuteBlock:
                    case SqlStatementType.Select:
                        (await ProvideCommandAsync(cancellationToken).ConfigureAwait(false)).CommandText = statement.Text;

                        OnCommandExecuting(_sqlCommand, statement.StatementType);

                        var dataReader = await _sqlCommand.ExecuteReaderAsync(CommandBehavior.Default, cancellationToken).ConfigureAwait(false);

                        try
                        {
                            _requiresNewConnection = false;

                            OnCommandExecuted(dataReader, statement.Text, statement.StatementType, -1);
                        }
                        finally
                        {
#if NET48 || NETSTANDARD2_0
                            dataReader.Dispose();
#else
                            await dataReader.DisposeAsync().ConfigureAwait(false);
#endif
                        }
                        break;

                    case SqlStatementType.Commit:
                        OnCommandExecuting(null, statement.StatementType);

                        await CommitTransactionAsync(cancellationToken).ConfigureAwait(false);

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.Rollback:
                        OnCommandExecuting(null, statement.StatementType);

                        await RollbackTransactionAsync(cancellationToken).ConfigureAwait(false);

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.CreateDatabase:
                        OnCommandExecuting(null, statement.StatementType);

                        await CreateDatabaseAsync(statement.CleanText, cancellationToken).ConfigureAwait(false);

                        _requiresNewConnection = false;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.DropDatabase:
                        OnCommandExecuting(null, statement.StatementType);

                        await FbConnection.DropDatabaseAsync(_connectionString.ToString(), cancellationToken).ConfigureAwait(false);

                        _requiresNewConnection = true;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.Connect:
                        OnCommandExecuting(null, statement.StatementType);

                        await ConnectToDatabaseAsync(statement.CleanText, cancellationToken).ConfigureAwait(false);

                        _requiresNewConnection = false;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.Disconnect:
                        OnCommandExecuting(null, statement.StatementType);

                        await _sqlConnection.CloseAsync().ConfigureAwait(false);

                        FbConnection.ClearPool(_sqlConnection);
                        _requiresNewConnection = false;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.SetAutoDDL:
                        OnCommandExecuting(null, statement.StatementType);

                        SetAutoDdl(statement.CleanText, ref autoCommit);
                        _requiresNewConnection = false;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.SetNames:
                        OnCommandExecuting(null, statement.StatementType);

                        SetNames(statement.CleanText);
                        _requiresNewConnection = true;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.SetSQLDialect:
                        OnCommandExecuting(null, statement.StatementType);

                        SetSqlDialect(statement.CleanText);
                        _requiresNewConnection = true;

                        OnCommandExecuted(null, statement.Text, statement.StatementType, -1);
                        break;

                    case SqlStatementType.Fetch:
                    case SqlStatementType.Describe:
                        break;

                    case SqlStatementType.SetDatabase:
                    case SqlStatementType.SetStatistics:
                    case SqlStatementType.SetTransaction:
                    case SqlStatementType.ShowSQLDialect:
                        throw new NotImplementedException();
                    }
                }
                catch (Exception ex)
                {
                    await DisposeCommandAsync(cancellationToken).ConfigureAwait(false);
                    await RollbackTransactionAsync(cancellationToken).ConfigureAwait(false);
                    await CloseConnectionAsync(cancellationToken).ConfigureAwait(false);

                    var message = string.Format("An exception was thrown when executing command: {1}.{0}Batch execution aborted.{0}The returned message was: {2}.",
                                                Environment.NewLine,
                                                statement.Text,
                                                ex.Message);
                    throw FbException.Create(message, ex);
                }
            }

            await DisposeCommandAsync(cancellationToken).ConfigureAwait(false);
            await CommitTransactionAsync(cancellationToken).ConfigureAwait(false);
            await CloseConnectionAsync(cancellationToken).ConfigureAwait(false);
        }
 public override Task DeleteAsync(CancellationToken cancellationToken = default)
 {
     FbConnection.ClearPool((FbConnection)_connection.DbConnection);
     return(FbConnection.DropDatabaseAsync(_connection.ConnectionString, cancellationToken));
 }