/// <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> /// Gey index names by space prefix /// </summary> /// <param name="space_name"></param> /// <returns></returns> private string[] get_indexes_for_space(string space_name) { List <string> lx = new List <string>(); string nm = space_name.Trim().ToLower(); for (int i = 0; i < index_list.Count; i++) { string[] parsed_name = new string[2]; parsed_name[0] = DEFS.ParseIndexSpace(index_list[i].Name); parsed_name[1] = DEFS.ParseIndexName(index_list[i].Name); if (nm == "") { if (parsed_name[0] == "") { lx.Add(parsed_name[1]); } } else { if (VSLib.Compare(nm, parsed_name[0])) { lx.Add(parsed_name[1]); } } } return(lx.ToArray()); }
/// <summary> /// Constructor - read index descriptor /// </summary> /// <param name="s"></param> /// <param name="addr"></param> internal VSIndex(VSpace space, long addr) { this.sp = space; this.ALLOCATION = sp.GetAllocationByDescriptor(addr); string s = ALLOCATION.ReadString(0, 4); if (s != DEFS.INDEX_SIGNATURE) { throw new VSException(DEFS.E0006_INVALID_SIGNATURE_CODE, " (Index Descriptor)"); } this.space_name = DEFS.ParseIndexSpace(this.Name); this.index_name = DEFS.ParseIndexName(this.Name); }
/// <summary> /// Constructor - create index descriptor /// </summary> /// <param name="s"></param> /// <param name="name"></param> /// <param name="unique"></param> internal VSIndex(VSpace space, string name, bool unique) { this.sp = space; this.ALLOCATION = sp.AllocateSpace(VSIndex.INDEX_DESCRIPTOR_LEN, DEFS.POOL_INDEX, true); this.ALLOCATION.Write(0, DEFS.INDEX_SIGNATURE); this.Name = name.Trim().ToLower(); this.ROOT = 0; this.POOL = 0; this.UNIQUE = (short)(unique ? 1 : 0); this.space_name = DEFS.ParseIndexSpace(this.Name); this.index_name = DEFS.ParseIndexName(this.Name); }
/// <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); } }