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

Giorgi / DuckDB.NET / 13181075586

06 Feb 2025 02:31PM UTC coverage: 89.958% (+0.02%) from 89.937%
13181075586

push

github

Giorgi
Merge branch 'develop'

1081 of 1235 branches covered (87.53%)

Branch coverage included in aggregate %.

322 of 345 new or added lines in 20 files covered. (93.33%)

2 existing lines in 1 file now uncovered.

2108 of 2310 relevant lines covered (91.26%)

760504.66 hits per line

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

93.94
/DuckDB.NET.Data/DuckDBAppenderRow.cs
1
using DuckDB.NET.Data.DataChunk.Writer;
2
using DuckDB.NET.Native;
3
using System;
4
using System.Collections.Generic;
5
using System.Numerics;
6

7
namespace DuckDB.NET.Data;
8

9
public class DuckDBAppenderRow : IDuckDBAppenderRow
10
{
11
    private int columnIndex = 0;
12
    private readonly string qualifiedTableName;
13
    private readonly VectorDataWriterBase[] vectorWriters;
14
    private readonly ulong rowIndex;
15
    private readonly DuckDBDataChunk dataChunk;
16
    private readonly Native.DuckDBAppender nativeAppender;
17

18
    internal DuckDBAppenderRow(string qualifiedTableName, VectorDataWriterBase[] vectorWriters,
354,978✔
19
                               ulong rowIndex, DuckDBDataChunk dataChunk, Native.DuckDBAppender nativeAppender)
354,978✔
20
    {
21
        this.qualifiedTableName = qualifiedTableName;
354,978✔
22
        this.vectorWriters = vectorWriters;
354,978✔
23
        this.rowIndex = rowIndex;
354,978✔
24
        this.dataChunk = dataChunk;
354,978✔
25
        this.nativeAppender = nativeAppender;
354,978✔
26
    }
354,978✔
27

28
    public void EndRow()
29
    {
30
        if (columnIndex < vectorWriters.Length)
354,960✔
31
        {
32
            throw new InvalidOperationException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you specified only {columnIndex} values");
3✔
33
        }
34
    }
354,957✔
35

36
    public IDuckDBAppenderRow AppendNullValue() => AppendValueInternal<int?>(null); //Doesn't matter what type T we pass to Append when passing null.
75✔
37

38
    public IDuckDBAppenderRow AppendValue(bool? value) => AppendValueInternal(value);
69✔
39

40
    public IDuckDBAppenderRow AppendValue(byte[]? value) => AppendSpan(value);
6✔
41

42
    public IDuckDBAppenderRow AppendValue(Span<byte> value) => AppendSpan(value);
3✔
43

44
    public IDuckDBAppenderRow AppendValue(string? value) => AppendValueInternal(value);
45,108✔
45

46
    public IDuckDBAppenderRow AppendValue(decimal? value) => AppendValueInternal(value);
270✔
47

48
    public IDuckDBAppenderRow AppendValue(Guid? value) => AppendValueInternal(value);
105,003✔
49

50
    public IDuckDBAppenderRow AppendValue(BigInteger? value) => AppendValueInternal(value);
60✔
51

52
    #region Append Signed Int
53

54
    public IDuckDBAppenderRow AppendValue(sbyte? value) => AppendValueInternal(value);
84✔
55

56
    public IDuckDBAppenderRow AppendValue(short? value) => AppendValueInternal(value);
60✔
57

58
    public IDuckDBAppenderRow AppendValue(int? value) => AppendValueInternal(value);
249,798✔
59

60
    public IDuckDBAppenderRow AppendValue(long? value) => AppendValueInternal(value);
60✔
61

62
    #endregion
63

64
    #region Append Unsigned Int
65

66
    public IDuckDBAppenderRow AppendValue(byte? value) => AppendValueInternal(value);
66✔
67

68
    public IDuckDBAppenderRow AppendValue(ushort? value) => AppendValueInternal(value);
60✔
69

70
    public IDuckDBAppenderRow AppendValue(uint? value) => AppendValueInternal(value);
60✔
71

72
    public IDuckDBAppenderRow AppendValue(ulong? value) => AppendValueInternal(value);
60✔
73

74
    #endregion
75

76
    #region Append Enum
77

78
    public IDuckDBAppenderRow AppendValue<TEnum>(TEnum? value) where TEnum : Enum => AppendValueInternal(value);
15✔
79

80
    #endregion
81

82
    #region Append Float
83

84
    public IDuckDBAppenderRow AppendValue(float? value) => AppendValueInternal(value);
60✔
85

86
    public IDuckDBAppenderRow AppendValue(double? value) => AppendValueInternal(value);
120✔
87

88
    #endregion
89

90
    #region Append Temporal
91
#if NET6_0_OR_GREATER
NEW
92
    public IDuckDBAppenderRow AppendValue(DateOnly? value) => AppendValueInternal(value);
×
93

NEW
94
    public IDuckDBAppenderRow AppendValue(TimeOnly? value) => AppendValueInternal(value);
×
95
#endif
96

97
    public IDuckDBAppenderRow AppendValue(DuckDBDateOnly? value) => AppendValueInternal(value);
120✔
98

99
    public IDuckDBAppenderRow AppendValue(DuckDBTimeOnly? value) => AppendValueInternal(value);
60✔
100

101

102
    public IDuckDBAppenderRow AppendValue(DateTime? value) => AppendValueInternal(value);
15,330✔
103

104
    public IDuckDBAppenderRow AppendValue(DateTimeOffset? value) => AppendValueInternal(value);
120✔
105

106
    public IDuckDBAppenderRow AppendValue(TimeSpan? value)
107
    {
108
        return AppendValueInternal(value);
60✔
109
    }
110

111
    #endregion
112

113
    #region Composite Types
114

115
    public IDuckDBAppenderRow AppendValue<T>(IEnumerable<T>? value) => AppendValueInternal(value);
498,006✔
116

117
    #endregion
118

119
    public IDuckDBAppenderRow AppendDefault()
120
    {
121
        CheckColumnAccess();
9✔
122

123
        var state = NativeMethods.Appender.DuckDBAppendDefaultToChunk(nativeAppender, dataChunk, rowIndex, columnIndex);
9✔
124

125
        if (state == DuckDBState.Error)
9!
126
        {
NEW
127
            DuckDBAppender.ThrowLastError(nativeAppender);
×
128
        }
129

130
        columnIndex++;
9✔
131
        return this;
9✔
132
    }
133

134
    private DuckDBAppenderRow AppendValueInternal<T>(T? value)
135
    {
136
        CheckColumnAccess();
914,724✔
137

138
        vectorWriters[columnIndex].WriteValue(value, rowIndex);
914,721✔
139

140
        columnIndex++;
914,706✔
141

142
        return this;
914,706✔
143
    }
144

145
    private unsafe IDuckDBAppenderRow AppendSpan(Span<byte> val)
146
    {
147
        if (val == null)
9✔
148
        {
149
            return AppendNullValue();
3✔
150
        }
151

152
        CheckColumnAccess();
6✔
153

154
        fixed (byte* pSource = val)
6✔
155
        {
156
            vectorWriters[columnIndex].AppendBlob(pSource, val.Length, rowIndex);
6✔
157
        }
158

159
        columnIndex++;
6✔
160
        return this;
6✔
161
    }
162

163
    private void CheckColumnAccess()
164
    {
165
        if (columnIndex >= vectorWriters.Length)
914,739✔
166
        {
167
            throw new IndexOutOfRangeException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you are trying to append value for column {columnIndex + 1}");
3✔
168
        }
169
    }
914,736✔
170
}
171

