This commit is contained in:
2025-07-09 15:39:10 +02:00
parent 11c173b5f7
commit 466ba16d31

View File

@@ -57,6 +57,8 @@ Methods and fields are always virtual. Superclass definitions are resolved based
@item{@racket[(roos-id! obj id)] — set object's ID (used in persistence).} @item{@racket[(roos-id! obj id)] — set object's ID (used in persistence).}
] ]
@subsection{Provided procedures}
@defproc[(-> [obj any/c] [name symbol?] ...) any/c]{ @defproc[(-> [obj any/c] [name symbol?] ...) any/c]{
Invoke a getter, setter, or method on ROOS object @racket[obj] using name and arguments. Invoke a getter, setter, or method on ROOS object @racket[obj] using name and arguments.
} }
@@ -119,7 +121,6 @@ Registers the storage backend for persistent attributes. This must be set before
Globally disables or enables deletion via the registered deleter procedure. Useful when shutting down. Globally disables or enables deletion via the registered deleter procedure. Useful when shutting down.
} }
@section{Persistence and Storage Backend} @section{Persistence and Storage Backend}
ROOS lets you persist selected attributes by tagging them with @racket[persist]. Persistence is handled by user-provided backends through: ROOS lets you persist selected attributes by tagging them with @racket[persist]. Persistence is handled by user-provided backends through:
@@ -147,9 +148,9 @@ Below is an example SQLite backend implementation that stores fields in a table:
(require db) (require db)
(require racket/vector) (require racket/vector)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @;{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;}
;; Conversion of field values @;{;; Conversion of field values}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @;{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;}
(define (value->string s-expr) (define (value->string s-expr)
(let ((o (open-output-string))) (let ((o (open-output-string)))
@@ -160,9 +161,9 @@ Below is an example SQLite backend implementation that stores fields in a table:
(let ((o (open-input-string str))) (let ((o (open-input-string str)))
(read o))) (read o)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @;{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;}
;; Database storage backend @;{;; Database storage backend}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @;{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;}
(define conn (sqlite3-connect #:database "roos.db" #:mode 'create)) (define conn (sqlite3-connect #:database "roos.db" #:mode 'create))
(query-exec conn "CREATE TABLE IF NOT EXISTS store (class TEXT, id TEXT, field TEXT, val TEXT)") (query-exec conn "CREATE TABLE IF NOT EXISTS store (class TEXT, id TEXT, field TEXT, val TEXT)")
@@ -253,7 +254,7 @@ This example builds an address book with persistent reference to persons, using
) )
;; Create sample data @;{;; Create sample data}
(define b (-! book)) (define b (-! book))
(define (adder n t) (define (adder n t)
@@ -269,7 +270,7 @@ This example builds an address book with persistent reference to persons, using
(-> b (for-each (lambda (p) (displayln (-> p name))))) (-> b (for-each (lambda (p) (displayln (-> p name)))))
;; Reopen addressbook later from persistent storage @{;; Reopen addressbook later from persistent storage}
(define a (-! book)) (define a (-! book))
(-> b (for-each (lambda (p) (displayln (-> p name))))) (-> b (for-each (lambda (p) (displayln (-> p name)))))