
this is an trade-off since dynamically-valued interfaces are almost impossible to typecheck https://github.com/racket/typed-racket/pull/468 Also, the `SQL-Datum` is now more precision, since `Any` shadows all opaque types (such as `SQL-Null`) which may lead to contract errors.
33 lines
1.1 KiB
Racket
33 lines
1.1 KiB
Racket
#lang typed/racket
|
|
|
|
;; https://github.com/racket/typed-racket/issues/460
|
|
;; https://github.com/racket/typed-racket/pull/468
|
|
|
|
(require typed/db)
|
|
|
|
(define sqlite : Connection (sqlite3-connect #:database 'memory))
|
|
|
|
(struct master ([id : Integer] [type : Symbol] [name : String] [sql : String])
|
|
#:prefab #:type-name Master
|
|
#:constructor-name make-master)
|
|
|
|
(define record : Master
|
|
(make-master (current-milliseconds) 'table "manual_index"
|
|
"CREATE TABLE manual_index(id, name, content);"))
|
|
|
|
(query-exec sqlite (master-sql record))
|
|
(query-exec sqlite "insert into manual_index values ($1, $2, $3)"
|
|
(master-id record) (master-name record) (~s record))
|
|
|
|
(for ([s (in-query sqlite "SELECT content FROM manual_index WHERE name = $1;" (master-name record))])
|
|
(define ?record (with-input-from-string (~a s) read))
|
|
(if (not (master? ?record))
|
|
(fprintf (current-error-port) "in-query: unexpected value: ~s"
|
|
?record)
|
|
(fprintf (current-output-port) "[~a]~a: ~s~n"
|
|
(master-type ?record)
|
|
(master-name ?record)
|
|
(master-sql ?record))))
|
|
|
|
(disconnect sqlite)
|