Esempio n. 1
0
        // create a new scene
        public JsonResult AddNewScene(string user, [FromBody] CreateSceneRequest newScene)
        {
            // authentication
            if (!_grp.AuthenticatorInstance.IsValidUser(user))
            {
                return(Json(_grp.AuthenticatorInstance.ErrorResponse(Request.Path.ToString())));
            }

            // parameter check
            // verify that lights given by parameters are all known to us
            var lights        = _grp.DatabaseInstance.GetCollection <Light>("lights");
            var lightsInGroup = new LiteDB.BsonArray();

            var count = lights.Count(x => newScene.Lights.Contains(x.Id.ToString()));

            if (count != newScene.Lights.Count)
            {
                return(Json(new List <Dictionary <string, object> >
                {
                    new Dictionary <string, object>
                    {
                        ["failure"] = "Trying to add a non-existent light id into group"
                    }
                }));
            }

            // insert new scene
            var scene = new Scene
            {
                Name        = newScene.Name,
                Recycle     = newScene.Recycle,
                Picture     = newScene.Picture ?? "",
                Lights      = newScene.Lights,
                Appdata     = newScene.AppData,
                Type        = newScene.Type ?? "LightScene",
                Version     = 2,
                Owner       = user,
                Lastupdated = DateTime.UtcNow,
                LightStates = new Dictionary <string, GroupAction>()
            };

            var scenes = _grp.DatabaseInstance.GetCollection <Scene>("scenes");
            var id     = scenes.Insert(scene);

            return(Json(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object>
                {
                    ["success"] = new Dictionary <string, string>
                    {
                        ["id"] = $"{id}"
                    }
                }
            }));
        }
Esempio n. 2
0
        /// <summary>
        /// Read an BsonArray from reader
        /// </summary>
        public LiteDB.BsonArray ReadArray(ByteReader reader)
        {
            var length = reader.ReadInt32();
            var end    = reader.Position + length - 5;
            var arr    = new LiteDB.BsonArray();

            while (reader.Position < end)
            {
                var value = this.ReadElement(reader, out string name);
                arr.Add(value);
            }

            reader.ReadByte(); // zero

            return(arr);
        }
Esempio n. 3
0
        /// <summary>
        /// Read all database pages from v7 structure into a flexible BsonDocument - only read what really needs
        /// </summary>
        private LiteDB.BsonDocument ReadPage(uint pageID)
        {
            if (pageID * V7_PAGE_SIZE > _stream.Length)
            {
                return(null);
            }

            _stream.Position = pageID * V7_PAGE_SIZE; // v7 uses 4k page size

            _stream.Read(_buffer, 0, V7_PAGE_SIZE);

            // decrypt encrypted page (except header page - header are plain data)
            var reader = new ByteReader(_buffer);

            // reading page header
            var page = new LiteDB.BsonDocument
            {
                ["pageID"]     = (int)reader.ReadUInt32(),
                ["pageType"]   = (int)reader.ReadByte(),
                ["prevPageID"] = (int)reader.ReadUInt32(),
                ["nextPageID"] = (int)reader.ReadUInt32(),
                ["itemCount"]  = (int)reader.ReadUInt16()
            };

            // skip freeByte + reserved
            reader.ReadBytes(2 + 8);

            #region Header (1)

            // read header
            if (page["pageType"] == 1)
            {
                var info = reader.ReadString(27);
                var ver  = reader.ReadByte();

                if (string.CompareOrdinal(info, HeaderPage_HEADER_INFO) != 0 || ver != 7)
                {
                    throw new LiteDB.LiteException("");
                }

                // skip ChangeID + FreeEmptyPageID + LastPageID
                reader.ReadBytes(2 + 4 + 4);
                page["userVersion"] = (int)reader.ReadUInt16();
                page["password"]    = reader.ReadBytes(20);
                page["salt"]        = reader.ReadBytes(16);
                page["collections"] = new LiteDB.BsonDocument();

                var cols = reader.ReadByte();

                for (var i = 0; i < cols; i++)
                {
                    var name      = reader.ReadString();
                    var colPageID = reader.ReadUInt32();

                    page["collections"].WriteIndex(name, (int)colPageID);
                }
            }

            #endregion

            #region Collection (2)

            // collection page
            else if (page["pageType"] == 2)
            {
                page["collectionName"] = reader.ReadString();
                page["indexes"]        = new LiteDB.BsonArray();
                reader.ReadBytes(12);

                for (var i = 0; i < 16; i++)
                {
                    var index = new LiteDB.BsonDocument();

                    var field = reader.ReadString();
                    var eq    = field.IndexOf('=');

                    if (eq > 0)
                    {
                        index["name"]       = field.Substring(0, eq);
                        index["expression"] = field.Substring(eq + 1);
                    }
                    else
                    {
                        index["name"]       = field;
                        index["expression"] = "$." + field;
                    }

                    index["unique"]     = reader.ReadBoolean();
                    index["headPageID"] = (int)reader.ReadUInt32();

                    // skip HeadNode (index) + TailNode + FreeIndexPageID
                    reader.ReadBytes(2 + 6 + 4);

                    if (field.Length > 0)
                    {
                        page["indexes"].AsArray.Add(index);
                    }
                }
            }

            #endregion

            #region Index (3)
            else if (page["pageType"] == 3)
            {
                page["nodes"] = new LiteDB.BsonArray();

                for (var i = 0; i < page["itemCount"].AsInt32; i++)
                {
                    var node = new LiteDB.BsonDocument
                    {
                        ["index"] = (int)reader.ReadUInt16()
                    };

                    var levels = reader.ReadByte();

                    // skip Slot + PrevNode + NextNode
                    reader.ReadBytes(1 + 6 + 6);

                    var length = reader.ReadUInt16();

                    // skip DataType + KeyValue
                    reader.ReadBytes(1 + length);

                    node["dataBlock"] = new LiteDB.BsonDocument
                    {
                        ["pageID"] = (int)reader.ReadUInt32(),
                        ["index"]  = (int)reader.ReadUInt16()
                    };

                    // reading Prev[0]
                    node["prev"] = new LiteDB.BsonDocument
                    {
                        ["pageID"] = (int)reader.ReadUInt32(),
                        ["index"]  = (int)reader.ReadUInt16()
                    };

                    // reading Next[0]
                    node["next"] = new LiteDB.BsonDocument
                    {
                        ["pageID"] = (int)reader.ReadUInt32(),
                        ["index"]  = (int)reader.ReadUInt16()
                    };

                    // skip Prev/Next[1..N]
                    reader.ReadBytes((levels - 1) * (6 + 6));

                    page["nodes"].AsArray.Add(node);
                }
            }

            #endregion

            #region Data (4)
            else if (page["pageType"] == 4)
            {
                page["blocks"] = new LiteDB.BsonArray();

                for (var i = 0; i < page["itemCount"].AsInt32; i++)
                {
                    var block = new LiteDB.BsonDocument
                    {
                        ["index"]        = (int)reader.ReadUInt16(),
                        ["extendPageID"] = (int)reader.ReadUInt32()
                    };

                    var length = reader.ReadUInt16();

                    block["data"] = reader.ReadBytes(length);

                    page["blocks"].AsArray.Add(block);
                }
            }

            #endregion

            #region Extend (5)
            else if (page["pageType"] == 5)
            {
                page["data"] = reader.ReadBytes(page["itemCount"].AsInt32);
            }

            #endregion

            return(page);
        }
