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