diff --git a/DBCD.IO/Attributes/ForeignReferenceAttribute.cs b/DBCD.IO/Attributes/ForeignReferenceAttribute.cs new file mode 100644 index 0000000..56d84a5 --- /dev/null +++ b/DBCD.IO/Attributes/ForeignReferenceAttribute.cs @@ -0,0 +1,16 @@ + +using System; +using System.Collections.Generic; +using System.Text; + +namespace DBCD.IO.Attributes +{ + public class ForeignReferenceAttribute : Attribute + { + public readonly string ForeignTable; + public readonly string ForeignColumn; + + public ForeignReferenceAttribute(string foreignTable, string foreignColumn) => (ForeignTable, ForeignColumn) = (foreignTable, foreignColumn); + + } +} diff --git a/DBCD.IO/Attributes/SizeInBitsAttribute.cs b/DBCD.IO/Attributes/SizeInBitsAttribute.cs new file mode 100644 index 0000000..6704489 --- /dev/null +++ b/DBCD.IO/Attributes/SizeInBitsAttribute.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace DBCD.IO.Attributes +{ + public class SizeInBitsAttribute: Attribute + { + public readonly ushort Size; + + public SizeInBitsAttribute(ushort size) => Size = size; + } +} diff --git a/DBCD.IO/DBParser.cs b/DBCD.IO/DBParser.cs index f01f1d9..b9eda52 100644 --- a/DBCD.IO/DBParser.cs +++ b/DBCD.IO/DBParser.cs @@ -5,6 +5,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; + +[assembly:InternalsVisibleTo("DBCD")] namespace DBCD.IO { @@ -23,6 +26,7 @@ public class DBParser public uint LayoutHash => _reader.LayoutHash; public int IdFieldIndex => _reader.IdFieldIndex; public DB2Flags Flags => _reader.Flags; + internal ColumnMetaData[] ColumnMeta => _reader.ColumnMeta; #endregion public DBParser(string fileName) : this(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { } diff --git a/DBCD/DBCDBuilder.cs b/DBCD/DBCDBuilder.cs index 1b51bc7..b95b98c 100644 --- a/DBCD/DBCDBuilder.cs +++ b/DBCD/DBCDBuilder.cs @@ -77,6 +77,7 @@ internal Tuple Build(DBParser dbcReader, Stream dbd, string name var columns = new List(fields.Length); bool localiseStrings = locale != Locale.None; + var metadataIndex = 0; foreach (var fieldDefinition in fields) { var columnDefinition = databaseDefinition.columnDefinitions[fieldDefinition.name]; @@ -100,6 +101,15 @@ internal Tuple Build(DBParser dbcReader, Stream dbd, string name if (fieldDefinition.isID) { AddAttribute(field, fieldDefinition.isNonInline); + } + + if (!fieldDefinition.isNonInline) + { + if (metadataIndex < dbcReader.ColumnMeta.Length) + { + AddAttribute(field, dbcReader.ColumnMeta[metadataIndex].Size); + } + metadataIndex++; } if (fieldDefinition.arrLength > 1) @@ -113,6 +123,11 @@ internal Tuple Build(DBParser dbcReader, Stream dbd, string name AddAttribute(field, metaDataFieldType, fieldDefinition.isNonInline); } + if (!string.IsNullOrEmpty(columnDefinition.foreignTable)) + { + AddAttribute(field, columnDefinition.foreignTable, columnDefinition.foreignColumn); + } + if (isLocalisedString) { if (localiseStrings) diff --git a/DBCD/DBCDStorage.cs b/DBCD/DBCDStorage.cs index 253d362..d2f45d7 100644 --- a/DBCD/DBCDStorage.cs +++ b/DBCD/DBCDStorage.cs @@ -107,6 +107,7 @@ public bool Create(int index, Action f) public interface IDBCDStorage : IEnumerable>, IDictionary { string[] AvailableColumns { get; } + uint LayoutHash { get; } DBCDRow ConstructRow(int index); @@ -129,6 +130,7 @@ public interface IDBCDStorage : IEnumerable>, IDictiona private readonly DBParser parser; string[] IDBCDStorage.AvailableColumns => this.info.availableColumns; + public uint LayoutHash => this.storage.LayoutHash; public override string ToString() => $"{this.info.tableName}"; public DBCDStorage(Stream stream, DBCDInfo info) : this(new DBParser(stream), info) { } @@ -146,6 +148,7 @@ public DBCDStorage(DBParser parser, Storage storage, DBCDInfo info) : base(ne base.Add(record.Key, new DBCDRow(record.Key, record.Value, fieldAccessor)); } + public void ApplyingHotfixes(HotfixReader hotfixReader) { this.ApplyingHotfixes(hotfixReader, null);