Implemented helper methods, equality, comparison and similar tools to make handling of NavObjects easier. Reject objects with a Company Name set, which we don't support at this point (not sure if this would acutally make sense).
Adapted test code.
This commit is contained in:
parent
e2eb504261
commit
28dbc5c7fa
@ -44,7 +44,7 @@ namespace NavScm.TestHost
|
|||||||
log.DebugFormat("Row {6}/{7}: Type {0}, ID {1}, Name {2}, Modified {3} {4}, Version {5}",
|
log.DebugFormat("Row {6}/{7}: Type {0}, ID {1}, Name {2}, Modified {3} {4}, Version {5}",
|
||||||
o.Type, o.ID, o.Name, o.Date.ToShortDateString(), o.Time.ToShortTimeString(), o.Version_List, i++, count);
|
o.Type, o.ID, o.Name, o.Date.ToShortDateString(), o.Time.ToShortTimeString(), o.Version_List, i++, count);
|
||||||
|
|
||||||
foundObjects.Add(String.Format("{0}.{1}", o.Type, o.ID), o);
|
foundObjects.Add(o.CacheKey, o);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.InfoFormat("Collection has {0} entries, writing to cache.xml", foundObjects.Count);
|
log.InfoFormat("Collection has {0} entries, writing to cache.xml", foundObjects.Count);
|
||||||
|
@ -7,8 +7,141 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace NavScm.NavInterface
|
namespace NavScm.NavInterface
|
||||||
{
|
{
|
||||||
partial class NavObject
|
/// <summary>
|
||||||
|
/// Adds a mapping between the NAV SQL Type field an enum to make its handling easier.
|
||||||
|
/// </summary>
|
||||||
|
public enum NavObjectType
|
||||||
{
|
{
|
||||||
|
TableData = 0,
|
||||||
|
Table = 1,
|
||||||
|
Report = 3,
|
||||||
|
Codeunit = 5,
|
||||||
|
XmlPort = 6,
|
||||||
|
MenuSuite = 7,
|
||||||
|
Page = 8,
|
||||||
|
Query = 9
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>
|
||||||
|
/// This class wraps the actual NAV Object table data retrieved from the target database.
|
||||||
|
/// It adds additional helper functions to manage the cache accociated with it.
|
||||||
|
/// </para>
|
||||||
|
/// <para>
|
||||||
|
/// Note, that equality is defined by the DB primary key, which in turn includes
|
||||||
|
/// Type and ID. See <see cref="P:NavScm.NavInterface.NavObject.CacheKey">CacheKey</see>
|
||||||
|
/// for details. This sequence is also used for ordering of the object in case of
|
||||||
|
/// a sorted output.
|
||||||
|
/// </para>
|
||||||
|
/// <para>
|
||||||
|
/// Note, that object entries with a Company Name set are rejected at this point. They
|
||||||
|
/// result (probably) from a multi-tenancy/extension setup, which we do not support at
|
||||||
|
/// this time. As well, objects with unknown object types are rejected.
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="NavSQLDataContext"/>
|
||||||
|
/// <seealso cref="NavObjectType"/>
|
||||||
|
partial class NavObject : IEquatable<NavObject>, IComparable, IComparable<NavObject>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Validate restrictions on supported objects as outlined in the class description.
|
||||||
|
/// </summary>
|
||||||
|
partial void OnLoaded()
|
||||||
|
{
|
||||||
|
if (Company_Name.Length > 0)
|
||||||
|
throw new InvalidOperationException($"The object {CacheKey} holds a variant with the company name {Company_Name}, which is unsupported");
|
||||||
|
if (Type < 0 || Type == 2 || Type == 4 || Type > 9)
|
||||||
|
throw new InvalidOperationException($"The object type of {CacheKey} is unsupported");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Casts the SQL type to the corresponding Enum.
|
||||||
|
/// </summary>
|
||||||
|
public NavObjectType NavType
|
||||||
|
{
|
||||||
|
get { return (NavObjectType)Type; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>
|
||||||
|
/// Constructs an object cache key to uniquely identify the object out of its type and ID.
|
||||||
|
/// Uses the string representation to make debugging easier. The equality operator maps to
|
||||||
|
/// this key as well.
|
||||||
|
/// </para>
|
||||||
|
/// <para>
|
||||||
|
/// Note, that the company Name is ignored here, as we do not support this scenario at this
|
||||||
|
/// time and throw an error just in case.
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
public string CacheKey
|
||||||
|
{
|
||||||
|
get {
|
||||||
|
return $"{Type}.{ID}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts the Date and Time fields to a combined Date/Time value.
|
||||||
|
/// </summary>
|
||||||
|
public DateTime Modified
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Date.Add(Time.TimeOfDay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs a hash key based on Type and ID.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Take 4 Bits of object Type and 28 bits of the actual object ID and shuffle them around
|
||||||
|
/// to create the hash key.</returns>
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return
|
||||||
|
// lower 8 bits of ID first
|
||||||
|
(ID << 24)
|
||||||
|
// second byte of ID goes next
|
||||||
|
& ((ID << 8) ^ 0x00ff0000)
|
||||||
|
// third byte of ID goes next
|
||||||
|
& ((ID >> 8) ^ 0x0000ff00)
|
||||||
|
// lower 4 bits of fourth ID byte go next
|
||||||
|
& ((ID >> 20) ^ 0x000000f0)
|
||||||
|
// finally add the first four bits of the Type
|
||||||
|
& (Type ^ 0x0000000f)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (!(obj is NavObject)) return false;
|
||||||
|
return Equals((NavObject) obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(NavObject other)
|
||||||
|
{
|
||||||
|
return Type == other.Type
|
||||||
|
&& ID == other.ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompareTo(NavObject other)
|
||||||
|
{
|
||||||
|
if (Type < other.Type)
|
||||||
|
return -1;
|
||||||
|
if (Type > other.Type)
|
||||||
|
return +1;
|
||||||
|
if (ID < other.ID)
|
||||||
|
return -1;
|
||||||
|
if (ID > other.ID)
|
||||||
|
return +1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CompareTo(object obj)
|
||||||
|
{
|
||||||
|
if (!(obj is NavObject))
|
||||||
|
throw new InvalidOperationException("obj is not an NavObject");
|
||||||
|
return this.CompareTo((NavObject)obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user