Skip to content

Commit e31b83d

Browse files
committed
fix reset position
1 parent c55c254 commit e31b83d

File tree

2 files changed

+111
-49
lines changed

2 files changed

+111
-49
lines changed

src/easy_sqlite3/macros.nim

Lines changed: 81 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ proc injectDbArguments(procbody: var NimNode, body, st_ident: NimNode): seq[tupl
6363
)
6464
)
6565
)
66-
procbody.add nnkCall.newTree(
67-
nnkDotExpr.newTree(
68-
st_ident,
69-
bindSym "reset"
70-
)
71-
)
66+
# procbody.add nnkCall.newTree(
67+
# nnkDotExpr.newTree(
68+
# st_ident,
69+
# bindSym "reset"
70+
# )
71+
# )
7272
for it in result:
7373
procbody.add nnkAsgn.newTree(
7474
nnkBracketExpr.newTree(
@@ -116,10 +116,18 @@ proc genQueryIterator(sql: string, body: NimNode): NimNode =
116116
result[6] = nnkStmtList.genTree(procbody):
117117
injectDbFetch(procbody, sql, db_ident, st_ident)
118118
discard injectDbArguments(procbody, body, st_ident)
119-
procbody.addTree(nnkWhileStmt, whilebody):
120-
whilebody.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
121-
whilebody.addTree(nnkYieldStmt, yieldbody):
122-
yieldbody.add fillPar(rettype, st_ident)
119+
procbody.addTree(nnkTryStmt, trybody):
120+
trybody.addTree(nnkWhileStmt, whilebody):
121+
whilebody.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
122+
whilebody.addTree(nnkYieldStmt, yieldbody):
123+
yieldbody.add fillPar(rettype, st_ident)
124+
trybody.addTree(nnkFinally, finallybody):
125+
finallybody.add nnkCall.newTree(
126+
nnkDotExpr.newTree(
127+
st_ident,
128+
bindSym "reset"
129+
)
130+
)
123131

124132
proc genQueryProcedure(sql: string, body, tupdef: NimNode, opt: static bool): NimNode =
125133
result = body.copy()
@@ -133,32 +141,40 @@ proc genQueryProcedure(sql: string, body, tupdef: NimNode, opt: static bool): Ni
133141
result[6] = nnkStmtList.genTree(procbody):
134142
injectDbFetch(procbody, sql, db_ident, st_ident)
135143
discard injectDbArguments(procbody, body, st_ident)
136-
procbody.addTree(nnkIfStmt, ifbody):
137-
ifbody.addTree(nnkElifBranch, branch):
138-
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
139-
branch.addTree(nnkStmtList, resultstmt):
140-
resultstmt.addTree(nnkAsgn, retbody):
141-
retbody.add ident "result"
142-
let tmp = fillPar(rettype, st_ident)
143-
when opt:
144-
retbody.add nnkCommand.newTree(bindSym "some", tmp)
145-
else:
146-
retbody.add tmp
147-
resultstmt.addTree(nnkIfStmt, ifbody2):
148-
ifbody2.addTree(nnkElifBranch, dup_branch):
149-
dup_branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
150-
dup_branch.add nnkRaiseStmt.newTree(
151-
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Too many results")
152-
)
153-
ifbody.addTree(nnkElse, elsebody):
154-
when opt:
155-
elsebody.add nnkReturnStmt.newTree(
156-
nnkCommand.newTree(bindSym "none", rettype)
157-
)
158-
else:
159-
elsebody.add nnkRaiseStmt.newTree(
160-
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "No results")
144+
procbody.addTree(nnkTryStmt, trybody):
145+
trybody.addTree(nnkIfStmt, ifbody):
146+
ifbody.addTree(nnkElifBranch, branch):
147+
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
148+
branch.addTree(nnkStmtList, resultstmt):
149+
resultstmt.addTree(nnkAsgn, retbody):
150+
retbody.add ident "result"
151+
let tmp = fillPar(rettype, st_ident)
152+
when opt:
153+
retbody.add nnkCommand.newTree(bindSym "some", tmp)
154+
else:
155+
retbody.add tmp
156+
resultstmt.addTree(nnkIfStmt, ifbody2):
157+
ifbody2.addTree(nnkElifBranch, dup_branch):
158+
dup_branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
159+
dup_branch.add nnkRaiseStmt.newTree(
160+
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Too many results")
161+
)
162+
ifbody.addTree(nnkElse, elsebody):
163+
when opt:
164+
elsebody.add nnkReturnStmt.newTree(
165+
nnkCommand.newTree(bindSym "none", rettype)
166+
)
167+
else:
168+
elsebody.add nnkRaiseStmt.newTree(
169+
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "No results")
170+
)
171+
trybody.addTree(nnkFinally, finallybody):
172+
finallybody.add nnkCall.newTree(
173+
nnkDotExpr.newTree(
174+
st_ident,
175+
bindSym "reset"
161176
)
177+
)
162178

163179
proc genUpdateProcedure(sql: string, body: NimNode): NimNode =
164180
result = body.copy()
@@ -168,15 +184,23 @@ proc genUpdateProcedure(sql: string, body: NimNode): NimNode =
168184
result[6] = nnkStmtList.genTree(procbody):
169185
injectDbFetch(procbody, sql, db_ident, st_ident)
170186
discard injectDbArguments(procbody, body, st_ident)
171-
procbody.addTree(nnkIfStmt, ifbody):
172-
ifbody.addTree(nnkElifBranch, branch):
173-
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
174-
branch.add nnkRaiseStmt.newTree(
175-
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Invalid update")
176-
)
177-
ifbody.addTree(nnkElse, elsebody):
178-
elsebody.add nnkReturnStmt.newTree(
179-
nnkCall.newTree(nnkDotExpr.newTree(db_ident, bindSym "lastInsertRowid"))
187+
procbody.addTree(nnkTryStmt, trybody):
188+
trybody.addTree(nnkIfStmt, ifbody):
189+
ifbody.addTree(nnkElifBranch, branch):
190+
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
191+
branch.add nnkRaiseStmt.newTree(
192+
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Invalid update")
193+
)
194+
ifbody.addTree(nnkElse, elsebody):
195+
elsebody.add nnkReturnStmt.newTree(
196+
nnkCall.newTree(nnkDotExpr.newTree(db_ident, bindSym "lastInsertRowid"))
197+
)
198+
trybody.addTree(nnkFinally, finallybody):
199+
finallybody.add nnkCall.newTree(
200+
nnkDotExpr.newTree(
201+
st_ident,
202+
bindSym "reset"
203+
)
180204
)
181205

182206
proc genCreateProcedure(sql: string, body: NimNode): NimNode =
@@ -187,11 +211,19 @@ proc genCreateProcedure(sql: string, body: NimNode): NimNode =
187211
result[6] = nnkStmtList.genTree(procbody):
188212
injectDbFetch(procbody, sql, db_ident, st_ident)
189213
discard injectDbArguments(procbody, body, st_ident)
190-
procbody.addTree(nnkIfStmt, ifbody):
191-
ifbody.addTree(nnkElifBranch, branch):
192-
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
193-
branch.add nnkRaiseStmt.newTree(
194-
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Invalid statement")
214+
procbody.addTree(nnkTryStmt, trybody):
215+
trybody.addTree(nnkIfStmt, ifbody):
216+
ifbody.addTree(nnkElifBranch, branch):
217+
branch.add nnkCall.newTree(nnkDotExpr.newTree(st_ident, bindSym "step"))
218+
branch.add nnkRaiseStmt.newTree(
219+
nnkCall.newTree(bindSym "newException", ident "SQLiteError", newLit "Invalid statement")
220+
)
221+
trybody.addTree(nnkFinally, finallybody):
222+
finallybody.add nnkCall.newTree(
223+
nnkDotExpr.newTree(
224+
st_ident,
225+
bindSym "reset"
226+
)
195227
)
196228

197229
macro importdb*(sql: static string, body: typed) =

tests/test_catch.nim

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import easy_sqlite3
2+
import std/[unittest, tables]
3+
4+
proc createTable() {.importdb: "CREATE TABLE data(id INTEGER PRIMARY KEY, value INTEGER)".}
5+
proc insertData(id, value: int): int {.importdb: "INSERT INTO data(id, value) VALUES ($id, $value)".}
6+
proc getData(id: int): tuple[value: int] {.importdb: "SELECT value FROM data WHERE id = $id".}
7+
iterator listData(): tuple[id: int, value: int] {.importdb: "SELECT id, value FROM data".}
8+
= discard
9+
10+
suite "catch":
11+
setup:
12+
var db = initDatabase(":memory:")
13+
db.createTable()
14+
check db.insertData(1, 1) == 1
15+
check db.insertData(2, 4) == 2
16+
test "insert 1, 2 (should failed)":
17+
try:
18+
discard db.insertData(1, 2)
19+
fail()
20+
except:
21+
check getCurrentExceptionMsg() == "UNIQUE constraint failed: data.id"
22+
test "get data":
23+
check db.getData(1) == (value: 1)
24+
test "list data":
25+
const dataset = {
26+
1: 1,
27+
2: 4
28+
}.toTable
29+
for id, value in db.listData():
30+
check dataset[id] == value

0 commit comments

Comments
 (0)