Exemplo n.º 1
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