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

Giorgi / DuckDB.NET / 9095397334

15 May 2024 12:10PM UTC coverage: 89.5% (-0.3%) from 89.79%
9095397334

push

github

Giorgi
Merge branch 'Appender-Data-Chunk' (early part) into develop

663 of 770 branches covered (86.1%)

Branch coverage included in aggregate %.

262 of 293 new or added lines in 22 files covered. (89.42%)

9 existing lines in 2 files now uncovered.

1485 of 1630 relevant lines covered (91.1%)

11521.31 hits per line

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

96.23
/DuckDB.NET.Data/DuckDBAppenderRow.cs
1
using DuckDB.NET.Data.Internal.Writer;
2
using DuckDB.NET.Native;
3
using System;
4
using System.Numerics;
5

6
namespace DuckDB.NET.Data;
7

8
public class DuckDBAppenderRow
9
{
10
    private int columnIndex = 0;
11
    private readonly string qualifiedTableName;
12
    private readonly VectorDataWriterBase[] vectorWriters;
13
    private readonly int rowIndex;
14

15
    internal DuckDBAppenderRow(string qualifiedTableName, VectorDataWriterBase[] vectorWriters, ulong rowIndex)
30,357✔
16
    {
17
        this.qualifiedTableName = qualifiedTableName;
30,357✔
18
        this.vectorWriters = vectorWriters;
30,357✔
19
        this.rowIndex = (int)rowIndex;
30,357✔
20
    }
30,357✔
21

22
    public void EndRow()
23
    {
24
        if (columnIndex < vectorWriters.Length)
30,351✔
25
        {
26
            throw new InvalidOperationException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you specified only {columnIndex} values");
3✔
27
        }
28
    }
30,348✔
29

30
    public DuckDBAppenderRow AppendNullValue() => AppendValueInternal<int?>(null); //Doesn't matter what type T we pass to Append when passing null.
69✔
31

32
    public DuckDBAppenderRow AppendValue(bool? value) => AppendValueInternal(value);
69✔
33

34
#if NET6_0_OR_GREATER
35

36
    public DuckDBAppenderRow AppendValue(byte[]? value) => AppendSpan(value);
6✔
37

38
    public DuckDBAppenderRow AppendValue(Span<byte> value) => AppendSpan(value);
3✔
39
#endif
40

41
    public DuckDBAppenderRow AppendValue(string? value) => AppendValueInternal(value);
30,096✔
42

43
    public DuckDBAppenderRow AppendValue(decimal? value) => AppendValueInternal(value);
270✔
44

45
    public DuckDBAppenderRow AppendValue(Guid? value) => AppendValueInternal(value);
63✔
46

47
    public DuckDBAppenderRow AppendValue(BigInteger? value) => AppendValueInternal(value);
60✔
48

49
    #region Append Signed Int
50

51
    public DuckDBAppenderRow AppendValue(sbyte? value) => AppendValueInternal(value);
72✔
52

53
    public DuckDBAppenderRow AppendValue(short? value) => AppendValueInternal(value);
60✔
54

55
    public DuckDBAppenderRow AppendValue(int? value) => AppendValueInternal(value);
30,135✔
56

57
    public DuckDBAppenderRow AppendValue(long? value) => AppendValueInternal(value);
60✔
58

59
    #endregion
60

61
    #region Append Unsigned Int
62

63
    public DuckDBAppenderRow AppendValue(byte? value) => AppendValueInternal(value);
66✔
64

65
    public DuckDBAppenderRow AppendValue(ushort? value) => AppendValueInternal(value);
60✔
66

67
    public DuckDBAppenderRow AppendValue(uint? value) => AppendValueInternal(value);
60✔
68

69
    public DuckDBAppenderRow AppendValue(ulong? value) => AppendValueInternal(value);
60✔
70

71
    #endregion
72

73
    #region Append Float
74

75
    public DuckDBAppenderRow AppendValue(float? value) => AppendValueInternal(value);
60✔
76

77
    public DuckDBAppenderRow AppendValue(double? value) => AppendValueInternal(value);
60✔
78

79
    #endregion
80

81
    #region Append Temporal
82
#if NET6_0_OR_GREATER
83
    public DuckDBAppenderRow AppendValue(DateOnly? value) => AppendValueInternal(value);
60✔
84

85
    public DuckDBAppenderRow AppendValue(TimeOnly? value) => AppendValueInternal(value);
60✔
86
#endif
87

NEW
88
    public DuckDBAppenderRow AppendValue(DuckDBDateOnly? value) => AppendValueInternal(value);
×
89

NEW
90
    public DuckDBAppenderRow AppendValue(DuckDBTimeOnly? value) => AppendValueInternal(value);
×
91

92

93
    public DuckDBAppenderRow AppendValue(DateTime? value) => AppendValueInternal(value);
330✔
94

95
    public DuckDBAppenderRow AppendValue(DateTimeOffset? value) => AppendValueInternal(value);
60✔
96

97
    public DuckDBAppenderRow AppendValue(TimeSpan? value)
98
    {
99
        return AppendValueInternal(value);
60✔
100
    }
101

102
    #endregion
103

104
    private DuckDBAppenderRow AppendValueInternal<T>(T? value)
105
    {
106
        CheckColumnAccess();
61,890✔
107

108
        vectorWriters[columnIndex].AppendValue(value, rowIndex);
61,887✔
109

110
        columnIndex++;
61,884✔
111

112
        return this;
61,884✔
113
    }
114

115
#if NET6_0_OR_GREATER
116
    private unsafe DuckDBAppenderRow AppendSpan(Span<byte> val)
117
    {
118
        if (val == null)
9✔
119
        {
120
            return AppendNullValue();
3✔
121
        }
122

123
        CheckColumnAccess();
6✔
124

125
        fixed (byte* pSource = val)
6✔
126
        {
127
            vectorWriters[columnIndex].AppendBlob(pSource, val.Length, rowIndex);
6✔
128
        }
129

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

134
#endif
135

136
    private void CheckColumnAccess()
137
    {
138
        if (columnIndex >= vectorWriters.Length)
61,896✔
139
        {
140
            throw new IndexOutOfRangeException($"The table {qualifiedTableName} has {vectorWriters.Length} columns but you are trying to append value for column {columnIndex + 1}");
3✔
141
        }
142
    }
61,893✔
143
}
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