sqlite3 :: Sqlite3DB :: defaultinit
# A connection to a Sqlite3 database
class Sqlite3DB
	private var native_connection: NativeSqlite3
	# Is this connection to the DB open?
	var is_open = false
	# All `Statement` opened from this connection that must be closed with this connection
	private var open_statements = new Array[Statement]
	# Open a connection to the database file at `path`
	init open(path: Text)
	do
		init(new NativeSqlite3.open(path.to_cstring))
		if native_connection.is_valid then is_open = true
	end
	# Close this connection to the DB and all open statements
	fun close
	do
		if not is_open then return
		is_open = false
		# close open statements
		for stmt in open_statements do if stmt.is_open then
			stmt.close
		end
		native_connection.close
	end
	# Prepare and return a `Statement`, return `null` on error
	fun prepare(sql: Text): nullable Statement
	do
		var native_stmt = native_connection.prepare(sql.to_cstring)
		if native_stmt.address_is_null then return null
		var stmt = new Statement(native_stmt)
		open_statements.add stmt
		return stmt
	end
	# Execute the `sql` statement and return `true` on success
	fun execute(sql: Text): Bool
	do
		var err = native_connection.exec(sql.to_cstring)
		return err.is_ok
	end
	# Create a table on the DB with a statement beginning with "CREATE TABLE ", followed by `rest`
	#
	# This method does not escape special characters.
	fun create_table(rest: Text): Bool do return execute("CREATE TABLE " + rest)
	# Insert in the DB with a statement beginning with "INSERT ", followed by `rest`
	#
	# This method does not escape special characters.
	fun insert(rest: Text): Bool do return execute("INSERT " + rest)
	# Replace in the DB with a statement beginning with "REPLACE", followed by `rest`
	#
	# This method does not escape special characters.
	fun replace(rest: Text): Bool do return execute("REPLACE " + rest)
	# Select from the DB with a statement beginning with "SELECT ", followed by `rest`
	#
	# This method does not escape special characters.
	fun select(rest: Text): nullable Statement do return prepare("SELECT " + rest)
	# TODO add more prefix here as needed
	# The latest error message, or `null` if there is none
	fun error: nullable String
	do
		if not native_connection.is_valid then
			var err = sys.sqlite_open_error
			if err.is_ok then return null
			return err.to_s
		end
		var err = native_connection.error
		if err.is_ok then return null
		return err.to_s
	end
	# Returns the id for the last successful insert on the current connection.
	fun last_insert_rowid: Int do return native_connection.last_insert_rowid
end
					lib/sqlite3/sqlite3.nit:25,1--113,3