Esempio n. 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;
            }
        }
Esempio n. 2
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);
            }
        }