예제 #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();
                }
            }
        }
    }
        /// <summary>
        /// Parses the isql statement CREATE DATABASE and creates the database and opens a connection to the recently created database.
        /// </summary>
        /// <param name="createDatabaseStatement">The create database statement.</param>
        private async Task CreateDatabase(string createDatabaseStatement, AsyncWrappingCommonArgs async)
        {
            // CREATE {DATABASE | SCHEMA} 'filespec'
            // [USER 'username' [PASSWORD 'password']]
            // [PAGE_SIZE [=] int]
            // [LENGTH [=] int [PAGE[S]]]
            // [DEFAULT CHARACTER SET charset]
            // [<secondary_file>];
            var pageSize = 0;
            var parser   = new SqlStringParser(createDatabaseStatement);

            parser.Tokens = StandardParseTokens;
            using (var enumerator = parser.Parse().GetEnumerator())
            {
                enumerator.MoveNext();
                if (enumerator.Current.Text.ToUpperInvariant() != "CREATE")
                {
                    throw new ArgumentException("Malformed isql CREATE statement. Expected keyword CREATE but something else was found.");
                }
                enumerator.MoveNext();                 // {DATABASE | SCHEMA}
                enumerator.MoveNext();
                _connectionString.Database = enumerator.Current.Text.Replace("'", string.Empty);
                while (enumerator.MoveNext())
                {
                    switch (enumerator.Current.Text.ToUpperInvariant())
                    {
                    case "USER":
                        enumerator.MoveNext();
                        _connectionString.UserID = enumerator.Current.Text.Replace("'", string.Empty);
                        break;

                    case "PASSWORD":
                        enumerator.MoveNext();
                        _connectionString.Password = enumerator.Current.Text.Replace("'", string.Empty);
                        break;

                    case "PAGE_SIZE":
                        enumerator.MoveNext();
                        if (enumerator.Current.Text == "=")
                        {
                            enumerator.MoveNext();
                        }
                        int.TryParse(enumerator.Current.Text, out pageSize);
                        break;

                    case "DEFAULT":
                        enumerator.MoveNext();
                        if (enumerator.Current.Text.ToUpperInvariant() != "CHARACTER")
                        {
                            throw new ArgumentException("Expected the keyword CHARACTER but something else was found.");
                        }

                        enumerator.MoveNext();
                        if (enumerator.Current.Text.ToUpperInvariant() != "SET")
                        {
                            throw new ArgumentException("Expected the keyword SET but something else was found.");
                        }

                        enumerator.MoveNext();
                        _connectionString.Charset = enumerator.Current.Text;
                        break;
                    }
                }
            }
            await async.AsyncSyncCall((cs, ps, ct) => FbConnection.CreateDatabaseAsync(cs, pageSize: ps, cancellationToken: ct), (cs, ps) => FbConnection.CreateDatabase(cs, pageSize: ps), _connectionString.ToString(), pageSize).ConfigureAwait(false);

            _requiresNewConnection = true;
            await ProvideConnection(async).ConfigureAwait(false);
        }
 public override Task CreateAsync(CancellationToken cancellationToken = default)
 {
     return(FbConnection.CreateDatabaseAsync(_connection.ConnectionString, cancellationToken: cancellationToken));
 }