// 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}" } } })); }
/// <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); }
/// <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); }
// 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}" } } })); }