Changes Char to CChar & adds implements interfaces
This makes sqlite work with current Carp at the time of commit
This commit is contained in:
35
sqlite3.carp
35
sqlite3.carp
@@ -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)))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user