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)); }