Skip to content

Commit 02e35b4

Browse files
authored
Support DBInterface.execute(f, stmt) method (#226)
* add DBInterface.close!(Query) method called by DBInterface.execute(f, stmt) * tests for DBInterface.execute(f, ...) methods
1 parent d4d5416 commit 02e35b4

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ WeakRefStrings = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
1717

1818
[compat]
1919
BinaryProvider = "0.5"
20-
DBInterface = "2.3"
20+
DBInterface = "2.4"
2121
SQLite_jll = "3"
2222
Tables = "1"
2323
WeakRefStrings = "0.4,0.5,0.6"

src/tables.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ function reset!(q::Query)
2727
return
2828
end
2929

30+
function DBInterface.close!(q::Query)
31+
_st = _stmt_safe(q.stmt)
32+
(_st !== nothing) && sqlite3_reset(_st.handle)
33+
end
34+
3035
function done(q::Query)
3136
st = q.status[]
3237
if st == SQLITE_DONE

test/runtests.jl

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ db = DBInterface.connect(SQLite.DB, dbfile2)
5252
# syntax correct, table missing
5353
@test_throws SQLiteException DBInterface.execute(db, "SELECT name FROM sqlite_nomaster WHERE type='table';")
5454

55+
@testset "close!(query)" begin
56+
qry = DBInterface.execute(db, "SELECT name FROM sqlite_master WHERE type='table';")
57+
DBInterface.close!(qry)
58+
DBInterface.close!(qry) # test it doesn't throw on double-close
59+
end
60+
5561
ds = DBInterface.execute(db, "SELECT name FROM sqlite_master WHERE type='table';") |> columntable
5662
@test length(ds) == 1
5763
@test keys(ds) == (:name,)
@@ -60,9 +66,23 @@ ds = DBInterface.execute(db, "SELECT name FROM sqlite_master WHERE type='table';
6066
results1 = SQLite.tables(db)
6167
@test isequal(ds, results1)
6268

63-
results = DBInterface.execute(db, "SELECT * FROM Employee;") |> columntable
64-
@test length(results) == 15
65-
@test length(results[1]) == 8
69+
@testset "DBInterface.execute([f])" begin
70+
# pipe approach
71+
results = DBInterface.execute(db, "SELECT * FROM Employee;") |> columntable
72+
@test length(results) == 15
73+
@test length(results[1]) == 8
74+
# callable approach
75+
@test isequal(DBInterface.execute(columntable, db, "SELECT * FROM Employee"), results)
76+
employees_stmt = DBInterface.prepare(db, "SELECT * FROM Employee")
77+
@test isequal(columntable(DBInterface.execute(employees_stmt)), results)
78+
@test isequal(DBInterface.execute(columntable, employees_stmt), results)
79+
@testset "throwing from f()" begin
80+
f(::SQLite.Query) = error("I'm throwing!")
81+
@test_throws ErrorException DBInterface.execute(f, employees_stmt)
82+
@test_throws ErrorException DBInterface.execute(f, db, "SELECT * FROM Employee")
83+
end
84+
DBInterface.close!(employees_stmt)
85+
end
6686

6787
DBInterface.execute(db, "create table temp as select * from album")
6888
DBInterface.execute(db, "alter table temp add column colyear int")

0 commit comments

Comments
 (0)