Example #1
0
        /// <summary>
        /// Delete existing index
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public void DeleteIndex(string name)
        {
            if (IndexSpace != null)
            {
                IndexSpace.DeleteIndex(DEFS.PrepareFullIndexName(this.Name, name));
            }
            else
            {
                VSIndex x = this.get_index(name);
                if (x == null)
                {
                    throw new VSException(DEFS.E0052_DELETE_INDEX_ERROR_CODE, "- index is not found - '" + name + "'");
                }

                // Remove all references
                VSIndex ref_x = get_index(DEFS.PrepareFullIndexName(DEFS.ParseIndexSpace(name), DEFS.INDEX_CROSS_REFERENCES));
                x.Reset();
                while (x.Next())
                {
                    long[] refs = x.CurrentRefs;
                    for (int i = 0; i < refs.Length; i++)
                    {
                        byte[] key = VSLib.ConvertLongToByte(refs[i]);
                        ref_x.delete_node(key, x.CurrentAvlNode.ID);
                    }
                }

                index_list.Remove(x);
                index_list_full.Remove(x);
                x.purge();
            }
        }
Example #2
0
        /// <summary>
        /// Create index
        /// </summary>
        /// <param name="name"></param>
        public VSIndex CreateIndex(string name, bool unique)
        {
            string nm = name.Trim().ToLower();

            if (nm.IndexOf(DEFS.INDEX_CROSS_REFERENCES) >= 0)
            {
                throw new VSException(DEFS.E0050_CREATE_INDEX_ERROR_CODE, "- invalid index name: '" + nm + "'");
            }


            if (IndexSpace != null)
            {
                return(IndexSpace.CreateIndex(DEFS.PrepareFullIndexName(this.Name, name), unique));
            }
            else
            {
                if (index_exists(nm))
                {
                    throw new VSException(DEFS.E0050_CREATE_INDEX_ERROR_CODE, "- index already exists: '" + nm + "'");
                }

                VSIndex ix = new VSIndex(this, nm, unique);

                index_list.Add(ix);

                index_list_full.Add(ix);

                set_ref_index(ix);

                return(ix);
            }
        }
Example #3
0
 /// <summary>
 /// Get index by name
 /// </summary>
 /// <param name="name"></param>
 /// <returns></returns>
 public VSIndex GetIndex(string name)
 {
     if (IndexSpace != null)
     {
         return(IndexSpace.GetIndex(DEFS.PrepareFullIndexName(this.Name, name)));
     }
     else
     {
         return(get_index(name, false));
     }
 }
Example #4
0
        /////////////////////////////////////////////////////////////////////////
        /////////////////// Indexes management //////////////////////////////////
        /////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Check if index already exists (user - accessible)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public bool IndexExists(string name)
        {
            if (IndexSpace != null)
            {
                return(IndexSpace.IndexExists(DEFS.PrepareFullIndexName(this.Name, name)));
            }
            else
            {
                return(index_exists(name, false));
            }
        }
Example #5
0
        /// <summary>
        /// Remove all related indexes for object by ID
        /// ONLY for objects and indexes located in THIS space
        /// </summary>
        /// <param name="a"></param>
        private void remove_all_indexes(string space_name, long id)
        {
            VSIndex ref_index = this.get_index(DEFS.PrepareFullIndexName(space_name, DEFS.INDEX_CROSS_REFERENCES));

            if (ref_index != null)
            {
                byte[] key = VSLib.ConvertLongToByteReverse(id);

                long[] ref_nodes = ref_index.FindAll(key, false);         // Get all avl node ids for obj id

                ref_index.delete_node(key, -1);                           // Remove reference record

                for (int i = 0; i < ref_nodes.Length; i++)
                {
                    this.get_index(this.GetAllocation(ref_nodes[i]).ReadLong(VSAvlNode.INDEX_POS)).delete_avl_node(ref_nodes[i], id);
                }
            }
        }
Example #6
0
        /// <summary>
        /// Add/Create reference
        /// </summary>
        /// <param name="index"></param>
        private void set_ref_index(VSIndex index)
        {
            string[] parsed_name = new string [2];
            parsed_name[0] = DEFS.ParseIndexSpace(index.Name);
            parsed_name[1] = DEFS.ParseIndexName(index.Name);

            string ref_name = DEFS.PrepareFullIndexName(parsed_name[0], DEFS.INDEX_CROSS_REFERENCES);

            if (this.index_exists(ref_name))
            {
                index.XRefs = this.get_index(ref_name);
            }
            else
            {
                VSIndex ref_index = new VSIndex(this, ref_name, false);
                index.XRefs = ref_index;
                index_list_full.Add(ref_index);
            }
        }