Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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
Exemplo n.º 3
0
        /// <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