Пример #1
0
        public string Execute(string command, out int objectCount, IDocumentPrettyPrint printer)
        {
            objectCount = 0;
            try
            {
                _lastCollectionUsed = null;
                int      take;
                string   collectionName, operation, sort;
                string   innerCommand = ParseCollectionAndOperation(command, out collectionName, out operation, out take, out sort);
                Document doc, sortDoc = null;
                switch (operation)
                {
                case "find":
                    doc = DocumentExtensions.Parse(innerCommand);
                    if (!string.IsNullOrEmpty(sort))
                    {
                        sortDoc = DocumentExtensions.Parse(sort);
                    }
                    using (var db = MDB.GetMongo())
                    {
                        var l = db[DataBaseName][collectionName].Find(doc, take, 0);
                        if (sortDoc != null)
                        {
                            l.Sort(sortDoc);
                        }
                        objectCount         = l.Documents.Count();
                        _lastCollectionUsed = collectionName;
                        return(printer.Print(l.Documents));
                    }
                    break;

                case "findone":
                    doc = DocumentExtensions.Parse(innerCommand);
                    using (var db = MDB.GetMongo())
                    {
                        var l = db[DataBaseName][collectionName].FindOne(doc);
                        objectCount         = 1;
                        _lastCollectionUsed = collectionName;
                        return(printer.Print(l));
                    }
                    break;

                case "update":
                    var args = SplitIntoArguments(innerCommand);
                    using (var db = MDB.GetMongo())
                    {
                        objectCount = 0;
                        if (args.Count == 1 && args[0] is Document)
                        {
                            UpdateObjectAlwaysUpsert(collectionName, args[0] as Document, db);
                        }
                        else if (args.Count == 2 && args[0] is Document && args[1] is Document)
                        {
                            db[DataBaseName][collectionName].Update(args[1] as Document, args[0] as Document);
                        }
                        else if (args.Count == 3 && args[0] is Document && args[1] is Document && (args[2] is double || args[2] is bool))
                        {
                            int upsert = GetIntboolFromDoubleOrBool(args[2]);
                            db[DataBaseName][collectionName].Update(args[1] as Document, args[0] as Document, upsert);
                        }
                        else if (args.Count == 4 && args[0] is Document && args[1] is Document && (args[2] is double || args[2] is bool) &&
                                 (args[3] is double || args[3] is bool))
                        {
                            int multi = GetIntboolFromDoubleOrBool(args[3]);
                            if (multi == 1)
                            {
                                db[DataBaseName][collectionName].UpdateAll(args[1] as Document, args[0] as Document);
                            }
                            else
                            {
                                int upsert = GetIntboolFromDoubleOrBool(args[2]);
                                db[DataBaseName][collectionName].Update(args[1] as Document, args[0] as Document, upsert);
                            }
                        }
                        else
                        {
                            return("Syntax update(doc) or update(sel, doc, [upsert 1 or 0, [multi 1 or 0]])");
                        }

                        return("Sent update command");
                    }
                    break;

                case "eval":
                    string        function;
                    List <object> oargs;
                    if (!SplitIntoFunctionAndArguments(innerCommand, out function, out oargs))
                    {
                        return("Parse error");
                    }
                    using (var db = MDB.GetMongo())
                    {
                        if (oargs != null && oargs.Count > 0)
                        {
                            doc = DocumentExtensions.Eval(function, oargs.ToArray());
                        }
                        else
                        {
                            doc = DocumentExtensions.Eval(function);
                        }
                        var retVal = db[DataBaseName].SendCommand(doc);
                        return(printer.Print(retVal));
                    }
                    break;

                case "count":
                    doc = DocumentExtensions.Parse(innerCommand);
                    using (var db = MDB.GetMongo())
                    {
                        long count;
                        if (doc != null)
                        {
                            count = db[DataBaseName][collectionName].Count(doc);
                        }
                        else
                        {
                            count = db[DataBaseName][collectionName].Count();
                        }
                        return("Count " + count);
                    }
                    break;

                case "delete":
                    doc = DocumentExtensions.Parse(innerCommand);
                    using (var db = MDB.GetMongo())
                    {
                        if (doc != null)
                        {
                            db[DataBaseName][collectionName].Delete(doc);
                        }
                        return("Sent delete command");
                    }
                    break;

                default:
                    return("Unknown operation '" + operation + "'");

                    break;
                }
            }
            catch (MongoCommandException e)
            {
                return(e.Error.ToString());
            }
            catch (Exception e)
            {
                return(e.Message);
            }
        }
Пример #2
0
 public static Task <SemanticModel> GetSemanticModelForNodeAsync(this Document document, SyntaxNode?node, CancellationToken cancellationToken)
 => DocumentExtensions.ReuseExistingSpeculativeModelAsync(document, node, cancellationToken);
        /// <summary>
        /// TODO We need to have some events from providers to invalidate the cache if some project's
        /// target frameworks are changed (in this case we just need to remove/update cache items that have
        /// same DTE as changed project).
        ///  For now cache will be invalidated when solution is closed and reopened.
        /// </summary>
        /// <param name="filePath">Path to a code file being analyzed</param>
        /// <returns></returns>
        public IEnumerable <TargetFrameworkMetadata> GetTargetFrameworks(string filePath)
        {
            IEnumerable <TargetFrameworkMetadata> resultFrameworks = null;
            string uniqueProjectName = null;

            // try to get framework info for a given file from cache
            lock (_cacheLock)
            {
                if (FilesCache.TryGetValue(filePath, out uniqueProjectName) &&
                    ProjectFrameworksCache.TryGetValue(uniqueProjectName, out resultFrameworks))
                {
                    return(resultFrameworks);
                }
            }

            if (Providers == null || !Providers.Any())
            {
                return(null);
            }

            ThreadHelper.JoinableTaskFactory.Run(async delegate
            {
                // Switch to main thread
                await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
                try
                {
                    var container  = ServiceProvider.GetService <IComponentModel, SComponentModel>();
                    var dteProject = DocumentExtensions.GetVsHierarchy(filePath, ServiceProvider).GetDTEProject();

                    if (dteProject == null)
                    {
                        return;
                    }

                    var provider = Providers.FirstOrDefault(x => x.SupportsProject(dteProject));
                    if (provider != null)
                    {
                        uniqueProjectName = dteProject.UniqueName;
                        resultFrameworks  = provider.GetTargetFrameworks(dteProject);
                    }
                }
                catch (Exception e)
                {
                    // Add to Package Manager console?
                    Debug.Write(string.Format("{0}. Stack trace: {1}", e.Message, e.StackTrace));
                }
            });

            // add file and project frameworks to cache
            lock (_cacheLock)
            {
                if (ProjectFrameworksCache.Keys.Contains(uniqueProjectName))
                {
                    ProjectFrameworksCache[uniqueProjectName] = resultFrameworks;
                }
                else
                {
                    ProjectFrameworksCache.Add(uniqueProjectName, resultFrameworks);
                }

                if (FilesCache.Keys.Contains(filePath))
                {
                    FilesCache[filePath] = uniqueProjectName;
                }
                else
                {
                    FilesCache.Add(filePath, uniqueProjectName);
                }
            }

            return(resultFrameworks);
        }