///|
struct Connection(@ffi.Sqlite3)

///|
#callsite(autofill(loc))
pub fn Connection::open(
  filename : String,
  loc~ : SourceLoc,
) -> Connection raise SqliteError {
  let filename = @utf8.encode(filename)
  let db = @ffi.sqlite3_allocate()
  let rescode = @ffi.sqlite3_open(filename, db)
  if rescode == SQLITE_OK {
    return Connection(db)
  } else {
    raise SqliteError((rescode, loc))
  }
}

///|
#callsite(autofill(loc))
pub fn Connection::close(
  self : Connection,
  loc~ : SourceLoc,
) -> Unit raise SqliteError {
  let rescode = @ffi.sqlite3_close(self.0)
  if rescode != SQLITE_OK {
    raise SqliteError((rescode, loc))
  }
}