/// <summary> /// Add Element /// </summary> /// <param name="BaseDoc"></param> /// <param name="AddElement"></param> public static String AddElement(String ElementPath, BsonElement AddElement) { BsonDocument BaseDoc = SystemManager.CurrentDocument; WriteConcernResult rtn; BsonValue t = GetLastParentDocument(BaseDoc, ElementPath, true); if (t.IsBsonDocument) { try { t.AsBsonDocument.InsertAt(t.AsBsonDocument.ElementCount, AddElement); } catch (InvalidOperationException ex) { return(ex.Message); } } if (!SystemManager.GetCurrentCollection().IsCapped()) { rtn = SystemManager.GetCurrentCollection().Save(BaseDoc); } return(String.Empty); }
/// <summary> /// 复制菜单项目 /// </summary> /// <param name="orgMenuItem">原始的菜单</param> /// <returns>克隆的菜单</returns> public static ToolStripMenuItem Clone(this ToolStripMenuItem orgMenuItem) { ToolStripMenuItem cloneMenuItem = new ToolStripMenuItem(); ///!!!typeof的参数必须是ToolStripMenuItem的基类!!!如果使用Control则不能取到值!!! ///感谢CSDN网友beargo在帖子【如何获取事件已定制方法名?】里面的提示,网上的例子没有说明这个问题 ///坑爹啊。。。。。。。。 Delegate[] _List = GetObjectEventList(orgMenuItem, "EventClick", typeof(ToolStripItem)); if (!SystemManager.MONO_MODE) { //悲催MONO不支持 if (_List != null && _List[0] != null) { try { cloneMenuItem.Click += new EventHandler( (x, y) => { _List[0].DynamicInvoke(x, y); } ); } catch (Exception ex) { SystemManager.ExceptionDeal(ex, cloneMenuItem.Text); } } } cloneMenuItem.Text = orgMenuItem.Text; cloneMenuItem.Enabled = orgMenuItem.Enabled; cloneMenuItem.BackgroundImage = orgMenuItem.BackgroundImage; cloneMenuItem.Image = orgMenuItem.Image; //子菜单的复制 foreach (ToolStripMenuItem item in orgMenuItem.DropDownItems) { cloneMenuItem.DropDownItems.Add(item.Clone()); } return(cloneMenuItem); }
/// <summary> /// 插入JS到系统JS库 /// </summary> /// <param name="jsName"></param> /// <param name="jsCode"></param> public static String CreateNewJavascript(String jsName, String jsCode) { //标准的JS库格式未知 MongoCollection jsCol = SystemManager.GetCurrentJsCollection(); if (!QueryHelper.IsExistByKey(jsCol, jsName)) { var result = new CommandResult(new BsonDocument()); try { result = jsCol.Insert(new BsonDocument().Add(KEY_ID, jsName).Add("value", jsCode)); } catch (MongoCommandException ex) { result = ex.CommandResult; } if (result.Response["err"] == BsonNull.Value) { return(String.Empty); } return(result.Response["err"].ToString()); } return(String.Empty); }
/// <summary> /// Fill Database status to ListView /// </summary> /// <param name="lstSvr"></param> public static void FillDataBaseStatusToList(ListView lstSvr) { lstSvr.Clear(); if (SystemManager.IsUseDefaultLanguage) { lstSvr.Columns.Add("DataBaseName"); lstSvr.Columns.Add("CollectionCount"); lstSvr.Columns.Add("DataSize"); lstSvr.Columns.Add("FileSize"); lstSvr.Columns.Add("IndexCount"); lstSvr.Columns.Add("IndexSize"); lstSvr.Columns.Add("ObjectCount"); lstSvr.Columns.Add("StorageSize"); } else { lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_DataBaseName)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_CollectionCount)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_DataSize)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_FileSize)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_IndexCount)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_IndexSize)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_ObjectCount)); lstSvr.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.DataBase_Status_StorageSize)); } foreach (String mongoSvrKey in _mongoConnSvrLst.Keys) { try { MongoServer mongoSvr = _mongoConnSvrLst[mongoSvrKey]; //感谢 魏琼东 的Bug信息,一些命令必须以Admin执行 if (!SystemManager.GetCurrentServerConfig(mongoSvrKey).Health || !SystemManager.GetCurrentServerConfig(mongoSvrKey).LoginAsAdmin) { continue; } List <String> databaseNameList = mongoSvr.GetDatabaseNames().ToList <String>(); foreach (String strDBName in databaseNameList) { MongoDatabase mongoDB = mongoSvr.GetDatabase(strDBName); DatabaseStatsResult dbStatus = mongoDB.GetStats(); ListViewItem lst = new ListViewItem(mongoSvrKey + "." + strDBName); try { lst.SubItems.Add(dbStatus.CollectionCount.ToString()); } catch (Exception) { lst.SubItems.Add("0"); } lst.SubItems.Add(GetSize(dbStatus.DataSize)); lst.SubItems.Add(GetSize(dbStatus.FileSize)); lst.SubItems.Add(dbStatus.IndexCount.ToString()); lst.SubItems.Add(GetSize(dbStatus.IndexSize)); lst.SubItems.Add(dbStatus.ObjectCount.ToString()); lst.SubItems.Add(GetSize(dbStatus.StorageSize)); lstSvr.Items.Add(lst); } } catch (Exception ex) { throw ex; } } }
/// <summary> /// fill Collection status to ListView /// </summary> /// <param name="lstData"></param> public static void FillCollectionStatusToList(ListView lstData) { lstData.Clear(); if (SystemManager.IsUseDefaultLanguage) { lstData.Columns.Add("CollectionName"); lstData.Columns.Add("ObjectCount"); lstData.Columns.Add("DataSize"); lstData.Columns.Add("LastExtentSize"); lstData.Columns.Add("StorageSize"); lstData.Columns.Add("TotalIndexSize"); //2012-3-6 lstData.Columns.Add("IsCapped"); lstData.Columns.Add("MaxDocuments"); lstData.Columns.Add("AverageObjectSize"); lstData.Columns.Add("PaddingFactor"); } else { lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_CollectionName)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_ObjectCount)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_DataSize)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_LastExtentSize)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_StorageSize)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_TotalIndexSize)); //2012-3-6 lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_IsCapped)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_MaxDocuments)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_AverageObjectSize)); lstData.Columns.Add(SystemManager.mStringResource.GetText(StringResource.TextType.Collection_Status_PaddingFactor)); } foreach (String mongoSvrKey in _mongoConnSvrLst.Keys) { try { MongoServer mongoSvr = _mongoConnSvrLst[mongoSvrKey]; //感谢 魏琼东 的Bug信息,一些命令必须以Admin执行 if (!SystemManager.GetCurrentServerConfig(mongoSvrKey).Health || !SystemManager.GetCurrentServerConfig(mongoSvrKey).LoginAsAdmin) { continue; } List <String> databaseNameList = mongoSvr.GetDatabaseNames().ToList <String>(); foreach (String strDBName in databaseNameList) { MongoDatabase mongoDB = mongoSvr.GetDatabase(strDBName); List <String> colNameList = mongoDB.GetCollectionNames().ToList <String>(); foreach (String strColName in colNameList) { try { CollectionStatsResult CollectionStatus = mongoDB.GetCollection(strColName).GetStats(); ListViewItem lst = new ListViewItem(mongoSvrKey + "." + strDBName + "." + strColName); lst.SubItems.Add(CollectionStatus.ObjectCount.ToString()); lst.SubItems.Add(GetSize(CollectionStatus.DataSize)); lst.SubItems.Add(GetSize(CollectionStatus.LastExtentSize)); lst.SubItems.Add(GetSize(CollectionStatus.StorageSize)); lst.SubItems.Add(GetSize(CollectionStatus.TotalIndexSize)); //2012-3-6 lst.SubItems.Add(CollectionStatus.IsCapped.ToString()); lst.SubItems.Add(CollectionStatus.MaxDocuments.ToString()); if (CollectionStatus.ObjectCount != 0) { //在某些条件下,这个值会抛出异常,IndexKeyNotFound //同时发现,这个时候Count = 0,TryCatch可能会消耗时间,所以改为条件判断 lst.SubItems.Add(GetSize((long)CollectionStatus.AverageObjectSize)); } else { lst.SubItems.Add("0"); } try { //在某些条件下,这个值会抛出异常,IndexKeyNotFound lst.SubItems.Add(CollectionStatus.PaddingFactor.ToString()); } catch (Exception) { lst.SubItems.Add("0"); } lstData.Items.Add(lst); } catch (Exception) { //throw; //TODO:排序时候会发生错误,所以暂时不对应 //lstData.Items.Add(new ListViewItem(strColName + "[Exception]")); } } } } catch (Exception ex) { throw ex; } } }
/// <summary> /// 上传文件 /// </summary> /// <remarks>Mongo允许同名文件,因为id才是主键</remarks> /// <param name="strFileName"></param> public static UploadResult UpLoadFile(String strFileName, UpLoadFileOption Option) { MongoDatabase mongoDB = SystemManager.GetCurrentDataBase(); MongoGridFS gfs = mongoDB.GetGridFS(new MongoGridFSSettings()); String RemoteName = String.Empty; if (Option.FileNameOpt == enumGFSFileName.filename) { RemoteName = new FileInfo(strFileName).Name; } else { if (Option.DirectorySeparatorChar != Path.DirectorySeparatorChar) { RemoteName = strFileName.Replace(Path.DirectorySeparatorChar, Option.DirectorySeparatorChar); } else { RemoteName = strFileName; } } try { OnActionDone(new ActionDoneEventArgs(RemoteName + " Uploading ")); if (!gfs.Exists(RemoteName)) { gfs.Upload(strFileName, RemoteName); return(UploadResult.Complete); } else { switch (Option.AlreadyOpt) { case enumGFSAlready.JustAddIt: gfs.Upload(strFileName, RemoteName); return(UploadResult.Complete); case enumGFSAlready.RenameIt: String ExtendName = new FileInfo(strFileName).Extension; String MainName = RemoteName.Substring(0, RemoteName.Length - ExtendName.Length); int i = 1; while (gfs.Exists(MainName + i.ToString() + ExtendName)) { i++; } gfs.Upload(strFileName, MainName + i.ToString() + ExtendName); return(UploadResult.Complete); case enumGFSAlready.SkipIt: return(UploadResult.Skip); case enumGFSAlready.OverwriteIt: gfs.Delete(RemoteName); gfs.Upload(strFileName, RemoteName); return(UploadResult.Complete); case enumGFSAlready.Stop: return(UploadResult.Skip); } return(UploadResult.Skip); } } catch (Exception ex) { SystemManager.ExceptionDeal(ex); return(UploadResult.Exception); } }
/// <summary> /// 将数据放入ListView中进行展示 /// </summary> /// <param name="collectionName"></param> /// <param name="lstData"></param> /// <param name="dataList"></param> public static void FillDataToListView(String collectionName, ListView lstData, List <BsonDocument> dataList) { lstData.Clear(); lstData.SmallImageList = null; switch (collectionName) { case COLLECTION_NAME_GFS_FILES: SetGridFileToListView(dataList, lstData); break; case COLLECTION_NAME_USER: SetUserListToListView(dataList, lstData); break; default: List <String> _columnlist = new List <String>(); //可以让_id 不在第一位,昏过去了,很多逻辑需要调整 bool isSystem = IsSystemCollection(SystemManager.GetCurrentCollection()); if (!isSystem) { _columnlist.Add(KEY_ID); lstData.Columns.Add(KEY_ID); } foreach (BsonDocument docItem in dataList) { ListViewItem lstItem = new ListViewItem(); foreach (String item in docItem.Names) { if (!_columnlist.Contains(item)) { _columnlist.Add(item); lstData.Columns.Add(item); } } //Key:_id if (!isSystem) { BsonElement id; docItem.TryGetElement(KEY_ID, out id); if (id != null) { lstItem.Text = docItem.GetValue(KEY_ID).ToString(); //这里保存真实的主Key数据,删除的时候使用 lstItem.Tag = docItem.GetValue(KEY_ID); } else { lstItem.Text = "[Empty]"; lstItem.Tag = docItem.GetElement(0).Value; } } else { lstItem.Text = docItem.GetValue(_columnlist[0].ToString()).ToString(); } //OtherItems for (int i = isSystem ? 1 : 0; i < _columnlist.Count; i++) { if (_columnlist[i].ToString() == KEY_ID) { continue; } BsonValue val; docItem.TryGetValue(_columnlist[i].ToString(), out val); if (val == null) { lstItem.SubItems.Add(""); } else { lstItem.SubItems.Add(ConvertToString(val)); } } lstData.Items.Add(lstItem); } break; } }
/// <summary> /// 获取实例节点 /// </summary> /// <param name="mongoConnKey"></param> /// <param name="config">由于是结构体,必须ref</param> /// <param name="mongoConn"></param> /// <param name="mMasterServerInstace"></param> /// <param name="mServer"></param> /// <param name="UserList"></param> /// <returns></returns> private static TreeNode GetInstanceNode(String mongoConnKey, ref ConfigHelper.MongoConnectionConfig config, MongoServer mongoConn, MongoServerInstance mMasterServerInstace, MongoServer mServer, EachDatabaseUser UserList) { bool isReplsetMasterServer = mMasterServerInstace == null; //无论如何,都改为主要服务器读优先 var svrInstanceNode = new TreeNode(); String connSvrKey; connSvrKey = isReplsetMasterServer ? mongoConnKey + "/" + mongoConnKey : mongoConnKey + "/" + mMasterServerInstace.Address.ToString().Replace(":", "@"); svrInstanceNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer; svrInstanceNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer; svrInstanceNode.Text = isReplsetMasterServer ? "Connection" : "Server[" + mMasterServerInstace.Address + "]"; if (!String.IsNullOrEmpty(config.UserName) & (!String.IsNullOrEmpty(config.Password))) { //是否是认证模式,应该取决于服务器! config.AuthMode = true; } //获取ReadOnly config.IsReadOnly = false; List <string> databaseNameList; if (!String.IsNullOrEmpty(config.DataBaseName)) { //单数据库模式 TreeNode mongoSingleDbNode; mongoSingleDbNode = isReplsetMasterServer ? FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mongoConnKey) : FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mMasterServerInstace.Address); mongoSingleDbNode.Tag = MongoDbHelper.SINGLE_DATABASE_TAG + ":" + connSvrKey + "/" + config.DataBaseName; mongoSingleDbNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoSingleDbNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; svrInstanceNode.Nodes.Add(mongoSingleDbNode); svrInstanceNode.Tag = MongoDbHelper.SINGLE_DB_SERVER_TAG + ":" + connSvrKey; //获取User信息 if (config.AuthMode) { try { //尝试添加用户信息 UserList.AddUser(mongoConn.GetDatabase(config.DataBaseName), config.UserName); } catch { //可能出现没有权限的问题,这里就认为无法取得权限 } } } else { MongoServer instantSrv; if (isReplsetMasterServer) { instantSrv = mServer; databaseNameList = mServer.GetDatabaseNames().ToList(); } else { MongoClientSettings setting = MongoDbHelper.CreateMongoClientSettingsByConfig(ref config); setting.ConnectionMode = ConnectionMode.Direct; //When Replset Case,Application need to read admin DB information //if Primary,there will be exception setting.ReadPreference = ReadPreference.PrimaryPreferred; setting.Server = mMasterServerInstace.Address; instantSrv = new MongoClient(setting).GetServer(); databaseNameList = instantSrv.GetDatabaseNames().ToList(); } foreach (String strDbName in databaseNameList) { TreeNode mongoDbNode; try { mongoDbNode = FillDataBaseInfoToTreeNode(strDbName, instantSrv, connSvrKey); mongoDbNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoDbNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; svrInstanceNode.Nodes.Add(mongoDbNode); if (config.AuthMode) { try { //尝试添加用户信息 UserList.AddUser(mongoConn.GetDatabase(strDbName), config.UserName); } catch { //可能出现没有权限的问题,这里就认为无法取得权限 } } } catch (Exception ex) { SystemManager.ExceptionDeal(ex, strDbName + "Exception", strDbName + "Exception"); mongoDbNode = new TreeNode(strDbName + " (Exception)") { ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database, SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database }; svrInstanceNode.Nodes.Add(mongoDbNode); } } if (isReplsetMasterServer) { svrInstanceNode.Tag = MongoDbHelper.SERVER_TAG + ":" + mongoConnKey + "/" + mongoConnKey; } else { if (mongoConn.ReplicaSetName != null) { svrInstanceNode.Tag = MongoDbHelper.SERVER_REPLSET_MEMBER_TAG + ":" + mongoConnKey + "/" + mMasterServerInstace.Address.ToString().Replace(":", "@"); } } } if (MongoDbHelper._mongoInstanceLst.ContainsKey(connSvrKey)) { MongoDbHelper._mongoInstanceLst.Remove(connSvrKey); } if (!isReplsetMasterServer) { MongoDbHelper._mongoInstanceLst.Add(connSvrKey, mMasterServerInstace); } return(svrInstanceNode); }
/// <summary> /// 将Mongodb的服务器在树形控件中展示 /// </summary> /// <param name="trvMongoDB"></param> public static void FillConnectionToTreeView(TreeView trvMongoDB) { trvMongoDB.Nodes.Clear(); foreach (String mongoConnKey in MongoDbHelper._mongoConnSvrLst.Keys) { MongoServer mongoSrv = MongoDbHelper._mongoConnSvrLst[mongoConnKey]; var ConnectionNode = new TreeNode(); var UserList = new EachDatabaseUser(); try { //ReplSetName只能使用在虚拟的Replset服务器,Sharding体系等无效。虽然一个Sharding可以看做一个ReplSet ConfigHelper.MongoConnectionConfig config = SystemManager.ConfigHelperInstance.ConnectionList[mongoConnKey]; ConnectionNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Connection; ConnectionNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Connection; //ReplSet服务器需要Connect才能连接。可能因为这个是虚拟的服务器,没有Mongod实体。 //不过现在改为全部显示的打开连接 mongoSrv.Connect(); //mongoSvr.ReplicaSetName只有在连接后才有效,但是也可以使用Config.ReplsetName ConnectionNode.Text = mongoConnKey; ConnectionNode.Nodes.Add(GetInstanceNode(mongoConnKey, ref config, mongoSrv, null, mongoSrv, UserList)); if (mongoSrv.ReplicaSetName != null) { ConnectionNode.Tag = MongoDbHelper.CONNECTION_REPLSET_TAG + ":" + config.ConnectionName; var ServerListNode = new TreeNode("Servers") { SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers, ImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers }; foreach (MongoServerInstance ServerInstace in mongoSrv.Instances) { ServerListNode.Nodes.Add(GetInstanceNode(mongoConnKey, ref config, mongoSrv, ServerInstace, null, UserList)); } ConnectionNode.Nodes.Add(ServerListNode); config.ServerRole = ConfigHelper.SvrRoleType.ReplsetSvr; } else { BsonDocument ServerStatusDoc = CommandHelper.ExecuteMongoSvrCommand(CommandHelper.serverStatus_Command, mongoSrv).Response; //ServerStatus可能没有权限打开 if (ServerStatusDoc.Contains("process") && ServerStatusDoc.GetElement("process").Value == MongoDbHelper.ServerStatus_PROCESS_MONGOS) { //Shard的时候,必须将所有服务器的ReadPreferred设成可读 config.ServerRole = ConfigHelper.SvrRoleType.ShardSvr; ConnectionNode.Tag = MongoDbHelper.CONNECTION_CLUSTER_TAG + ":" + config.ConnectionName; var ShardListNode = new TreeNode("Shards") { SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers, ImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers }; foreach (var lst in MongoDbHelper.GetShardInfo(mongoSrv, "host")) { var ShardNode = new TreeNode { Text = lst.Key, SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers, ImageIndex = (int)GetSystemIcon.MainTreeImageType.Servers }; String strHostList = lst.Value; String[] strAddress = strHostList.Split("/".ToCharArray()); String strAddresslst; if (strAddress.Length == 2) { //#1 replset/host:port,host:port ShardNode.Text += "[Replset:" + strAddress[0] + "]"; strAddresslst = strAddress[1]; } else { //#2 host:port,host:port strAddresslst = strHostList; } foreach (String item in strAddresslst.Split(",".ToCharArray())) { var tinySetting = new MongoClientSettings { ConnectionMode = ConnectionMode.Direct, ReadPreference = ReadPreference.PrimaryPreferred, ReplicaSetName = strAddress[0] }; //防止无法读取Sharding状态。Sharding可能是一个Slaver MongoServerAddress SecondaryAddr; if (item.Split(":".ToCharArray()).Length == 2) { SecondaryAddr = new MongoServerAddress(item.Split(":".ToCharArray())[0], Convert.ToInt32(item.Split(":".ToCharArray())[1])); } else { SecondaryAddr = new MongoServerAddress(item.Split(":".ToCharArray())[0]); } tinySetting.Server = SecondaryAddr; MongoServer ReplsetMember = new MongoClient(tinySetting).GetServer(); ShardNode.Nodes.Add(GetInstanceNode(mongoConnKey, ref config, mongoSrv, ReplsetMember.Instance, null, UserList)); } ShardListNode.Nodes.Add(ShardNode); } ConnectionNode.Nodes.Add(ShardListNode); } else { //Server Status mongod //Master - Slave 的判断 BsonElement replElement; ServerStatusDoc.TryGetElement("repl", out replElement); if (replElement == null) { config.ServerRole = ConfigHelper.SvrRoleType.DataSvr; } else { config.ServerRole = replElement.Value.AsBsonDocument.GetElement("ismaster").Value == BsonBoolean.True ? ConfigHelper.SvrRoleType.MasterSvr : ConfigHelper.SvrRoleType.SlaveSvr; } ConnectionNode.Tag = MongoDbHelper.CONNECTION_TAG + ":" + config.ConnectionName; } } //设定是否可用 config.Health = true; //设定版本 if (mongoSrv.BuildInfo != null) { config.MongoDBVersion = mongoSrv.BuildInfo.Version; } SystemManager.ConfigHelperInstance.ConnectionList[mongoConnKey] = config; switch (config.ServerRole) { case ConfigHelper.SvrRoleType.DataSvr: ConnectionNode.Text = "[Data] " + ConnectionNode.Text; break; case ConfigHelper.SvrRoleType.ShardSvr: ConnectionNode.Text = "[Cluster] " + ConnectionNode.Text; break; case ConfigHelper.SvrRoleType.ReplsetSvr: ConnectionNode.Text = "[Replset] " + ConnectionNode.Text; break; case ConfigHelper.SvrRoleType.MasterSvr: ConnectionNode.Text = "[Master] " + ConnectionNode.Text; break; case ConfigHelper.SvrRoleType.SlaveSvr: ConnectionNode.Text = "[Slave] " + ConnectionNode.Text; break; default: break; } trvMongoDB.Nodes.Add(ConnectionNode); if (MongoDbHelper._mongoUserLst.ContainsKey(mongoConnKey)) { MongoDbHelper._mongoUserLst[mongoConnKey] = UserList; } else { MongoDbHelper._mongoUserLst.Add(mongoConnKey, UserList); } } catch (MongoAuthenticationException ex) { //需要验证的数据服务器,没有Admin权限无法获得数据库列表 if (!SystemManager.IsUseDefaultLanguage) { ConnectionNode.Text += "[" + SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException) + "]"; SystemManager.ExceptionDeal(ex, SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException), SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException_Note)); } else { ConnectionNode.Text += "[MongoAuthenticationException]"; SystemManager.ExceptionDeal(ex, "MongoAuthenticationException:", "Please check UserName and Password"); } ConnectionNode.Tag = MongoDbHelper.CONNECTION_EXCEPTION_TAG + ":" + mongoConnKey; trvMongoDB.Nodes.Add(ConnectionNode); } catch (MongoCommandException ex) { //listDatabase命令错误,本质是用户名称错误 if (ex.CommandResult.Response["errmsg"] == "unauthorized") { if (!SystemManager.IsUseDefaultLanguage) { ConnectionNode.Text += "[" + SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException) + "]"; SystemManager.ExceptionDeal(ex, SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException), SystemManager.MStringResource.GetText( StringResource.TextType.Exception_AuthenticationException_Note)); } else { ConnectionNode.Text += "[MongoAuthenticationException]"; SystemManager.ExceptionDeal(ex, "MongoAuthenticationException:", "Please check UserName and Password"); } } else { if (!SystemManager.IsUseDefaultLanguage) { ConnectionNode.Text += "[" + SystemManager.MStringResource.GetText( StringResource.TextType.Exception_NotConnected) + "]"; SystemManager.ExceptionDeal(ex, SystemManager.MStringResource.GetText(StringResource.TextType.Exception_NotConnected), "Unknown Exception"); } else { ConnectionNode.Text += "[Exception]"; SystemManager.ExceptionDeal(ex, "Not Connected", "Unknown Exception"); } } ConnectionNode.Tag = MongoDbHelper.CONNECTION_EXCEPTION_TAG + ":" + mongoConnKey; trvMongoDB.Nodes.Add(ConnectionNode); } catch (MongoConnectionException ex) { //暂时不处理任何异常,简单跳过 //无法连接的理由: //1.服务器没有启动 //2.认证模式不正确 if (!SystemManager.IsUseDefaultLanguage) { ConnectionNode.Text += "[" + SystemManager.MStringResource.GetText( StringResource.TextType.Exception_NotConnected) + "]"; SystemManager.ExceptionDeal(ex, SystemManager.MStringResource.GetText(StringResource.TextType.Exception_NotConnected), SystemManager.MStringResource.GetText(StringResource.TextType.Exception_NotConnected_Note)); } else { ConnectionNode.Text += "[Exception]"; SystemManager.ExceptionDeal(ex, "Not Connected", "Mongo Server may not Startup or Auth Mode is not correct"); } ConnectionNode.Tag = MongoDbHelper.CONNECTION_EXCEPTION_TAG + ":" + mongoConnKey; trvMongoDB.Nodes.Add(ConnectionNode); } catch (Exception ex) { if (!SystemManager.IsUseDefaultLanguage) { ConnectionNode.Text += "[" + SystemManager.MStringResource.GetText( StringResource.TextType.Exception_NotConnected) + "]"; SystemManager.ExceptionDeal(ex, SystemManager.MStringResource.GetText(StringResource.TextType.Exception_NotConnected), "Unknown Exception"); } else { ConnectionNode.Text += "[Exception]"; SystemManager.ExceptionDeal(ex, "Not Connected", "Unknown Exception"); } ConnectionNode.Tag = MongoDbHelper.CONNECTION_EXCEPTION_TAG + ":" + mongoConnKey; trvMongoDB.Nodes.Add(ConnectionNode); } } }
/// <summary> /// 当前对象的MONGO命令 /// </summary> /// <param name="mMongoCommand">命令对象</param> /// <param name="ShowMsgBox"></param> /// <returns></returns> public static CommandResult ExecuteMongoCommand(MongoCommand mMongoCommand, Boolean ShowMsgBox = true) { List <CommandResult> ResultCommandList = new List <CommandResult>(); CommandResult mCommandResult = new CommandResult(new BsonDocument()); try { switch (mMongoCommand.RunLevel) { case PathLv.CollectionLV: if (String.IsNullOrEmpty(mMongoCommand.CommandString)) { mCommandResult = ExecuteMongoColCommand(mMongoCommand.cmdDocument, SystemManager.GetCurrentCollection()); } else { mCommandResult = ExecuteMongoColCommand(mMongoCommand.CommandString, SystemManager.GetCurrentCollection()); } break; case PathLv.DatabaseLV: mCommandResult = ExecuteMongoDBCommand(mMongoCommand.cmdDocument, SystemManager.GetCurrentDataBase()); break; case PathLv.InstanceLV: mCommandResult = ExecuteMongoSvrCommand(mMongoCommand.cmdDocument, SystemManager.GetCurrentServer()); break; default: break; } ResultCommandList.Add(mCommandResult); if (ShowMsgBox) { MyMessageBox.ShowMessage(mMongoCommand.CommandString, mMongoCommand.CommandString + " Result", MongoDBHelper.ConvertCommandResultlstToString(ResultCommandList), true); } } catch (System.IO.IOException ex) { SystemManager.ExceptionDeal(ex, mMongoCommand.CommandString, "IOException,Try to set Socket TimeOut more long at connection config"); } catch (Exception ex) { SystemManager.ExceptionDeal(ex, mMongoCommand.CommandString); } return(mCommandResult); }
/// <summary> /// fill Collection status to ListView /// </summary> /// <param name="lstData"></param> public static void FillCollectionStatusToList(ListView lstData) { lstData.Clear(); if (SystemManager.IsUseDefaultLanguage) { lstData.Columns.Add("CollectionName"); lstData.Columns.Add("ObjectCount"); lstData.Columns.Add("DataSize"); lstData.Columns.Add("LastExtentSize"); lstData.Columns.Add("StorageSize"); lstData.Columns.Add("TotalIndexSize"); //2012-3-6 lstData.Columns.Add("IsCapped"); lstData.Columns.Add("MaxDocuments"); lstData.Columns.Add("AverageObjectSize"); lstData.Columns.Add("PaddingFactor"); } else { lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_CollectionName)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_ObjectCount)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_DataSize)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_LastExtentSize)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_StorageSize)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_TotalIndexSize)); //2012-3-6 lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_IsCapped)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_MaxDocuments)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_AverageObjectSize)); lstData.Columns.Add( SystemManager.MStringResource.GetText(StringResource.TextType.Collection_Status_PaddingFactor)); } foreach (String mongoSvrKey in _mongoConnSvrLst.Keys) { try { MongoServer mongoSvr = _mongoConnSvrLst[mongoSvrKey]; //感谢 魏琼东 的Bug信息,一些命令必须以Admin执行 if (!SystemManager.GetCurrentServerConfig(mongoSvrKey).Health || !SystemManager.GetCurrentServerConfig(mongoSvrKey).LoginAsAdmin) { continue; } List <String> databaseNameList = mongoSvr.GetDatabaseNames().ToList(); foreach (String strDBName in databaseNameList) { MongoDatabase mongoDB = mongoSvr.GetDatabase(strDBName); List <String> colNameList = mongoDB.GetCollectionNames().ToList(); foreach (String strColName in colNameList) { try { CollectionStatsResult CollectionStatus = mongoDB.GetCollection(strColName).GetStats(); var lst = new ListViewItem(mongoSvrKey + "." + strDBName + "." + strColName); lst.SubItems.Add(CollectionStatus.ObjectCount.ToString()); lst.SubItems.Add(GetSize(CollectionStatus.DataSize)); lst.SubItems.Add(GetSize(CollectionStatus.LastExtentSize)); lst.SubItems.Add(GetSize(CollectionStatus.StorageSize)); lst.SubItems.Add(GetSize(CollectionStatus.TotalIndexSize)); //2012-3-6 lst.SubItems.Add(CollectionStatus.IsCapped.ToString()); //https://jira.mongodb.org/browse/CSHARP-665 try { //注意:这个MaxDocuments只是在CappedCollection时候有效 lst.SubItems.Add(CollectionStatus.MaxDocuments.ToString()); } catch (Exception ex) { //溢出 lst.SubItems.Add(Int32.MaxValue.ToString()); SystemManager.ExceptionLog(ex); } lst.SubItems.Add(CollectionStatus.ObjectCount != 0 ? GetSize((long)CollectionStatus.AverageObjectSize) : "0"); try { //在某些条件下,这个值会抛出异常,IndexKeyNotFound lst.SubItems.Add(CollectionStatus.PaddingFactor.ToString()); } catch (Exception) { lst.SubItems.Add("0"); } lstData.Items.Add(lst); } catch (Exception ex) { //throw; //TODO:排序时候会发生错误,所以暂时不对应 //lstData.Items.Add(new ListViewItem(strColName + "[Exception]")); SystemManager.ExceptionDeal(ex); } } } } catch (Exception ex) { SystemManager.ExceptionDeal(ex); } } lstData.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); }
/// <summary> /// /// </summary> /// <param name="mongoConnKey"></param> /// <param name="config"></param> /// <param name="mongoConn"></param> /// <param name="mServerInstace"></param> /// <param name="mServer"></param> /// <returns></returns> private static TreeNode GetInstanceNode(String mongoConnKey, ConfigHelper.MongoConnectionConfig config, MongoServer mongoConn, MongoServerInstance mServerInstace, MongoServer mServer) { Boolean isServer = false; //无论如何,都改为主要服务器读优先 if (mServerInstace == null) { isServer = true; } TreeNode SvrInstanceNode = new TreeNode(); String ConnSvrKey; if (isServer) { ConnSvrKey = mongoConnKey + "/" + mongoConnKey; } else { ConnSvrKey = mongoConnKey + "/" + mServerInstace.Address.ToString().Replace(":", "@"); } SvrInstanceNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer; SvrInstanceNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.WebServer; if (isServer) { SvrInstanceNode.Text = "Connection"; } else { SvrInstanceNode.Text = "Server[" + mServerInstace.Address.ToString() + "]"; } if ((!String.IsNullOrEmpty(config.UserName)) & (!String.IsNullOrEmpty(config.Password))) { config.AuthMode = true; } //获取ReadOnly config.IsReadOnly = false; List <String> databaseNameList = new List <String>(); if (!String.IsNullOrEmpty(config.DataBaseName)) { //单数据库模式 TreeNode mongoSingleDBNode; if (isServer) { mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, mServer, mongoConnKey + "/" + mongoConnKey); } else { mongoSingleDBNode = FillDataBaseInfoToTreeNode(config.DataBaseName, MongoServer.Create(mServerInstace.Settings), mongoConnKey + "/" + mServerInstace.Address.ToString()); } mongoSingleDBNode.Tag = SINGLE_DATABASE_TAG + ":" + ConnSvrKey + "/" + config.DataBaseName; mongoSingleDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoSingleDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; SvrInstanceNode.Nodes.Add(mongoSingleDBNode); SvrInstanceNode.Tag = SINGLE_DB_SERVER_TAG + ":" + ConnSvrKey; if (config.AuthMode) { config.IsReadOnly = mongoConn.GetDatabase(config.DataBaseName).FindUser(config.UserName).IsReadOnly; } } else { MongoServer InstantSrv; if (isServer) { InstantSrv = mServer; databaseNameList = mServer.GetDatabaseNames().ToList <String>(); } else { MongoServerSettings setting = mongoConn.Settings.Clone(); setting.ConnectionMode = ConnectionMode.Direct; //When Replset Case,Application need to read admin DB information //if Primary,there will be exception setting.ReadPreference = ReadPreference.PrimaryPreferred; setting.Server = mServerInstace.Address; InstantSrv = new MongoServer(setting); databaseNameList = InstantSrv.GetDatabaseNames().ToList <String>(); } foreach (String strDBName in databaseNameList) { TreeNode mongoDBNode; try { mongoDBNode = FillDataBaseInfoToTreeNode(strDBName, InstantSrv, ConnSvrKey); mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; SvrInstanceNode.Nodes.Add(mongoDBNode); if (strDBName == MongoDBHelper.DATABASE_NAME_ADMIN) { if (config.AuthMode) { config.IsReadOnly = mongoConn.GetDatabase(strDBName).FindUser(config.UserName).IsReadOnly; } } } catch (Exception ex) { SystemManager.ExceptionDeal(ex, strDBName + "Exception", strDBName + "Exception"); mongoDBNode = new TreeNode(strDBName + " (Exception)"); mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; SvrInstanceNode.Nodes.Add(mongoDBNode); } } if (isServer) { SvrInstanceNode.Tag = SERVER_TAG + ":" + mongoConnKey + "/" + mongoConnKey; } else { if (mongoConn.ReplicaSetName != null) { SvrInstanceNode.Tag = SERVER_REPLSET_MEMBER_TAG + ":" + mongoConnKey + "/" + mServerInstace.Address.ToString().Replace(":", "@"); } } } if (_mongoInstanceLst.ContainsKey(ConnSvrKey)) { _mongoInstanceLst.Remove(ConnSvrKey); } if (!isServer) { _mongoInstanceLst.Add(ConnSvrKey, mServerInstace); } return(SvrInstanceNode); }
/// <summary> /// 获得一个表示数据库结构的节点 /// </summary> /// <param name="strDBName"></param> /// <param name="mongoSvr"></param> /// <param name="mongoSvrKey"></param> /// <returns></returns> private static TreeNode FillDataBaseInfoToTreeNode(String strDBName, MongoServer mongoSvr, String mongoSvrKey) { String strShowDBName = strDBName; if (!SystemManager.IsUseDefaultLanguage) { if (SystemManager.mStringResource.LanguageType == "Chinese") { switch (strDBName) { case DATABASE_NAME_ADMIN: strShowDBName = "管理员权限(admin)"; break; case "local": strShowDBName = "本地(local)"; break; case "config": strShowDBName = "配置(config)"; break; default: break; } } } TreeNode mongoDBNode = new TreeNode(strShowDBName); mongoDBNode.Tag = DATABASE_TAG + ":" + mongoSvrKey + "/" + strDBName; MongoDatabase mongoDB = mongoSvr.GetDatabase(strDBName); TreeNode UserNode = new TreeNode("User", (int)GetSystemIcon.MainTreeImageType.UserIcon, (int)GetSystemIcon.MainTreeImageType.UserIcon); UserNode.Tag = USER_LIST_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name + "/" + COLLECTION_NAME_USER; mongoDBNode.Nodes.Add(UserNode); TreeNode JsNode = new TreeNode("JavaScript", (int)GetSystemIcon.MainTreeImageType.JavaScriptList, (int)GetSystemIcon.MainTreeImageType.JavaScriptList); JsNode.Tag = JAVASCRIPT_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name + "/" + COLLECTION_NAME_JAVASCRIPT; mongoDBNode.Nodes.Add(JsNode); TreeNode GFSNode = new TreeNode("Grid File System", (int)GetSystemIcon.MainTreeImageType.GFS, (int)GetSystemIcon.MainTreeImageType.GFS); GFSNode.Tag = GRID_FILE_SYSTEM_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name + "/" + COLLECTION_NAME_GFS_FILES; mongoDBNode.Nodes.Add(GFSNode); TreeNode mongoSysColListNode = new TreeNode("Collections(System)", (int)GetSystemIcon.MainTreeImageType.SystemCol, (int)GetSystemIcon.MainTreeImageType.SystemCol); mongoSysColListNode.Tag = SYSTEM_COLLECTION_LIST_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name; mongoDBNode.Nodes.Add(mongoSysColListNode); TreeNode mongoColListNode = new TreeNode("Collections(General)", (int)GetSystemIcon.MainTreeImageType.CollectionList, (int)GetSystemIcon.MainTreeImageType.CollectionList); mongoColListNode.Tag = COLLECTION_LIST_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name; List <String> colNameList = mongoDB.GetCollectionNames().ToList <String>(); foreach (String strColName in colNameList) { switch (strColName) { case COLLECTION_NAME_USER: //system.users,fs,system.js这几个系统级别的Collection不需要放入 break; case COLLECTION_NAME_JAVASCRIPT: foreach (BsonDocument t in mongoDB.GetCollection(COLLECTION_NAME_JAVASCRIPT).FindAll()) { TreeNode js = new TreeNode(t.GetValue(KEY_ID).ToString()); js.ImageIndex = (int)GetSystemIcon.MainTreeImageType.JsDoc; js.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.JsDoc; js.Tag = JAVASCRIPT_DOC_TAG + ":" + mongoSvrKey + "/" + mongoDB.Name + "/" + COLLECTION_NAME_JAVASCRIPT + "/" + t.GetValue(KEY_ID).ToString(); JsNode.Nodes.Add(js); } break; default: TreeNode mongoColNode = new TreeNode(); try { mongoColNode = FillCollectionInfoToTreeNode(strColName, mongoDB, mongoSvrKey); } catch (Exception ex) { mongoColNode = new TreeNode(strColName + "[exception:]"); mongoColNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Err; mongoColNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Err; SystemManager.ExceptionDeal(ex); } if (IsSystemCollection(mongoDB.Name, strColName)) { switch (strColName) { case COLLECTION_NAME_GFS_CHUNKS: case COLLECTION_NAME_GFS_FILES: GFSNode.Nodes.Add(mongoColNode); break; default: mongoSysColListNode.Nodes.Add(mongoColNode); break; } } else { mongoColListNode.Nodes.Add(mongoColNode); } break; } } mongoDBNode.Nodes.Add(mongoColListNode); mongoDBNode.ImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; mongoDBNode.SelectedImageIndex = (int)GetSystemIcon.MainTreeImageType.Database; return(mongoDBNode); }
//http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart(旧网址) //http://docs.mongodb.org/manual/reference/sql-comparison/ /// <summary> /// Convert Query Sql To DataFilter /// </summary> /// <param name="Sql"></param> /// <returns></returns> public static DataFilter ConvertQuerySql(String Sql) { DataFilter rtnQuery = new DataFilter(); Sql = Sql.Trim(); //引号中的空格用 代替,引号以外的东西小写 Sql = Regular(Sql); //先将字符串里面的空格统一成单个空格 //Select A,B From C -> //Select A,B From C while (Sql.Contains(" ")) { Sql = Sql.Replace(" ", " "); } //找出Select ,From , Group String[] SqlToken = Sql.Split(" ".ToCharArray()); int SelectStartIndex = -1; int FromStartIndex = -1; int WhereStartIndex = -1; int GroupByStartIndex = -1; int OrderByStartIndex = -1; for (int i = 0; i < SqlToken.Length; i++) { switch (SqlToken[i].ToLower()) { case "select": SelectStartIndex = i; break; case "from": FromStartIndex = i; break; case "where": WhereStartIndex = i; break; case "group": GroupByStartIndex = i; break; case "order": OrderByStartIndex = i; break; default: break; } } String[] KeyWords = new String[] { "select", "from", "where", "group", "order" }; //From - > CollectionName String strFrom = GetKeyContent(FromStartIndex, SqlToken, KeyWords); MongoCollection mongoCol; //if ((strFrom != String.Empty) & SystemManager.GetCurrentDataBase().CollectionExists(strFrom)) //{ // mongoCol = SystemManager.GetCurrentDataBase().GetCollection(strFrom); //} //else //{ // return null; //} //From:由于当前肯定是从固定表里面取数据 mongoCol = SystemManager.GetCurrentCollection(); //Select 设定 必须项 //Select - > FieldList String strSelect = GetKeyContent(SelectStartIndex, SqlToken, KeyWords); if (strSelect == String.Empty) { return(null); } List <String> ColumnNameLst = MongoDBHelper.GetCollectionSchame(mongoCol); if (strSelect == "*") { //Select * foreach (String item in ColumnNameLst) { DataFilter.QueryFieldItem field = new DataFilter.QueryFieldItem(); field.ColName = item; field.IsShow = true; field.sortType = DataFilter.SortType.NoSort; rtnQuery.QueryFieldList.Add(field); } } else { //Select A,B,C foreach (String item in strSelect.Split(",".ToCharArray())) { DataFilter.QueryFieldItem field = new DataFilter.QueryFieldItem(); field.ColName = item; field.IsShow = true; field.sortType = DataFilter.SortType.NoSort; rtnQuery.QueryFieldList.Add(field); } } //Where 设定,可选项 String strWhere = GetKeyContent(WhereStartIndex, SqlToken, KeyWords); if (strWhere != String.Empty) { rtnQuery.QueryConditionList = SetQueryCondition(strWhere, ColumnNameLst); } //Order 设定,可选项 String strOrder = GetKeyContent(OrderByStartIndex, SqlToken, KeyWords); if (strOrder != String.Empty) { SetQueryOrder(rtnQuery, strOrder); } //Group 设定,可选项 String strGroup = GetKeyContent(GroupByStartIndex, SqlToken, KeyWords); if (strGroup != String.Empty) { //TODO:Group } return(rtnQuery); }
/// <summary> /// 数据库操作 /// </summary> /// <param name="strObjTag"></param> /// <param name="dbName"></param> /// <param name="func"></param> /// <param name="tr"></param> /// <returns></returns> public static String DataBaseOpration(String strObjTag, String dbName, Oprcode func, TreeNode tr) { String rtnResult = String.Empty; MongoServer mongoSvr = GetMongoServerBySvrPath(strObjTag); String strSvrPath = SystemManager.GetTagData(strObjTag); String svrKey = strSvrPath.Split("/".ToCharArray())[(int)PathLv.InstanceLv]; var result = new CommandResult(new BsonDocument()); if (mongoSvr != null) { switch (func) { case Oprcode.Create: if (!mongoSvr.DatabaseExists(dbName)) { //从权限上看,clusterAdmin是必须的 //但是能够建立数据库,不表示能够看到里面的内容! //dbAdmin可以访问数据库。 //clusterAdmin能创建数据库但是不能访问数据库。 try { mongoSvr.GetDatabase(dbName); tr.Nodes.Add(UIHelper.FillDataBaseInfoToTreeNode(dbName, mongoSvr, svrKey + "/" + svrKey)); } catch (Exception ex) { //如果使用没有dbAdmin权限的clusterAdmin。。。。 SystemManager.ExceptionDeal(ex); } } break; case Oprcode.Drop: if (mongoSvr.DatabaseExists(dbName)) { result = mongoSvr.DropDatabase(dbName); if (tr != null) { tr.TreeView.Nodes.Remove(tr); } if (!result.Response.Contains("err")) { return(String.Empty); } return(result.Response["err"].ToString()); } break; case Oprcode.Repair: //其实Repair的入口不在这个方法里面 CommandHelper.ExecuteMongoDBCommand(CommandHelper.repairDatabase_Command, SystemManager.GetCurrentDataBase()); break; default: break; } } return(rtnResult); }
/// <summary> /// 导入数据 /// </summary> /// <param name="parm"></param> /// <returns></returns> public static void ImportAccessDataBase(Object obj) { ImportAccessPara parm = (ImportAccessPara)obj; MongoServer mongoSvr = GetMongoServerBySvrPath(parm.strSvrPathWithTag); String[] fileName = parm.accessFileName.Split(@"\".ToCharArray()); String fileMain = fileName[fileName.Length - 1]; String insertDBName = fileMain.Split(".".ToCharArray())[0]; MongoDatabase mongoDB = mongoSvr.GetDatabase(insertDBName); OleDbConnection conn = new OleDbConnection(ACCESS_CONNECTION_STRING.Replace("@AccessPath", parm.accessFileName)); try { conn.Open(); int err = 0; DataTable tblTableList = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); String strCreateTableInfo = String.Empty; foreach (DataRow recTable in tblTableList.Rows) { String strTableName = recTable[2].ToString(); try { //不支持UTF....,执行会失败,但是Collection已经添加了 String ErrMsg; mongoDB.IsCollectionNameValid(strTableName, out ErrMsg); if (ErrMsg != null) { strCreateTableInfo = strTableName + " Create Error " + System.Environment.NewLine + strCreateTableInfo; OnActionDone(new ActionDoneEventArgs(strTableName + " IsCollectionNameValid Error ")); err++; continue; } mongoDB.CreateCollection(strTableName); strCreateTableInfo = strTableName + " Creating " + System.Environment.NewLine + strCreateTableInfo; OnActionDone(new ActionDoneEventArgs(strTableName + " Creating ")); } catch (Exception) { if (mongoDB.CollectionExists(strTableName)) { mongoDB.DropCollection(strTableName); } strCreateTableInfo = strTableName + " Create Error " + System.Environment.NewLine + strCreateTableInfo; OnActionDone(new ActionDoneEventArgs(strTableName + " Creating Error ")); err++; continue; } MongoCollection mongoCollection = mongoDB.GetCollection(strTableName); DataTable tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, strTableName, null }); Dictionary <String, String> colPro = new Dictionary <String, String>(); List <String> colName = new List <String>(); foreach (DataRow item in tblSchema.Rows) { long columnWidth; switch ((long)item["COLUMN_FLAGS"]) { case 122: columnWidth = -1; break; case 90: //AutoNumber columnWidth = -2; break; default: if (item["CHARACTER_MAXIMUM_LENGTH"] is DBNull) { columnWidth = -3; } else { columnWidth = (long)item["CHARACTER_MAXIMUM_LENGTH"]; } break; } colName.Add(item["COLUMN_NAME"].ToString()); colPro.Add(item["COLUMN_NAME"].ToString(), GetDataType((int)item["DATA_TYPE"], columnWidth, item["NUMERIC_PRECISION"] is DBNull ? 0 : (int)item["NUMERIC_PRECISION"], item["NUMERIC_SCALE"] is DBNull ? 0 : (int)item["NUMERIC_SCALE"])); } OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; cmd.CommandText = "Select * from " + strTableName; OleDbDataAdapter adapter = new OleDbDataAdapter(); DataSet dateSet = new DataSet(); adapter.SelectCommand = cmd; adapter.Fill(dateSet, strTableName); DataTable tblAccessData = dateSet.Tables[0]; foreach (DataRow itemRow in tblAccessData.Rows) { BsonDocument insertDoc = new BsonDocument(); for (int i = 0; i < colName.Count; i++) { if (!(itemRow[colName[i]] is DBNull)) { switch (colPro[colName[i]]) { case "VARCHAR": insertDoc.Add(colName[i], new BsonString(itemRow[colName[i]].ToString()), true); break; case "BIT": //System.Boolean Can't Cast To BSonBoolean.... //O,My LadyGaga if ((bool)itemRow[colName[i]]) { insertDoc.Add(colName[i], BsonBoolean.True, true); } else { insertDoc.Add(colName[i], BsonBoolean.False, true); } break; case "DATETIME": //O,My LadyGaga insertDoc.Add(colName[i], new BsonDateTime((DateTime)itemRow[colName[i]]), true); break; case "Integer": Int32 i32 = Convert.ToInt32(itemRow[colName[i]]); insertDoc.Add(colName[i], (BsonInt32)i32, true); break; case "Long": //itemRow[ColName[i]] the default is Int32 without convert long lng = Convert.ToInt64(itemRow[colName[i]]); insertDoc.Add(colName[i], (BsonInt64)lng, true); break; default: break; } } } mongoCollection.Insert <BsonDocument>(insertDoc); } } String strSvrPath = SystemManager.GetTagData(parm.strSvrPathWithTag); String strKey = strSvrPath.Split("/".ToCharArray())[(int)MongoDBHelper.PathLv.ConnectionLV] + "/" + strSvrPath.Split("/".ToCharArray())[(int)MongoDBHelper.PathLv.ServerLV]; parm.currentTreeNode.Nodes.Add(FillDataBaseInfoToTreeNode(insertDBName, mongoSvr, strKey)); MyMessageBox.ShowMessage("Import Message", (tblTableList.Rows.Count - err).ToString() + "Created " + err + "failed", strCreateTableInfo, true); } catch (Exception ex) { throw ex; } finally { conn.Close(); } }
/// <summary> /// /// </summary> /// <param name="SubNode"></param> /// <returns></returns> private static BsonDocument ConvertTreeNodeTozTreeBsonDoc(TreeNode SubNode) { BsonDocument SingleNode = new BsonDocument(); SingleNode.Add("name", SubNode.Text + GetTagText(SubNode)); if (SubNode.Nodes.Count == 0) { SingleNode.Add("icon", "MainTreeImage" + String.Format("{0:00}", SubNode.ImageIndex) + ".png"); } else { BsonArray ChildrenList = new BsonArray(); foreach (TreeNode item in SubNode.Nodes) { ChildrenList.Add(ConvertTreeNodeTozTreeBsonDoc(item)); } SingleNode.Add("children", ChildrenList); SingleNode.Add("icon", "MainTreeImage" + String.Format("{0:00}", SubNode.ImageIndex) + ".png"); } if (SubNode.IsExpanded) { SingleNode.Add("open", "true"); } if (SubNode.Tag != null) { SingleNode.Add("click", "ShowData('" + SystemManager.GetTagType(SubNode.Tag.ToString()) + "','" + SystemManager.GetTagData(SubNode.Tag.ToString()) + "')"); } return(SingleNode); }