using System; using System.Reflection; using System.Collections; using System.Collections.Generic; using System.Xml; using oodb.mapping; using System.IO; using System.Reflection.Emit; using System.Linq; namespace oodb.index { public abstract class Index { public OODB OODB { get; } public FieldInfo FieldInfo { get; } public String FileName { get; } public FlatTypeMapping ValueMapping { get; } public FlatTypeMapping StorageMapping { get; protected set; } public Index(OODB oodb, FieldInfo fieldInfo) { OODB = oodb; FieldInfo = fieldInfo; ValueMapping = OODB.GetFlatTypeMapping(fieldInfo.FieldType); StorageMapping = ValueMapping; FileName = Path.Combine( OODB.StorageAdapter.GetTypeStorage(FieldInfo.DeclaringType).Directory.FullName, String.Format("index_{0}_{1}_{2}.xml", GetType().Name, FieldInfo.DeclaringType.Name, FieldInfo.Name) ); OODB.StorageAdapter.GetTypeStorage(fieldInfo.DeclaringType).AddIndex(this); Prepare(); Load(); } protected abstract void Prepare(); public abstract IEnumerable> RetrieveIndexValues(); public abstract void RestoreIndexValues(IEnumerable> indexValues); public abstract void Add(Persistent persistent); public abstract void Remove(Guid persistenceID); public void Remove(Persistent persistent) { Remove(persistent.PersistenceID); } public abstract IEnumerable Query(); public void Load() { if (File.Exists(FileName)) { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(FileName); RestoreIndexValues( xmlDocument.SelectNodes("/Index/Entry").Cast().Select((entry) => new KeyValuePair(Guid.Parse(entry.GetAttribute("PersistenceID")), StorageMapping.FromXml(entry.SelectSingleNode("Value") as XmlElement))) ); } } public void Save() { XmlDocument xmlDocument = new XmlDocument(); XmlElement indexElement = xmlDocument.CreateElement("Index"); indexElement.SetAttribute("Type", GetType().FullName); xmlDocument.AppendChild(indexElement); foreach (KeyValuePair entry in RetrieveIndexValues()) { XmlElement xmlEntry = xmlDocument.CreateElement("Entry"); xmlEntry.SetAttribute("PersistenceID", entry.Key.ToString()); xmlEntry.AppendChild(StorageMapping.ToXml(xmlDocument, entry.Value)); indexElement.AppendChild(xmlEntry); } xmlDocument.Save(FileName); } public override int GetHashCode() { return FileName.GetHashCode(); } public override bool Equals(object obj) { if (obj is Index) { Index other = obj as Index; return FileName.Equals(other.FileName); } return false; } } }