/// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 4
0
 /// <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;
         }
     }
 }
Exemplo n.º 5
0
        /// <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;
                }
            }
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 11
0
        /// <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);
        }
Exemplo n.º 14
0
        //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();
            //引号中的空格用&nbsp;代替,引号以外的东西小写
            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);
        }
Exemplo n.º 16
0
        /// <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);
        }