sqlite: add `close` method, and an `is_open` field (#7382)

pull/7460/head
Major Taylor 2020-12-21 15:02:29 -05:00 committed by GitHub
parent 6c341a77f5
commit c831711a0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 3 deletions

View File

@ -20,8 +20,10 @@ struct C.sqlite3_stmt {
// //
pub struct DB { pub struct DB {
pub mut:
is_open bool
mut: mut:
conn &C.sqlite3 conn &C.sqlite3
} }
pub fn (db DB) str() string { pub fn (db DB) str() string {
@ -63,7 +65,7 @@ fn C.sqlite3_errstr(int) charptr
fn C.sqlite3_free(voidptr) fn C.sqlite3_free(voidptr)
// Opens the connection with a database. // connect Opens the connection with a database.
pub fn connect(path string) ?DB { pub fn connect(path string) ?DB {
db := &C.sqlite3(0) db := &C.sqlite3(0)
if C.sqlite3_open(path.str, &db) != 0 { if C.sqlite3_open(path.str, &db) != 0 {
@ -71,9 +73,23 @@ pub fn connect(path string) ?DB {
} }
return DB{ return DB{
conn: db conn: db
is_open: true
} }
} }
// close Closes the DB.
// TODO: For all functions, determine whether the connection is
// closed first, and determine what to do if it is
pub fn (mut db DB) close() ?bool {
code := C.sqlite3_close(db.conn)
if code == 0 {
db.is_open = false
} else {
return error('sqlite db error: failed to close with code: $code')
}
return true // successfully closed
}
// Only for V ORM // Only for V ORM
fn (db DB) init_stmt(query string) &C.sqlite3_stmt { fn (db DB) init_stmt(query string) &C.sqlite3_stmt {
stmt := &C.sqlite3_stmt(0) stmt := &C.sqlite3_stmt(0)

View File

@ -4,9 +4,10 @@ fn test_sqlite() {
$if !linux { $if !linux {
return return
} }
db := sqlite.connect(':memory:') or { mut db := sqlite.connect(':memory:') or {
panic(err) panic(err)
} }
assert db.is_open
db.exec('drop table if exists users') db.exec('drop table if exists users')
db.exec("create table users (id integer primary key, name text default '');") db.exec("create table users (id integer primary key, name text default '');")
db.exec("insert into users (name) values ('Sam')") db.exec("insert into users (name) values ('Sam')")
@ -25,4 +26,8 @@ fn test_sqlite() {
panic(err) panic(err)
} }
assert user.vals.len == 2 assert user.vals.len == 2
db.close() or {
panic(err)
}
assert !db.is_open
} }