• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / SchemaSaurus / 27082301842

07 Jun 2026 04:09AM UTC coverage: 86.906% (-0.1%) from 87.024%
27082301842

push

github

pwelter34
Merge branch 'main' of https://github.com/loresoft/SchemaSaurus

1065 of 1430 branches covered (74.48%)

Branch coverage included in aggregate %.

5738 of 6398 relevant lines covered (89.68%)

227.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.29
/src/SchemaSaurus.Oracle/OracleTypeMapper.cs
1
using System.Collections.Frozen;
2
using System.Data;
3

4
using Oracle.ManagedDataAccess.Client;
5

6
namespace SchemaSaurus.Oracle;
7

8
/// <summary>
9
/// Provides mappings from Oracle native data type names to common .NET data type metadata.
10
/// </summary>
11
public static class OracleTypeMapper
12
{
13
    private static readonly FrozenDictionary<string, (DbType DbType, OracleDbType OracleDbType, Type SystemType, bool? IsUnicode, bool? IsFixedLength)> OracleTypeMappings
1✔
14
        = new Dictionary<string, (DbType DbType, OracleDbType OracleDbType, Type SystemType, bool? IsUnicode, bool? IsFixedLength)>(StringComparer.OrdinalIgnoreCase)
1✔
15
        {
1✔
16
            ["NUMBER"] = (DbType.Decimal, OracleDbType.Decimal, typeof(decimal), null, null),
1✔
17
            ["FLOAT"] = (DbType.Double, OracleDbType.Double, typeof(double), null, null),
1✔
18
            ["BINARY_FLOAT"] = (DbType.Single, OracleDbType.Single, typeof(float), null, null),
1✔
19
            ["BINARY_DOUBLE"] = (DbType.Double, OracleDbType.Double, typeof(double), null, null),
1✔
20
            ["CHAR"] = (DbType.AnsiStringFixedLength, OracleDbType.Char, typeof(string), false, true),
1✔
21
            ["VARCHAR2"] = (DbType.AnsiString, OracleDbType.Varchar2, typeof(string), false, false),
1✔
22
            ["VARCHAR"] = (DbType.AnsiString, OracleDbType.Varchar2, typeof(string), false, false),
1✔
23
            ["LONG"] = (DbType.AnsiString, OracleDbType.Long, typeof(string), false, false),
1✔
24
            ["NCHAR"] = (DbType.StringFixedLength, OracleDbType.NChar, typeof(string), true, true),
1✔
25
            ["NVARCHAR2"] = (DbType.String, OracleDbType.NVarchar2, typeof(string), true, false),
1✔
26
            ["CLOB"] = (DbType.AnsiString, OracleDbType.Clob, typeof(string), false, false),
1✔
27
            ["NCLOB"] = (DbType.String, OracleDbType.NClob, typeof(string), true, false),
1✔
28
            ["RAW"] = (DbType.Binary, OracleDbType.Raw, typeof(byte[]), null, false),
1✔
29
            ["LONG RAW"] = (DbType.Binary, OracleDbType.LongRaw, typeof(byte[]), null, false),
1✔
30
            ["BLOB"] = (DbType.Binary, OracleDbType.Blob, typeof(byte[]), null, false),
1✔
31
            ["DATE"] = (DbType.DateTime, OracleDbType.Date, typeof(DateTime), null, null),
1✔
32
            ["TIMESTAMP"] = (DbType.DateTime2, OracleDbType.TimeStamp, typeof(DateTime), null, null),
1✔
33
            ["TIMESTAMP WITH TIME ZONE"] = (DbType.DateTimeOffset, OracleDbType.TimeStampTZ, typeof(DateTimeOffset), null, null),
1✔
34
            ["TIMESTAMP WITH LOCAL TIME ZONE"] = (DbType.DateTimeOffset, OracleDbType.TimeStampLTZ, typeof(DateTimeOffset), null, null),
1✔
35
            ["INTERVAL YEAR TO MONTH"] = (DbType.Object, OracleDbType.IntervalYM, typeof(string), null, null),
1✔
36
            ["INTERVAL DAY TO SECOND"] = (DbType.Object, OracleDbType.IntervalDS, typeof(TimeSpan), null, null),
1✔
37
            ["ROWID"] = (DbType.AnsiString, OracleDbType.Varchar2, typeof(string), false, false),
1✔
38
            ["UROWID"] = (DbType.AnsiString, OracleDbType.Varchar2, typeof(string), false, false),
1✔
39
            ["XMLTYPE"] = (DbType.Xml, OracleDbType.XmlType, typeof(string), true, false),
1✔
40
            ["JSON"] = (DbType.String, OracleDbType.Json, typeof(string), true, false),
1✔
41
            ["BFILE"] = (DbType.Object, OracleDbType.BFile, typeof(byte[]), null, false),
1✔
42
            ["SDO_GEOMETRY"] = (DbType.Object, OracleDbType.Object, typeof(object), null, null),
1✔
43
            ["MDSYS.SDO_GEOMETRY"] = (DbType.Object, OracleDbType.Object, typeof(object), null, null),
1✔
44
        }.ToFrozenDictionary();
1✔
45

46
    private static readonly FrozenDictionary<DbType, OracleDbType> DbTypeToOracleDbTypeMappings
1✔
47
        = new Dictionary<DbType, OracleDbType>
1✔
48
        {
1✔
49
            [DbType.AnsiString] = OracleDbType.Varchar2,
1✔
50
            [DbType.AnsiStringFixedLength] = OracleDbType.Char,
1✔
51
            [DbType.Binary] = OracleDbType.Raw,
1✔
52
            [DbType.Boolean] = OracleDbType.Boolean,
1✔
53
            [DbType.Byte] = OracleDbType.Byte,
1✔
54
            [DbType.Currency] = OracleDbType.Decimal,
1✔
55
            [DbType.Date] = OracleDbType.Date,
1✔
56
            [DbType.DateTime] = OracleDbType.Date,
1✔
57
            [DbType.DateTime2] = OracleDbType.TimeStamp,
1✔
58
            [DbType.DateTimeOffset] = OracleDbType.TimeStampTZ,
1✔
59
            [DbType.Decimal] = OracleDbType.Decimal,
1✔
60
            [DbType.Double] = OracleDbType.Double,
1✔
61
            [DbType.Guid] = OracleDbType.Raw,
1✔
62
            [DbType.Int16] = OracleDbType.Int16,
1✔
63
            [DbType.Int32] = OracleDbType.Int32,
1✔
64
            [DbType.Int64] = OracleDbType.Int64,
1✔
65
            [DbType.Object] = OracleDbType.Object,
1✔
66
            [DbType.Single] = OracleDbType.Single,
1✔
67
            [DbType.String] = OracleDbType.NVarchar2,
1✔
68
            [DbType.StringFixedLength] = OracleDbType.NChar,
1✔
69
            [DbType.Time] = OracleDbType.IntervalDS,
1✔
70
            [DbType.Xml] = OracleDbType.XmlType,
1✔
71
        }.ToFrozenDictionary();
1✔
72

73
    private static readonly FrozenDictionary<OracleDbType, DbType> OracleDbTypeToDbTypeMappings
1✔
74
        = new Dictionary<OracleDbType, DbType>
1✔
75
        {
1✔
76
            [OracleDbType.BFile] = DbType.Object,
1✔
77
            [OracleDbType.Blob] = DbType.Binary,
1✔
78
            [OracleDbType.Boolean] = DbType.Boolean,
1✔
79
            [OracleDbType.Byte] = DbType.Byte,
1✔
80
            [OracleDbType.Char] = DbType.AnsiStringFixedLength,
1✔
81
            [OracleDbType.Clob] = DbType.AnsiString,
1✔
82
            [OracleDbType.Date] = DbType.DateTime,
1✔
83
            [OracleDbType.Decimal] = DbType.Decimal,
1✔
84
            [OracleDbType.Double] = DbType.Double,
1✔
85
            [OracleDbType.Int16] = DbType.Int16,
1✔
86
            [OracleDbType.Int32] = DbType.Int32,
1✔
87
            [OracleDbType.Int64] = DbType.Int64,
1✔
88
            [OracleDbType.IntervalDS] = DbType.Object,
1✔
89
            [OracleDbType.IntervalYM] = DbType.Object,
1✔
90
            [OracleDbType.Json] = DbType.String,
1✔
91
            [OracleDbType.Long] = DbType.AnsiString,
1✔
92
            [OracleDbType.LongRaw] = DbType.Binary,
1✔
93
            [OracleDbType.NChar] = DbType.StringFixedLength,
1✔
94
            [OracleDbType.NClob] = DbType.String,
1✔
95
            [OracleDbType.NVarchar2] = DbType.String,
1✔
96
            [OracleDbType.Object] = DbType.Object,
1✔
97
            [OracleDbType.Raw] = DbType.Binary,
1✔
98
            [OracleDbType.Single] = DbType.Single,
1✔
99
            [OracleDbType.TimeStamp] = DbType.DateTime2,
1✔
100
            [OracleDbType.TimeStampLTZ] = DbType.DateTimeOffset,
1✔
101
            [OracleDbType.TimeStampTZ] = DbType.DateTimeOffset,
1✔
102
            [OracleDbType.Varchar2] = DbType.AnsiString,
1✔
103
            [OracleDbType.XmlType] = DbType.Xml,
1✔
104
        }.ToFrozenDictionary();
1✔
105

106
    /// <summary>
107
    /// Maps an Oracle native data type name to its corresponding <see cref="DbType"/>, provider type, CLR type, and text attributes.
108
    /// </summary>
109
    /// <param name="typeName">The Oracle native type name (for example, <c>VARCHAR2</c> or <c>TIMESTAMP(6)</c>).</param>
110
    /// <returns>
111
    /// A tuple containing mapped <see cref="DbType"/>, <see cref="OracleDbType"/>, CLR <see cref="Type"/>,
112
    /// and optional Unicode/fixed-length flags. Unknown types map to object defaults.
113
    /// </returns>
114
    public static (DbType DbType, OracleDbType OracleDbType, Type SystemType, bool? IsUnicode, bool? IsFixedLength) MapNativeType(string typeName)
115
    {
116
        var normalizedTypeName = NormalizeTypeName(typeName);
1,129✔
117
        if (OracleTypeMappings.TryGetValue(normalizedTypeName, out var mapping))
1,129!
118
            return mapping;
1,129✔
119

120
        return (DbType.Object, OracleDbType.Object, typeof(object), null, null);
×
121
    }
122

123
    /// <summary>
124
    /// Maps a <see cref="DbType"/> value to its closest Oracle-specific <see cref="OracleDbType"/> value.
125
    /// </summary>
126
    /// <param name="dbType">The provider-independent database type to map.</param>
127
    /// <returns>The closest matching <see cref="OracleDbType"/> value. Unknown values map to <see cref="OracleDbType.Object"/>.</returns>
128
    public static OracleDbType ToOracleDbType(DbType dbType)
129
    {
130
        if (DbTypeToOracleDbTypeMappings.TryGetValue(dbType, out var oracleDbType))
×
131
            return oracleDbType;
×
132

133
        return OracleDbType.Object;
×
134
    }
135

136
    /// <summary>
137
    /// Maps an Oracle-specific <see cref="OracleDbType"/> value to its closest provider-independent <see cref="DbType"/> value.
138
    /// </summary>
139
    /// <param name="oracleDbType">The Oracle-specific database type to map.</param>
140
    /// <returns>The closest matching <see cref="DbType"/> value. Unknown values map to <see cref="DbType.Object"/>.</returns>
141
    public static DbType ToDbType(OracleDbType oracleDbType)
142
    {
143
        if (OracleDbTypeToDbTypeMappings.TryGetValue(oracleDbType, out var dbType))
×
144
            return dbType;
×
145

146
        return DbType.Object;
×
147
    }
148

149
    private static string NormalizeTypeName(string typeName)
150
    {
151
        var timestampIndex = typeName.IndexOf("(", StringComparison.Ordinal);
1,129✔
152
        if (timestampIndex > 0)
1,129✔
153
            typeName = typeName[..timestampIndex];
279✔
154

155
        return typeName.Trim().ToUpperInvariant();
1,129✔
156
    }
157
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc