Browse Source

The AdminCredentials, DefaultCredentials, SafeMode and SlaveOk properties of MongoServer are now read only (this is important because otherwise threads sharing a MongoServer instance could experience unexpected behavior). Admin commands now have an overload with an adminCredentials parameter.

pull/24/head
rstam 15 years ago
parent
commit
aca61ac568
  1. 10
      Driver/Core/MongoDatabase.cs
  2. 61
      Driver/Core/MongoServer.cs
  3. 28
      Driver/Core/MongoUrl.cs
  4. 1
      Driver/Core/MongoUrlBuilder.cs
  5. 2
      DriverUnitTests/Core/MongoServerTests.cs
  6. 28
      DriverUnitTests/Core/MongoUrlTests.cs

10
Driver/Core/MongoDatabase.cs

@ -277,6 +277,7 @@ namespace MongoDB.Driver {
}
public BsonDocument RenameCollection(
MongoCredentials adminCredentials,
string oldCollectionName,
string newCollectionName
) {
@ -284,7 +285,14 @@ namespace MongoDB.Driver {
{ "renameCollection", string.Format("{0}.{1}", name, oldCollectionName) },
{ "to", string.Format("{0}.{1}", name, newCollectionName) }
};
return server.RunAdminCommand(command);
return server.RunAdminCommand(adminCredentials, command);
}
public BsonDocument RenameCollection(
string oldCollectionName,
string newCollectionName
) {
return RenameCollection(server.AdminCredentials, oldCollectionName, newCollectionName);
}
public void RequestDone() {

61
Driver/Core/MongoServer.cs

@ -32,10 +32,7 @@ namespace MongoDB.Driver {
#region private fields
private object serverLock = new object();
private MongoServerState state = MongoServerState.Disconnected;
private IEnumerable<MongoServerAddress> seedList;
private bool slaveOk;
private IEnumerable<MongoServerAddress> replicaSet;
private SafeMode safeMode = SafeMode.False;
private Dictionary<string, MongoDatabase> databases = new Dictionary<string, MongoDatabase>();
private MongoConnectionPool connectionPool;
private MongoCredentials adminCredentials;
@ -48,7 +45,6 @@ namespace MongoDB.Driver {
MongoUrl url
) {
this.url = url;
this.seedList = url.Servers;
// credentials (if any) are for server only if no DatabaseName was provided
if (url.Credentials != null && url.DatabaseName == null) {
@ -107,7 +103,6 @@ namespace MongoDB.Driver {
#region public properties
public MongoCredentials AdminCredentials {
get { return adminCredentials; }
set { adminCredentials = value; }
}
public MongoDatabase AdminDatabase {
@ -116,7 +111,6 @@ namespace MongoDB.Driver {
public MongoCredentials DefaultCredentials {
get { return defaultCredentials; }
set { defaultCredentials = value; }
}
public IEnumerable<MongoServerAddress> ReplicaSet {
@ -124,27 +118,24 @@ namespace MongoDB.Driver {
}
public SafeMode SafeMode {
get { return safeMode; }
set { safeMode = value; }
get { return url.SafeMode; }
}
public IEnumerable<MongoServerAddress> SeedList {
get { return seedList; }
get { return url.Servers; }
}
public bool SlaveOk {
get { return slaveOk; }
set {
if (slaveOk != value) {
slaveOk = value;
Disconnect(); // Connect will be called automatically the next time an operation is performed
}
}
get { return url.SlaveOk; }
}
public MongoServerState State {
get { return state; }
}
public MongoUrl Url {
get { return url; }
}
#endregion
#region public indexers
@ -180,7 +171,8 @@ namespace MongoDB.Driver {
if (state != MongoServerState.Connected) {
state = MongoServerState.Connecting;
try {
var results = FindServer(timeout);
// TODO: implement ConnectDirectly
var results = ConnectToReplicaSet(timeout);
List<MongoServerAddress> replicaSet = null;
if (results.CommandResult.Contains("hosts")) {
@ -285,8 +277,15 @@ namespace MongoDB.Driver {
}
public IEnumerable<string> GetDatabaseNames() {
return GetDatabaseNames(adminCredentials);
}
public IEnumerable<string> GetDatabaseNames(
MongoCredentials adminCredentials
) {
var adminDatabase = GetDatabase("admin", adminCredentials);
var result = adminDatabase.RunCommand("listDatabases");
var databaseNames = new List<string>();
var result = AdminDatabase.RunCommand("listDatabases");
foreach (BsonDocument database in result["databases"].AsBsonArray.Values) {
string databaseName = database["name"].AsString;
databaseNames.Add(databaseName);
@ -303,21 +302,37 @@ namespace MongoDB.Driver {
}
public BsonDocument RunAdminCommand<TCommand>(
MongoCredentials adminCredentials,
TCommand command
) {
return AdminDatabase.RunCommand(command);
var adminDatabase = GetDatabase("admin", adminCredentials);
return adminDatabase.RunCommand(command);
}
public BsonDocument RunAdminCommand<TCommand>(
TCommand command
) {
return RunAdminCommand(adminCredentials , command);
}
public BsonDocument RunAdminCommand(
MongoCredentials adminCredentials,
string commandName
) {
var adminDatabase = GetDatabase("admin", adminCredentials);
var command = new BsonDocument(commandName, true);
return AdminDatabase.RunCommand(command);
return adminDatabase.RunCommand(command);
}
public BsonDocument RunAdminCommand(
string commandName
) {
return RunAdminCommand(adminCredentials, commandName);
}
#endregion
#region private methods
private QueryServerResults FindServer(
private QueryServerResults ConnectToReplicaSet(
TimeSpan timeout
) {
DateTime deadline = DateTime.UtcNow + timeout;
@ -326,7 +341,7 @@ namespace MongoDB.Driver {
var resultsQueue = new BlockingQueue<QueryServerResults>();
var queriedServers = new HashSet<MongoServerAddress>();
int pendingReplies = 0;
foreach (var address in seedList) {
foreach (var address in url.Servers) {
var args = new QueryServerParameters {
Address = address,
ResultsQueue = resultsQueue
@ -350,7 +365,7 @@ namespace MongoDB.Driver {
}
var commandResult = results.CommandResult;
if (results.IsPrimary || slaveOk) {
if (results.IsPrimary || url.SlaveOk) {
return results;
} else {
results.Connection.Close();

28
Driver/Core/MongoUrl.cs

@ -47,43 +47,19 @@ namespace MongoDB.Driver {
#endregion
#region constructors
public MongoUrl() {
}
public MongoUrl(
string url
) {
var builder = new MongoUrlBuilder(url);
this.url = builder.ToString();
this.url = builder.ToString(); // keep canonical form
this.credentials = builder.Credentials;
this.servers = builder.Servers;
this.databaseName = builder.DatabaseName;
this.connectionMode = builder.ConnectionMode;
this.replicaSetName = builder.ReplicaSetName;
this.safeMode = builder.SafeMode;
this.safeMode = builder.SafeMode ?? SafeMode.False; // never null
this.slaveOk = builder.SlaveOk;
}
// called by trusted code that has already parsed the url
internal MongoUrl(
string url, // assumed to be in canonical form and agree with the remaining parameters
MongoCredentials credentials,
IEnumerable<MongoServerAddress> servers,
string databaseName,
ConnectionMode connectionMode,
string replicaSetName,
SafeMode safeMode,
bool slaveOk
) {
this.url = url;
this.credentials = credentials;
this.servers = servers;
this.databaseName = databaseName;
this.connectionMode = connectionMode;
this.replicaSetName = replicaSetName;
this.safeMode = safeMode;
this.slaveOk = slaveOk;
}
#endregion
#region public properties

1
Driver/Core/MongoUrlBuilder.cs

@ -231,6 +231,7 @@ namespace MongoDB.Driver {
return MongoUrl.Create(ToString());
}
// returns URL in canonical form
public override string ToString() {
StringBuilder url = new StringBuilder();
url.Append("mongodb://");

2
DriverUnitTests/Core/MongoServerTests.cs

@ -34,7 +34,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(SafeMode.False, server.SafeMode);
Assert.AreEqual(false, server.SlaveOk);
Assert.AreEqual(MongoServerState.Disconnected, server.State);
Assert.IsTrue(expectedSeedList.SequenceEqual(server.SeedList));
Assert.IsTrue(expectedSeedList.SequenceEqual(server.Url.Servers));
}
}
}

28
DriverUnitTests/Core/MongoUrlTests.cs

@ -35,7 +35,7 @@ namespace MongoDB.DriverUnitTests {
Assert.IsNull(url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -51,7 +51,7 @@ namespace MongoDB.DriverUnitTests {
Assert.IsNull(url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -67,7 +67,7 @@ namespace MongoDB.DriverUnitTests {
Assert.IsNull(url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -85,7 +85,7 @@ namespace MongoDB.DriverUnitTests {
Assert.IsNull(url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -103,7 +103,7 @@ namespace MongoDB.DriverUnitTests {
Assert.IsNull(url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -120,7 +120,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual("dbname", url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -139,7 +139,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual("dbname", url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -158,7 +158,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual("dbname", url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -174,7 +174,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -190,7 +190,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual("mongodb://localhost", url.ToString()); // connect=direct dropped
}
@ -206,7 +206,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}
@ -222,7 +222,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.ReplicaSet, url.ConnectionMode);
Assert.AreEqual("name", url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual("mongodb://localhost/?connect=replicaset;replicaset=name", url.ToString()); // connect=replicaset added
}
@ -382,7 +382,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(false, url.SlaveOk);
Assert.AreEqual("mongodb://localhost", url.ToString()); // slaveok=false dropped
}
@ -398,7 +398,7 @@ namespace MongoDB.DriverUnitTests {
Assert.AreEqual(null, url.DatabaseName);
Assert.AreEqual(ConnectionMode.Direct, url.ConnectionMode);
Assert.AreEqual(null, url.ReplicaSetName);
Assert.AreEqual(null, url.SafeMode);
Assert.AreEqual(SafeMode.False, url.SafeMode);
Assert.AreEqual(true, url.SlaveOk);
Assert.AreEqual(connectionString, url.ToString());
}

Loading…
Cancel
Save