forked from samus/mongodb-csharp
-
Notifications
You must be signed in to change notification settings - Fork 1
/
CollectionMetaData.cs
107 lines (91 loc) · 3.59 KB
/
CollectionMetaData.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Text;
using MongoDB.Driver.Connections;
namespace MongoDB.Driver
{
/// <summary>
/// Lazily loaded meta data on the collection.
/// </summary>
public class CollectionMetaData
{
private string fullName;
private string name;
private Database db;
public CollectionMetaData (string dbName, string name, Connection conn){
this.fullName = dbName + "." + name;
this.name = name;
this.db = new Database (conn, dbName);
}
private Document options = null;
public Document Options {
get {
if (options != null)
return options;
Document doc = db["system.namespaces"].FindOne (new Document ().Append ("name", this.fullName));
if (doc == null)
doc = new Document ();
if (doc.Contains ("create"))
doc.Remove ("create");
//Not sure why this is here. The python driver has it.
this.options = doc;
return this.options;
}
}
private bool gotIndexes = false;
private Dictionary<string, Document> indexes = new Dictionary<string, Document> ();
public Dictionary<string, Document> Indexes {
get {
if (gotIndexes)
return indexes;
indexes.Clear ();
ICursor docs = db["system.indexes"].Find (new Document ().Append ("ns", this.fullName));
foreach (Document doc in docs.Documents) {
indexes.Add ((string)doc["name"], doc);
}
return indexes;
}
}
public void CreateIndex (string name, Document fieldsAndDirections, bool unique){
Document index = new Document ();
index["name"] = name;
index["ns"] = this.fullName;
index["key"] = fieldsAndDirections;
index["unique"] = unique;
db["system.indexes"].Insert (index);
this.refresh ();
}
public void CreateIndex (Document fieldsAndDirections, bool unique){
string name = this.generateIndexName (fieldsAndDirections, unique);
this.CreateIndex (name, fieldsAndDirections, unique);
}
public void DropIndex (string name){
Document cmd = new Document ();
cmd.Append ("deleteIndexes", this.name).Append ("index", name);
db.SendCommand (cmd);
this.refresh ();
}
public void Rename (string newName){
if (string.IsNullOrEmpty (newName))
throw new ArgumentException ("Name must not be null or empty", "newName");
Document cmd = new Document ();
cmd.Append ("renameCollection", fullName).Append ("to", db.Name + "." + newName);
db.GetSisterDatabase ("admin").SendCommand (cmd);
this.refresh ();
}
public void refresh (){
indexes.Clear ();
gotIndexes = false;
options = null;
}
protected string generateIndexName (Document fieldsAndDirections, bool unique){
StringBuilder sb = new StringBuilder ("_");
foreach (string key in fieldsAndDirections.Keys) {
sb.Append (key).Append ("_");
}
if (unique)
sb.Append ("unique_");
return sb.ToString ();
}
}
}