Changes Char to CChar & adds implements interfaces

This makes sqlite work with current Carp at the time of commit
This commit is contained in:
Tim Dévé
2020-06-19 21:14:10 +01:00
parent 262aacc0a9
commit 8818ec83ab

View File

@@ -16,7 +16,7 @@ The module `SQLite3` provides facilities for opening, closing, and querying
databases. databases.
```clojure ```clojure
(load \"https://veitheller.de/git/carpentry/sqlite3@0.0.1\") (load \"https://veitheller.de/git/carpentry/sqlite3@0.0.3\")
; opening DBs can fail, for the purposes of this example we ; opening DBs can fail, for the purposes of this example we
; ignore that ; ignore that
@@ -65,8 +65,7 @@ primitive Carp types can be casted to appropriate SQLite types by using the
(Integer [Int]) (Integer [Int])
(Floating [Double]) (Floating [Double])
(Text [String]) (Text [String])
(Blob [String]) (Blob [String]))
)
(private SQLiteColumn) (private SQLiteColumn)
(hidden SQLiteColumn) (hidden SQLiteColumn)
@@ -78,8 +77,7 @@ primitive Carp types can be casted to appropriate SQLite types by using the
(register int (Fn [Int] SQLiteColumn) "SQLiteColumn_int") (register int (Fn [Int] SQLiteColumn) "SQLiteColumn_int")
(register float (Fn [Double] SQLiteColumn) "SQLiteColumn_float") (register float (Fn [Double] SQLiteColumn) "SQLiteColumn_float")
(register text (Fn [String] SQLiteColumn) "SQLiteColumn_text") (register text (Fn [String] SQLiteColumn) "SQLiteColumn_text")
(register blob (Fn [String] SQLiteColumn) "SQLiteColumn_blob") (register blob (Fn [String] SQLiteColumn) "SQLiteColumn_blob"))
)
(defn to-sqlite3-internal [x] (defn to-sqlite3-internal [x]
(match x (match x
@@ -87,8 +85,7 @@ primitive Carp types can be casted to appropriate SQLite types by using the
(Integer i) (SQLiteColumn.int i) (Integer i) (SQLiteColumn.int i)
(Floating f) (SQLiteColumn.float f) (Floating f) (SQLiteColumn.float f)
(Text s) (SQLiteColumn.text s) (Text s) (SQLiteColumn.text s)
(Blob s) (SQLiteColumn.blob s))) (Blob s) (SQLiteColumn.blob s))))
)
(defmodule SQLiteColumn (defmodule SQLiteColumn
(register tag (Fn [&SQLiteColumn] Int) "SQLiteColumn_tag") (register tag (Fn [&SQLiteColumn] Int) "SQLiteColumn_tag")
@@ -117,8 +114,7 @@ primitive Carp types can be casted to appropriate SQLite types by using the
a (Array.allocate l)] a (Array.allocate l)]
(for [i 0 l] (for [i 0 l]
(Array.aset-uninitialized! &a i (SQLiteColumn.to-carp (nth &r i)))) (Array.aset-uninitialized! &a i (SQLiteColumn.to-carp (nth &r i))))
a)) a)))
)
(private SQLiteRes) (private SQLiteRes)
(hidden SQLiteRes) (hidden SQLiteRes)
@@ -127,28 +123,27 @@ primitive Carp types can be casted to appropriate SQLite types by using the
(register ok? (Fn [&SQLiteRes] Bool) "SQLiteRes_is_ok") (register ok? (Fn [&SQLiteRes] Bool) "SQLiteRes_is_ok")
(register length (Fn [&SQLiteRes] Int) "SQLiteRes_length") (register length (Fn [&SQLiteRes] Int) "SQLiteRes_length")
(register nth (Fn [&SQLiteRes Int] SQLiteRow) "SQLiteRes_nth") (register nth (Fn [&SQLiteRes Int] SQLiteRow) "SQLiteRes_nth")
(register error (Fn [SQLiteRes] (Ptr Char)) "SQLiteRes_error") (register error (Fn [SQLiteRes] (Ptr CChar)) "SQLiteRes_error")
(defn to-array [r] (defn to-array [r]
(let-do [l (length &r) (let-do [l (length &r)
a (Array.allocate l)] a (Array.allocate l)]
(for [i 0 l] (for [i 0 l]
(Array.aset-uninitialized! &a i (SQLiteRow.to-carp (nth &r i)))) (Array.aset-uninitialized! &a i (SQLiteRow.to-carp (nth &r i))))
a)) a)))
)
(private init) (private init)
(hidden init) (hidden init)
(register init (Fn [] SQLite)) (register init (Fn [] SQLite))
(private open-) (private open-)
(hidden open-) (hidden open-)
(register open- (Fn [&SQLite (Ptr Char)] Int) "SQLite3_open_c") (register open- (Fn [&SQLite (Ptr CChar)] Int) "SQLite3_open_c")
(private exec-) (private exec-)
(hidden exec-) (hidden exec-)
(register exec- (Fn [&SQLite (Ptr Char) &(Array SQLiteColumn)] SQLiteRes) "SQLite3_exec_c") (register exec- (Fn [&SQLite (Ptr CChar) &(Array SQLiteColumn)] SQLiteRes) "SQLite3_exec_c")
(private error-) (private error-)
(hidden error-) (hidden error-)
(register error- (Fn [SQLite] (Ptr Char)) "SQLite3_error") (register error- (Fn [SQLite] (Ptr CChar)) "SQLite3_error")
(doc open "opens a database with the filename `s`. (doc open "opens a database with the filename `s`.
@@ -171,25 +166,31 @@ If it fails, we return an error message using `Result.Error`.")
(Result.Error (from-cstr (SQLiteRes.error r)))))) (Result.Error (from-cstr (SQLiteRes.error r))))))
(doc close "closes a database.") (doc close "closes a database.")
(register close (Fn [SQLite] ()) "SQLite3_close_c") (register close (Fn [SQLite] ()) "SQLite3_close_c"))
)
(definterface to-sqlite3 (Fn [a] SQLIte3.Type)) (definterface to-sqlite3 (Fn [a] SQLIte3.Type))
(defmodule Bool (defmodule Bool
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [b] (SQLite3.Type.Integer (if b 1 0)))) (defn to-sqlite3 [b] (SQLite3.Type.Integer (if b 1 0))))
(defmodule Int (defmodule Int
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [i] (SQLite3.Type.Integer i))) (defn to-sqlite3 [i] (SQLite3.Type.Integer i)))
(defmodule Long (defmodule Long
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [l] (SQLite3.Type.Integer (to-int (the Long l))))) (defn to-sqlite3 [l] (SQLite3.Type.Integer (to-int (the Long l)))))
(defmodule Float (defmodule Float
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [f] (SQLite3.Type.Floating (Double.from-float f)))) (defn to-sqlite3 [f] (SQLite3.Type.Floating (Double.from-float f))))
(defmodule Double (defmodule Double
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [d] (SQLite3.Type.Floating d))) (defn to-sqlite3 [d] (SQLite3.Type.Floating d)))
(defmodule String (defmodule String
(implements to-sqlite3 to-sqlite3)
(defn to-sqlite3 [s] (SQLite3.Type.Text s))) (defn to-sqlite3 [s] (SQLite3.Type.Text s)))