lib/sqlite3: remove old inits
[nit.git] / lib / sqlite3 / sqlite3.nit
index f4e855d..05c5a06 100644 (file)
@@ -95,18 +95,25 @@ class Sqlite3DB
        # 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 == null 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
 
 # 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
 
@@ -121,7 +128,6 @@ class Statement
        fun iterator: StatementIterator
        do
                native_statement.reset
-               native_statement.step
                return new StatementIterator(self)
        end
 end
@@ -130,8 +136,6 @@ 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`
@@ -153,12 +157,6 @@ 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`
@@ -222,7 +220,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`
@@ -250,15 +248,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
@@ -284,17 +282,21 @@ 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
 
        var pointer: Pointer
        var length: Int