Esempio n. 4
0
        // create a new group
        public JsonResult AddNewGroup(string user, [FromBody] CreateGroupRequest newGroup)
        {
            // authentication
            if (!_grp.AuthenticatorInstance.IsValidUser(user))
            {
                return(Json(_grp.AuthenticatorInstance.ErrorResponse(Request.Path.ToString())));
            }

            // parameter check
            var parametersOK = false;

            if (newGroup != null)
            {
                if (newGroup.Name != null && newGroup.Name.Length > 0)
                {
                    if (newGroup.Lights != null && newGroup.Lights.Count > 0)
                    {
                        parametersOK = true;
                        if (newGroup.Class == null || newGroup.Class.Length == 0)
                        {
                            newGroup.Class = "Other";
                        }
                        if (newGroup.Type == null || newGroup.Type.Length == 0)
                        {
                            newGroup.Type = "LightGroup";
                        }
                    }
                }
            }
            if (!parametersOK)
            {
                return(Json(new List <Dictionary <string, object> >
                {
                    new Dictionary <string, object>
                    {
                        ["failure"] = "Invalid parameter"
                    }
                }));
            }

            // verify that lights given by parameters are all known to us
            var lights        = _grp.DatabaseInstance.GetCollection <Light>("lights");
            var lightsInGroup = new LiteDB.BsonArray();

            var count = lights.Count(x => newGroup.Lights.Contains(x.Id.ToString()));

            if (count != newGroup.Lights.Count)
            {
                return(Json(new List <Dictionary <string, object> >
                {
                    new Dictionary <string, object>
                    {
                        ["failure"] = "Trying to add a non-existent light id into group"
                    }
                }));
            }

            // all good, add new group into database
            var group = new Group
            {
                Name   = newGroup.Name,
                Class  = newGroup.Class,
                Type   = newGroup.Type,
                Lights = newGroup.Lights,
                Action = new GroupAction(),
                State  = new GroupState()
            };

            var groups = _grp.DatabaseInstance.GetCollection <Group>("groups");
            var id     = groups.Insert(group);

            return(Json(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object>
                {
                    ["success"] = new Dictionary <string, string>
                    {
                        ["id"] = $"{id}"
                    }
                }
            }));
        }