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

Giorgi / DuckDB.NET / 12205588424

06 Dec 2024 08:20PM UTC coverage: 89.812% (+0.06%) from 89.755%
12205588424

push

github

Giorgi
Add test

1064 of 1219 branches covered (87.28%)

Branch coverage included in aggregate %.

0 of 1 new or added line in 1 file covered. (0.0%)

2083 of 2285 relevant lines covered (91.16%)

766681.44 hits per line

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

96.89
/DuckDB.NET.Data/Internal/ClrToDuckDBConverter.cs
1
using DuckDB.NET.Data.Extensions;
2
using DuckDB.NET.Native;
3
using System;
4
using System.Collections;
5
using System.Globalization;
6
using System.Numerics;
7

8
namespace DuckDB.NET.Data.Internal;
9

10
internal static class ClrToDuckDBConverter
11
{
12
    public static DuckDBValue ToDuckDBValue(this object? item, DuckDBLogicalType logicalType, DuckDBType duckDBType)
13
    {
14
        if (item.IsNull())
10,667✔
15
        {
16
            return NativeMethods.Value.DuckDBCreateNullValue();
3,958✔
17
        }
18

19
        return (duckDBType, item) switch
6,709!
20
        {
6,709✔
21
            (DuckDBType.Boolean, bool value) => NativeMethods.Value.DuckDBCreateBool(value),
240✔
22

6,709✔
23
            (DuckDBType.TinyInt, _) => NativeMethods.Value.DuckDBCreateInt8(ConvertTo<sbyte>()),
209✔
24
            (DuckDBType.SmallInt, _) => NativeMethods.Value.DuckDBCreateInt16(ConvertTo<short>()),
228✔
25
            (DuckDBType.Integer, _) => NativeMethods.Value.DuckDBCreateInt32(ConvertTo<int>()),
278✔
26
            (DuckDBType.BigInt, _) => NativeMethods.Value.DuckDBCreateInt64(ConvertTo<long>()),
221✔
27

6,709✔
28
            (DuckDBType.UnsignedTinyInt, _) => NativeMethods.Value.DuckDBCreateUInt8(ConvertTo<byte>()),
214✔
29
            (DuckDBType.UnsignedSmallInt, _) => NativeMethods.Value.DuckDBCreateUInt16(ConvertTo<ushort>()),
181✔
30
            (DuckDBType.UnsignedInteger, _) => NativeMethods.Value.DuckDBCreateUInt32(ConvertTo<uint>()),
297✔
31
            (DuckDBType.UnsignedBigInt, _) => NativeMethods.Value.DuckDBCreateUInt64(ConvertTo<ulong>()),
285✔
32

6,709✔
33
            (DuckDBType.Float, float value) => NativeMethods.Value.DuckDBCreateFloat(value),
277✔
34
            (DuckDBType.Double, double value) => NativeMethods.Value.DuckDBCreateDouble(value),
224✔
35

6,709✔
36
            (DuckDBType.Decimal, decimal value) => DecimalToDuckDBValue(value),
229✔
37
            (DuckDBType.HugeInt, BigInteger value) => NativeMethods.Value.DuckDBCreateHugeInt(new DuckDBHugeInt(value)),
178✔
38

6,709✔
39
            (DuckDBType.Varchar, string value) => StringToDuckDBValue(value),
328✔
40
            (DuckDBType.Uuid, Guid value) => GuidToDuckDBValue(value),
254✔
41

6,709✔
42
            (DuckDBType.Timestamp, DateTime value) => NativeMethods.Value.DuckDBCreateTimestamp(value.ToTimestampStruct(duckDBType)),
36✔
43
            (DuckDBType.TimestampS, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampS(value.ToTimestampStruct(duckDBType)),
18✔
44
            (DuckDBType.TimestampMs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampMs(value.ToTimestampStruct(duckDBType)),
18✔
45
            (DuckDBType.TimestampNs, DateTime value) => NativeMethods.Value.DuckDBCreateTimestampNs(value.ToTimestampStruct(duckDBType)),
18✔
46
            (DuckDBType.Interval, TimeSpan value) => NativeMethods.Value.DuckDBCreateInterval(value),
430✔
47
            (DuckDBType.Date, DateTime value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate((DuckDBDateOnly)value)),
555✔
48
            (DuckDBType.Date, DuckDBDateOnly value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate(value)),
254✔
49
            (DuckDBType.Time, DateTime value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime((DuckDBTimeOnly)value)),
18✔
50
            (DuckDBType.Time, DuckDBTimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
244✔
51
#if NET6_0_OR_GREATER
6,709✔
52
            (DuckDBType.Date, DateOnly value) => NativeMethods.Value.DuckDBCreateDate(NativeMethods.DateTimeHelpers.DuckDBToDate(value)),
225✔
53
            (DuckDBType.Time, TimeOnly value) => NativeMethods.Value.DuckDBCreateTime(NativeMethods.DateTimeHelpers.DuckDBToTime(value)),
404✔
54
#endif
6,709✔
55
            (DuckDBType.TimeTz, DateTimeOffset value) => DateTimeOffsetToTimeTzDuckDBValue(value),
435✔
56
            (DuckDBType.TimestampTz, DateTimeOffset value) => NativeMethods.Value.DuckDBCreateTimestamp(NativeMethods.DateTimeHelpers.DuckDBToTimestamp(DuckDBTimestamp.FromDateTime(value.DateTime))),
×
57
            (DuckDBType.Blob, byte[] value) => NativeMethods.Value.DuckDBCreateBlob(value, value.Length),
3✔
58
            (DuckDBType.List, ICollection value) => CreateCollectionValue(logicalType, value, true),
330✔
59
            (DuckDBType.Array, ICollection value) => CreateCollectionValue(logicalType, value, false),
66✔
60
            _ => throw new InvalidOperationException($"Cannot bind parameter type {item.GetType().FullName} to column of type {duckDBType}")
12✔
61
        };
6,709✔
62

63
        T ConvertTo<T>()
64
        {
65
            try
66
            {
67
                return (T)Convert.ChangeType(item, typeof(T));
1,913✔
68
            }
69
            catch (Exception)
×
70
            {
NEW
71
                throw new ArgumentOutOfRangeException($"Cannot bind parameter '{item}' type {item.GetType().FullName} to column of type {duckDBType}");
×
72
            }
73
        }
1,913✔
74
    }
75

76
    private static DuckDBValue CreateCollectionValue(DuckDBLogicalType logicalType, ICollection collection, bool isList)
77
    {
78
        using var collectionItemType = isList ? NativeMethods.LogicalType.DuckDBListTypeChildType(logicalType) :
396✔
79
                                                NativeMethods.LogicalType.DuckDBArrayTypeChildType(logicalType);
396✔
80

81
        var duckDBType = NativeMethods.LogicalType.DuckDBGetTypeId(collectionItemType);
396✔
82

83
        var values = new DuckDBValue[collection.Count];
396✔
84

85
        var index = 0;
396✔
86
        foreach (var item in collection)
20,452✔
87
        {
88
            var duckDBValue = item.ToDuckDBValue(collectionItemType, duckDBType);
9,830✔
89
            values[index] = duckDBValue;
9,830✔
90
            index++;
9,830✔
91
        }
92

93
        return isList ? NativeMethods.Value.DuckDBCreateListValue(collectionItemType, values, collection.Count)
396✔
94
                      : NativeMethods.Value.DuckDBCreateArrayValue(collectionItemType, values, collection.Count);
396✔
95
    }
396✔
96

97
    private static DuckDBValue GuidToDuckDBValue(Guid value)
98
    {
99
        using var handle = value.ToString().ToUnmanagedString();
254✔
100
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
254✔
101
    }
254✔
102

103
    private static DuckDBValue StringToDuckDBValue(string value)
104
    {
105
        using var handle = value.ToUnmanagedString();
328✔
106
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
328✔
107
    }
328✔
108

109
    private static DuckDBValue DecimalToDuckDBValue(decimal value)
110
    {
111
        using var handle = value.ToString(CultureInfo.InvariantCulture).ToUnmanagedString();
229✔
112
        return NativeMethods.Value.DuckDBCreateVarchar(handle);
229✔
113
    }
229✔
114

115
    private static DuckDBValue DateTimeOffsetToTimeTzDuckDBValue(DateTimeOffset val)
116
    {
117
        var duckDBToTime = NativeMethods.DateTimeHelpers.DuckDBToTime((DuckDBTimeOnly)val.DateTime);
435✔
118
        var duckDBCreateTimeTz = NativeMethods.DateTimeHelpers.DuckDBCreateTimeTz(duckDBToTime.Micros, (int)val.Offset.TotalSeconds);
435✔
119
        return NativeMethods.Value.DuckDBCreateTimeTz(duckDBCreateTimeTz);
435✔
120
    }
121
}
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