diff --git a/csharp/LogicalType.cs b/csharp/LogicalType.cs index c2a905ba..7d07a75b 100644 --- a/csharp/LogicalType.cs +++ b/csharp/LogicalType.cs @@ -4,6 +4,32 @@ namespace ParquetSharp { public enum LogicalTypeEnum + { + Undefined = 0, + String = 1, + Map = 2, + List = 3, + Enum = 4, + Decimal = 5, + Date = 6, + Time = 7, + Timestamp = 8, + Interval = 9, + Int = 10, + Nil = 11, + Json = 12, + Bson = 13, + Uuid = 14, + None = 15, + Float16 = 16, + } + + /// + /// Type enum with values that match the C++ Parquet library. + /// These are not guaranteed to be stable between releases, but we need to keep + /// the LogicalTypeEnum values above stable to ensure ABI compatibility. + /// + internal enum CppLogicalTypeEnum { Undefined = 0, String = 1, @@ -21,7 +47,35 @@ public enum LogicalTypeEnum Bson = 13, Uuid = 14, Float16 = 15, - None = 16 + None = 16, + } + + internal static class CppLogicalTypeEnumExtensions + { + public static LogicalTypeEnum ToPublicEnum(this CppLogicalTypeEnum enumValue) + { + return enumValue switch + { + CppLogicalTypeEnum.Undefined => LogicalTypeEnum.Undefined, + CppLogicalTypeEnum.String => LogicalTypeEnum.String, + CppLogicalTypeEnum.Map => LogicalTypeEnum.Map, + CppLogicalTypeEnum.List => LogicalTypeEnum.List, + CppLogicalTypeEnum.Enum => LogicalTypeEnum.Enum, + CppLogicalTypeEnum.Decimal => LogicalTypeEnum.Decimal, + CppLogicalTypeEnum.Date => LogicalTypeEnum.Date, + CppLogicalTypeEnum.Time => LogicalTypeEnum.Time, + CppLogicalTypeEnum.Timestamp => LogicalTypeEnum.Timestamp, + CppLogicalTypeEnum.Interval => LogicalTypeEnum.Interval, + CppLogicalTypeEnum.Int => LogicalTypeEnum.Int, + CppLogicalTypeEnum.Nil => LogicalTypeEnum.Nil, + CppLogicalTypeEnum.Json => LogicalTypeEnum.Json, + CppLogicalTypeEnum.Bson => LogicalTypeEnum.Bson, + CppLogicalTypeEnum.Uuid => LogicalTypeEnum.Uuid, + CppLogicalTypeEnum.Float16 => LogicalTypeEnum.Float16, + CppLogicalTypeEnum.None => LogicalTypeEnum.None, + _ => throw new ArgumentOutOfRangeException(nameof(enumValue), enumValue, null) + }; + } } public abstract class LogicalType : IDisposable, IEquatable @@ -36,7 +90,7 @@ public void Dispose() Handle.Dispose(); } - public LogicalTypeEnum Type => ExceptionInfo.Return(Handle, LogicalType_Type); + public LogicalTypeEnum Type => ExceptionInfo.Return(Handle, LogicalType_Type).ToPublicEnum(); public bool Equals(LogicalType? other) { @@ -86,7 +140,7 @@ internal static LogicalType Create(IntPtr handle) throw new ArgumentNullException(nameof(handle)); } - var type = ExceptionInfo.Return(handle, LogicalType_Type); + var type = ExceptionInfo.Return(handle, LogicalType_Type).ToPublicEnum(); return type switch { @@ -114,7 +168,7 @@ internal static LogicalType Create(IntPtr handle) private static extern void LogicalType_Free(IntPtr logicalType); [DllImport(ParquetDll.Name)] - private static extern IntPtr LogicalType_Type(IntPtr logicalType, out LogicalTypeEnum type); + private static extern IntPtr LogicalType_Type(IntPtr logicalType, out CppLogicalTypeEnum type); [DllImport(ParquetDll.Name)] private static extern IntPtr LogicalType_Equals(IntPtr left, IntPtr right, [MarshalAs(UnmanagedType.I1)] out bool equals); diff --git a/csharp/ParquetSharp.csproj b/csharp/ParquetSharp.csproj index 637ca9da..38289bdb 100644 --- a/csharp/ParquetSharp.csproj +++ b/csharp/ParquetSharp.csproj @@ -12,7 +12,7 @@ true true 1591; - 15.0.2 + 15.0.2.1 G-Research G-Research ParquetSharp