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

Giorgi / DuckDB.NET / 14602424605

22 Apr 2025 06:53PM UTC coverage: 89.849% (+0.02%) from 89.832%
14602424605

Pull #258

github

web-flow
Merge 44bb2141c into 35e92d966
Pull Request #258: Cache prepared statements

1114 of 1277 branches covered (87.24%)

Branch coverage included in aggregate %.

91 of 95 new or added lines in 3 files covered. (95.79%)

1 existing line in 1 file now uncovered.

2152 of 2358 relevant lines covered (91.26%)

749413.62 hits per line

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

91.53
/DuckDB.NET.Data/PreparedStatement/PreparedStatement.cs
1
using DuckDB.NET.Native;
2
using System;
3
using System.Linq;
4

5
namespace DuckDB.NET.Data.PreparedStatement;
6

7
internal sealed class PreparedStatement : IDisposable
8
{
9
    private readonly DuckDBPreparedStatement statement;
10

11
    internal bool UseStreamingMode { get; set; }
315,192✔
12

13
    internal PreparedStatement(DuckDBPreparedStatement statement)
138,501✔
14
    {
15
        this.statement = statement;
138,501✔
16
    }
138,501✔
17

18
    internal DuckDBResult Execute()
19
    {
20
        var status = UseStreamingMode
157,596✔
21
            ? NativeMethods.PreparedStatements.DuckDBExecutePreparedStreaming(statement, out var queryResult)
157,596✔
22
            : NativeMethods.PreparedStatements.DuckDBExecutePrepared(statement, out queryResult);
157,596✔
23

24
        if (!status.IsSuccess())
157,596✔
25
        {
26
            var errorMessage = NativeMethods.Query.DuckDBResultError(ref queryResult).ToManagedString(false);
42✔
27
            var errorType = NativeMethods.Query.DuckDBResultErrorType(ref queryResult);
42✔
28
            queryResult.Dispose();
42✔
29

30
            if (string.IsNullOrEmpty(errorMessage))
42!
31
            {
32
                errorMessage = "DuckDB execution failed";
×
33
            }
34

35
            if (errorType == DuckDBErrorType.Interrupt)
42✔
36
            {
37
                throw new OperationCanceledException();
12✔
38
            }
39

40
            throw new DuckDBException(errorMessage, errorType);
30✔
41
        }
42

43
        return queryResult;
157,554✔
44
    }
45

46
    internal void BindParameters(DuckDBParameterCollection parameterCollection)
47
    {
48
        var expectedParameters = NativeMethods.PreparedStatements.DuckDBParams(statement);
157,614✔
49
        if (parameterCollection.Count < expectedParameters)
157,614✔
50
        {
51
            throw new InvalidOperationException($"Invalid number of parameters. Expected {expectedParameters}, got {parameterCollection.Count}");
18✔
52
        }
53

54
        if (parameterCollection.OfType<DuckDBParameter>().Any(p => !string.IsNullOrEmpty(p.ParameterName)))
158,997✔
55
        {
56
            foreach (DuckDBParameter param in parameterCollection)
672✔
57
            {
58
                var state = NativeMethods.PreparedStatements.DuckDBBindParameterIndex(statement, out var index, param.ParameterName.ToUnmanagedString());
204✔
59
                if (state.IsSuccess())
204✔
60
                {
61
                    BindParameter(index, param);
174✔
62
                }
63
            }
64
        }
65
        else
66
        {
67
            for (var i = 0; i < expectedParameters; ++i)
316,380✔
68
            {
69
                var param = parameterCollection[i];
726✔
70
                BindParameter(i + 1, param);
726✔
71
            }
72
        }
73
    }
157,596✔
74

75
    private void BindParameter(long index, DuckDBParameter parameter)
76
    {
77
        using var parameterLogicalType = NativeMethods.PreparedStatements.DuckDBParamLogicalType(statement, index);
900✔
78
        var duckDBType = NativeMethods.LogicalType.DuckDBGetTypeId(parameterLogicalType);
900✔
79

80
        using var duckDBValue = parameter.Value.ToDuckDBValue(parameterLogicalType, duckDBType);
900✔
81

82
        var result = NativeMethods.PreparedStatements.DuckDBBindValue(statement, index, duckDBValue);
900✔
83

84
        if (!result.IsSuccess())
900!
85
        {
NEW
86
            var errorMessage = NativeMethods.PreparedStatements.DuckDBPrepareError(statement).ToManagedString(false);
×
87
            throw new InvalidOperationException($"Unable to bind parameter {index}: {errorMessage}");
×
88
        }
89
    }
1,800✔
90

91
    public void Dispose()
92
    {
93
        statement.Dispose();
138,493✔
94
    }
138,493✔
95
}
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