/// <summary> /// Returns node by ParentIdAndNodeId /// </summary> /// <param name="parentNodeId"></param> /// <param name="nodeId"></param> /// <returns></returns> public DataAsTree GetNodeByParentIdAndNodeId(long parentNodeId, long nodeId, DBreeze.Transactions.Transaction tran) { CheckTransaction(tran); SetupReadTables(tran); var row = nt2Read.Select <byte[], byte[]>(parentNodeId.To_8_bytes_array_BigEndian().Concat(nodeId.To_8_bytes_array_BigEndian())); if (row.Exists) { return(SetupNodeFromRow(row)); } return(null); }
/// <summary> /// <para>Adding children to the node</para> /// Table, storing data structure, must be in tran.SynchronizeTables list. /// Then transaction must be Committed in the end by the programmer. /// </summary> /// <param name="node"></param> /// <returns>return node with setup parent id</returns> public DataAsTree AddNode(DataAsTree node) { CheckTransaction(); if (node == null) { throw new Exception("Nodes is not supplied"); } SetupWriteTables(); byte[] val = null; long maxId = this.RootNode.Transaction.Select <byte[], long>(this.RootNode.DBreezeTableName, new byte[] { 1 }).Value; bool skipToFillNameIndex = false; if (node.NodeId == 0) { //Insert node.ParentNodeId = this.NodeId; maxId++; node.NodeId = maxId; } else { //Update if (node.NodeId == node.ParentNodeId) { throw new Exception("node.NodeId can't be equal to node.ParentNodeId"); } var oldRow = this.RootNode.nt2Write.Select <byte[], byte[]>(node.ParentNodeId.To_8_bytes_array_BigEndian().Concat(node.NodeId.To_8_bytes_array_BigEndian())); if (oldRow.Exists) { var oldNode = SetupNodeFromRow(oldRow); if (!oldNode.NodeName.Equals(node.NodeName, StringComparison.OrdinalIgnoreCase)) { RemoveOldNodeFromNameIndex(oldNode.NodeName, node.ParentNodeId.To_8_bytes_array_BigEndian().Concat(node.NodeId.To_8_bytes_array_BigEndian())); } else { skipToFillNameIndex = true; } } else { if (maxId >= node.NodeId && maxId >= node.ParentNodeId) { //Such NodeId was probably deleted, and now wants to be reconnected. //We allow that } else { if (node.NodeId == node.ParentNodeId) { throw new Exception("Supplied node.NodeId or node.ParentNodeId don't exist"); } } } } //ParentNodeId(long),NodeId(long) byte[] key = node.ParentNodeId.To_8_bytes_array_BigEndian() .Concat(node.NodeId.To_8_bytes_array_BigEndian()); if (node.NodeContent != null) { node.ContentRef = this.RootNode.nt2Write.InsertDataBlock(node.ContentRef, node.NodeContent); } else { node.ContentRef = null; } val = SetupValueRowFromNode(node, 1); CopyInternals(node); this.RootNode.nt2Write.Insert <byte[], byte[]>(key, val); /*node.NodeName index support*/ if (!skipToFillNameIndex) { DBreeze.DataTypes.Row <string, byte[]> nodeNameIndexRow = null; byte[] btNodeNameIndex = null; nodeNameIndexRow = nt3Write.Select <string, byte[]>(node.NodeName.ToLower()); if (nodeNameIndexRow.Exists) { btNodeNameIndex = nodeNameIndexRow.Value.Concat(key); } else { btNodeNameIndex = key; } this.RootNode.nt3Write.Insert <string, byte[]>(node.NodeName.ToLower(), btNodeNameIndex); } /*-----------------------------*/ //Latest used Id this.RootNode.Transaction.Insert <byte[], long>(this.RootNode.DBreezeTableName, new byte[] { 1 }, maxId); return(node); }//eo func
/// <summary> /// <para>Adding children to the node</para> /// Table, storing data structure, must be in tran.SynchronizeTables list. /// Then transaction must be Committed in the end by the programmer. /// </summary> /// <param name="nodes">Nodes to add to current node</param> /// <param name="tran">Existing transaction. Table, storing data structure, must be in tran.SynchronizeTables list</param> /// <param name="maximalSpeed">set it to true to gain maximal saving speed</param> public void AddNodes(IEnumerable <DataAsTree> nodes, DBreeze.Transactions.Transaction tran, bool maximalSpeed = false) { CheckTransaction(tran); if (nodes == null || nodes.Count() == 0) { throw new Exception("Nodes are not supplied"); } SetupWriteTables(tran, maximalSpeed); byte[] val = null; long maxId = tran.Select <byte[], long>(this.DBreezeTableName, new byte[] { 1 }).Value; DBreeze.DataTypes.Row <string, byte[]> nodeNameIndexRow = null; byte[] btNodeNameIndex = null; bool skipToFillNameIndex = false; foreach (var node in nodes) { if (node == null) { throw new Exception("Node can't be empty"); } skipToFillNameIndex = false; if (node.NodeId == 0) { //Insert node.ParentNodeId = this.NodeId; maxId++; node.NodeId = maxId; } else { //Update var oldRow = nt2Write.Select <byte[], byte[]>(node.ParentNodeId.To_8_bytes_array_BigEndian().Concat(node.NodeId.To_8_bytes_array_BigEndian())); if (oldRow.Exists) { var oldNode = SetupNodeFromRow(oldRow); if (!oldNode.NodeName.Equals(node.NodeName, StringComparison.OrdinalIgnoreCase)) { RemoveOldNodeFromNameIndex(oldNode.NodeName, node.ParentNodeId.To_8_bytes_array_BigEndian().Concat(node.NodeId.To_8_bytes_array_BigEndian())); } else { skipToFillNameIndex = true; } } else { //Fake? Creating new Row node.ParentNodeId = this.NodeId; maxId++; node.NodeId = maxId; } } //ParentNodeId(long),NodeId(long) byte[] key = node.ParentNodeId.To_8_bytes_array_BigEndian() .Concat(node.NodeId.To_8_bytes_array_BigEndian()); if (node.NodeContent != null) { node.ContentRef = nt2Write.InsertDataBlock(node.ContentRef, node.NodeContent); } else { node.ContentRef = null; } val = SetupValueRowFromNode(node, 1); CopyInternals(node); nt2Write.Insert <byte[], byte[]>(key, val); /*node.NodeName index support*/ if (!skipToFillNameIndex) { nodeNameIndexRow = nt3Write.Select <string, byte[]>(node.NodeName.ToLower()); if (nodeNameIndexRow.Exists) { btNodeNameIndex = nodeNameIndexRow.Value.Concat(key); } else { btNodeNameIndex = key; } nt3Write.Insert <string, byte[]>(node.NodeName.ToLower(), btNodeNameIndex); } /*-----------------------------*/ } //Latest used Id tran.Insert <byte[], long>(this.DBreezeTableName, new byte[] { 1 }, maxId); }//eo func