X-Git-Url: http://nitlanguage.org diff --git a/lib/sqlite3/sqlite3.nit b/lib/sqlite3/sqlite3.nit index d194362..0fe8050 100644 --- a/lib/sqlite3/sqlite3.nit +++ b/lib/sqlite3/sqlite3.nit @@ -105,14 +105,15 @@ class Sqlite3DB 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 # A prepared Sqlite3 statement, created from `Sqlite3DB::prepare` or `Sqlite3DB::select` class Statement private var native_statement: NativeStatement - private init(ns: NativeStatement) do self.native_statement = ns - # Is this statement usable? var is_open = true @@ -127,17 +128,15 @@ class Statement fun iterator: StatementIterator do native_statement.reset - native_statement.step return new StatementIterator(self) end end +# A row from a `Statement` class StatementRow # Statement linked to `self` var statement: Statement - private init(s: Statement) do self.statement = s - # Number of entries in this row # # require: `self.statement.is_open` @@ -159,16 +158,10 @@ class StatementEntry private var index: Int - private init(s: Statement, i: Int) - do - self.statement = s - self.index = i - end - # Name of the column # # require: `self.statement.is_open` - fun name: String is cached do + var name: String is lazy do assert statement_closed: statement.is_open return statement.native_statement.column_name(index) @@ -228,7 +221,7 @@ class StatementEntry var native_string = statement.native_statement.column_text(index) if native_string.address_is_null then return "" - return native_string.to_s + return native_string.to_s_with_copy end # Get this entry as `Blob` @@ -256,15 +249,15 @@ class StatementIterator # Statement linked to `self` var statement: Statement - private init(s: Statement) + init do - self.statement = s - self.item = new StatementRow(s) + self.item = new StatementRow(statement) + self.is_ok = statement.native_statement.step.is_row end - redef var item: StatementRow + redef var item: StatementRow is noinit - redef var is_ok = true + redef var is_ok: Bool is noinit # require: `self.statement.is_open` redef fun next @@ -290,18 +283,25 @@ interface Sqlite3Data end redef universal Int super Sqlite3Data end redef universal Float super Sqlite3Data end -redef class String super Sqlite3Data end - -# A Sqlite3 blob -class Blob +redef class String super Sqlite3Data - private init(pointer: Pointer, length: Int) + # Return `self` between `'`s and escaping any extra `'` + # + # assert "'; DROP TABLE students".to_sql_string == "'''; DROP TABLE students'" + fun to_sql_string: String do - self.pointer = pointer - self.length = length + return "'{self.replace('\'', "''")}'" end +end + +# A Sqlite3 blob +class Blob + super Sqlite3Data + # Pointer to the beginning of the blob var pointer: Pointer + + # Size of the blob var length: Int end