Skip to content

Commit 2fa47f9

Browse files
committed
WIP - add statement reset
1 parent 64b24bd commit 2fa47f9

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

Libsql.Client.Tests/StatementTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,33 @@ public async Task Database_CanExecute_Statements()
127127

128128
Assert.Equal(3ul, rowsAffected);
129129
}
130+
131+
[Fact]
132+
public async Task Statement_CanBeReset()
133+
{
134+
await _db.Execute("CREATE TABLE `test` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT)");
135+
await _db.Execute("INSERT INTO `test` (`name`) VALUES ('a'), ('b'), ('c')");
136+
137+
using var statement = await _db.Prepare("SELECT `name` FROM `test` WHERE `id` = ?");
138+
var firstExpected = "a";
139+
var secondExpected = "b";
140+
141+
statement.Bind(new Integer(1));
142+
var rs = await statement.Query();
143+
var row = rs.Rows.First();
144+
var value = row.First();
145+
var text = Assert.IsType<Text>(value);
146+
147+
Assert.Equal(firstExpected, text);
148+
149+
statement.Reset();
150+
151+
statement.Bind(new Integer(2));
152+
var rs2 = await statement.Query();
153+
var row2 = rs2.Rows.First();
154+
var value2 = row2.First();
155+
var text2 = Assert.IsType<Text>(value2);
156+
157+
Assert.Equal(secondExpected, text2);
158+
}
130159
}

Libsql.Client/IStatement.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ public interface IStatement : IDisposable
1717
void BindNull();
1818
Task<ulong> Execute();
1919
Task<IResultSet> Query();
20+
void Reset();
2021
}
2122
}

Libsql.Client/Rows.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ private unsafe Value[] ParseRow(libsql_row_t row)
123123
_enumeratorData.ColumnTypes[i] == ValueType.Text ? row.GetText(i) :
124124
_enumeratorData.ColumnTypes[i] == ValueType.Blob ? row.GetBlob(i) :
125125
_enumeratorData.ColumnTypes[i] == ValueType.Null ? (Value)new Null() :
126-
throw new ArgumentOutOfRangeException();
126+
throw new ArgumentOutOfRangeException($"Non-exhaustive check. Could not find a case to match value of {_enumeratorData.ColumnTypes[i]}");
127127

128128
parsedRow[i] = value;
129129
}

Libsql.Client/StatementWrapper.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,19 @@ public Task<IResultSet> Query()
159159
return _database.Query(this);
160160
}
161161

162+
public void Reset()
163+
{
164+
var error = new Error();
165+
int exitCode;
166+
167+
unsafe {
168+
exitCode = Bindings.libsql_reset_stmt(Stmt, &error.Ptr);
169+
}
170+
171+
error.ThrowIfNonZero(exitCode, "Failed to reset statement");
172+
}
173+
174+
162175
private void ReleaseUnmanagedResources()
163176
{
164177
Bindings.libsql_free_stmt(Stmt);

0 commit comments

Comments
 (0)