internal interface ILinksInfo {
/// <summary>
/// Хэндлы объектов, которые ссылаются на
/// данный объект.
/// </summary>
List<Db.Handle> BottomHandles { get; }
/// <summary>
/// Хэндлы объектов, на которые ссылается
/// данный объект.
/// </summary>
List<Db.Handle> TopHandles { get; }
}
/// <summary>
/// Базовая реализация интерфейса ILinksInfo
/// </summary>
[Serializable]
internal class LinksInfo : ILinksInfo {
List<Db.Handle> bottomHandles;
List<Db.Handle> topHandles;
public List<Db.Handle> BottomHandles {
get { return bottomHandles; }
}
public List<Db.Handle> TopHandles {
get { return topHandles; }
}
}
/// <summary>
/// Диспетчер ссылок для конкретной Database.
/// </summary>
internal sealed class LinksDispatcher :
IDisposable {
Dictionary<Db.Handle, List<ILinksInfo>> dict;
internal Dictionary<Db.Handle,
List<ILinksInfo>> Dictionary {
get { return dict; }
set { dict = value; }
}
Db.Database db = null;
public Db.Database Database {
get { return db; }
private set { db = value; }
}
public LinksDispatcher(Db.Database _db) {
Database = _db;
// Проверяем, хранится ли в Database наша
// информация о связях.
if(LinkInfoExists(Database)) {
// Если хранится, то читаем её.
dict = ReadLinkInfo(Database);
// Проверяем целостность информации:
// объекты указанных хэндлов существуют,
// корректны и не удалены. Те, которые не
// соотвтетствуют - убираем из структуры.
dict = CheckInfo(Database, dict);
}
else {
// Если не хранится - создаём новую
// структуру для её хранения.
dict = CreateDictInfo(Database);
}
// Регистрируемся на интересующие нас
// события
Database.ObjectAppended += Database_ObjectAppended;
Database.ObjectErased += Database_ObjectErased;
Database.ObjectModified += Database_ObjectModified;
}
void Database_ObjectModified(object sender,
Db.ObjectEventArgs e) {
throw new NotImplementedException();
}
void Database_ObjectErased(object sender,
Db.ObjectErasedEventArgs e) {
throw new NotImplementedException();
}
void Database_ObjectAppended(object sender,
Db.ObjectEventArgs e) {
throw new NotImplementedException();
}
// Генерируем новую структуру, предназначенную
// для хранения информации о связях.
private Dictionary<Db.Handle,
List<ILinksInfo>> CreateDictInfo(
Db.Database Database) {
Dictionary<Db.Handle,
List<ILinksInfo>> dict =
new Dictionary<Db.Handle,
List<ILinksInfo>>();
for(Int64 i = db.BlockTableId.Handle
.Value; i < db.Handseed.Value; i++) {
Db.ObjectId id = Db.ObjectId.Null;
Db.Handle h = new Db.Handle(i);
Boolean result = db.TryGetObjectId(h,
out id) && !id.IsNull && id.IsValid
&& !id.IsErased &&
!id.IsEffectivelyErased;
if(result)
dict.Add(new Db.Handle(i),
new List<ILinksInfo>());
}
return dict;
}
// Проверяем целостность информации:
// объекты указанных хэндлов существуют,
// корректны и не удалены. Те, которые не
// соотвтетствуют - убираем из структуры.
private Dictionary<Db.Handle,
List<ILinksInfo>> CheckInfo(
Db.Database Database,
Dictionary<Db.Handle, List<ILinksInfo>>
dict) {
throw new NotImplementedException();
}
// Читаем из Database ранее нами сохранённую
// информацию о связях.
private Dictionary<Db.Handle,
List<ILinksInfo>> ReadLinkInfo(
Db.Database Database) {
throw new NotImplementedException();
}
// Проверка на то, хранится ли уже в Database
// наша информация о связях.
private bool LinkInfoExists(
Db.Database Database) {
throw new NotImplementedException();
}
public void Dispose() {
// Сохраняем в базу данных информацию о связях.
SaveLinkInfo(Database);
}
// Сохраняем в базу данных информацию о связях.
private void SaveLinkInfo(Db.Database Database) {
throw new NotImplementedException();
}
}