172
public interface IDuckDBAppenderRow
173
{
174
    void EndRow();
175
    IDuckDBAppenderRow AppendNullValue();
176
    IDuckDBAppenderRow AppendValue(bool? value);
177
    IDuckDBAppenderRow AppendValue(byte[]? value);
178
    IDuckDBAppenderRow AppendValue(Span<byte> value);
179
    IDuckDBAppenderRow AppendValue(string? value);
180
    IDuckDBAppenderRow AppendValue(decimal? value);
181
    IDuckDBAppenderRow AppendValue(Guid? value);
182
    IDuckDBAppenderRow AppendValue(BigInteger? value);
183
    IDuckDBAppenderRow AppendValue(sbyte? value);
184
    IDuckDBAppenderRow AppendValue(short? value);
185
    IDuckDBAppenderRow AppendValue(int? value);
186
    IDuckDBAppenderRow AppendValue(long? value);
187
    IDuckDBAppenderRow AppendValue(byte? value);
188
    IDuckDBAppenderRow AppendValue(ushort? value);
189
    IDuckDBAppenderRow AppendValue(uint? value);
190
    IDuckDBAppenderRow AppendValue(ulong? value);
191
    IDuckDBAppenderRow AppendValue<TEnum>(TEnum? value) where TEnum : Enum;
192
    IDuckDBAppenderRow AppendValue(float? value);
193
    IDuckDBAppenderRow AppendValue(double? value);
194
    IDuckDBAppenderRow AppendValue(DuckDBDateOnly? value);
195
    IDuckDBAppenderRow AppendValue(DuckDBTimeOnly? value);
196
    IDuckDBAppenderRow AppendValue(DateTime? value);
197
    IDuckDBAppenderRow AppendValue(DateTimeOffset? value);
198
    IDuckDBAppenderRow AppendValue(TimeSpan? value);
199
    IDuckDBAppenderRow AppendValue<T>(IEnumerable<T>? value);
200
    IDuckDBAppenderRow AppendDefault();
201
}
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

© 2025 Coveralls, Inc