Assert each row as a record
This commit is contained in:
parent
43e0a069d3
commit
fb2ad6903a
|
@ -0,0 +1,28 @@
|
||||||
|
# sqlite_actor
|
||||||
|
|
||||||
|
Syndicate actor for accessing SQLite databases.
|
||||||
|
|
||||||
|
## Example configuration
|
||||||
|
```
|
||||||
|
? <example-dataspace ?ds> [
|
||||||
|
|
||||||
|
$ds <query example-row "SELECT id, name FROM stuff">
|
||||||
|
|
||||||
|
$ds ? <example-row ?id ?name> [
|
||||||
|
$log ! <log "-" { row: <example-row $id $name> }>
|
||||||
|
]
|
||||||
|
|
||||||
|
<require-service <daemon sqlite_actor>>
|
||||||
|
? <service-object <daemon sqlite_actor> ?cap> [
|
||||||
|
$cap {
|
||||||
|
dataspace: $ds
|
||||||
|
database: "/var/db/example.db"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
<daemon sqlite_actor {
|
||||||
|
argv: [ "/usr/local/bin/sqlite_actor" ]
|
||||||
|
protocol: application/syndicate
|
||||||
|
}>
|
||||||
|
]
|
||||||
|
```
|
|
@ -1,4 +1,6 @@
|
||||||
version 1 .
|
version 1 .
|
||||||
|
|
||||||
Query = <sql @statement string @rows [Row ...]> .
|
; When asserted the actor reponds with
|
||||||
Row = [string ...] .
|
; rows as records of the given label and
|
||||||
|
; row columns as record fields.
|
||||||
|
Query = <query @label any @statement string> .
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
version = "20230526"
|
version = "20230527"
|
||||||
author = "Emery Hemingway"
|
author = "Emery Hemingway"
|
||||||
description = "Syndicate Actor for accessing SQLite databases"
|
description = "Syndicate Actor for accessing SQLite databases"
|
||||||
license = "Unlicense"
|
license = "Unlicense"
|
||||||
|
|
|
@ -3,13 +3,12 @@ import
|
||||||
preserves
|
preserves
|
||||||
|
|
||||||
type
|
type
|
||||||
Query* {.preservesRecord: "sql".} = object
|
Query* {.preservesRecord: "query".} = object
|
||||||
|
`label`*: Preserve[void]
|
||||||
`statement`*: string
|
`statement`*: string
|
||||||
`rows`*: seq[Row]
|
|
||||||
|
|
||||||
Row* = seq[string]
|
proc `$`*(x: Query): string =
|
||||||
proc `$`*(x: Query | Row): string =
|
|
||||||
`$`(toPreserve(x))
|
`$`(toPreserve(x))
|
||||||
|
|
||||||
proc encode*(x: Query | Row): seq[byte] =
|
proc encode*(x: Query): seq[byte] =
|
||||||
encode(toPreserve(x))
|
encode(toPreserve(x))
|
||||||
|
|
|
@ -1,26 +1,27 @@
|
||||||
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
# {.passC: staticExec("pkg-config --cflags sqlcipher").}
|
{.passC: staticExec("pkg-config --cflags sqlcipher").}
|
||||||
# {.passL: staticExec("pkg-config --libs sqlcipher").}
|
{.passL: staticExec("pkg-config --libs sqlcipher").}
|
||||||
|
|
||||||
import std/db_sqlite
|
import std/db_sqlite
|
||||||
import preserves, syndicate
|
import preserves, syndicate
|
||||||
import ./sqlite
|
import ./sqlite
|
||||||
|
|
||||||
|
type Value = Preserve[void]
|
||||||
|
|
||||||
type Args {.preservesDictionary.}= object
|
type Args {.preservesDictionary.}= object
|
||||||
database: string
|
database: string
|
||||||
dataspace: Ref
|
dataspace: Ref
|
||||||
|
|
||||||
runActor("main") do (root: Ref; turn: var Turn):
|
runActor("main") do (root: Ref; turn: var Turn):
|
||||||
connectStdio(root, turn)
|
connectStdio(root, turn)
|
||||||
let queryPat = ?Observe(pattern: !Query) ?? {0: grabLit()}
|
|
||||||
during(turn, root, ?Args) do (path: string, ds: Ref):
|
during(turn, root, ?Args) do (path: string, ds: Ref):
|
||||||
let db = open(path, "", "", "")
|
let db = open(path, "", "", "")
|
||||||
during(turn, ds, queryPat) do (statement: string):
|
during(turn, ds, ?Query) do (label: Value, statement: string):
|
||||||
var query = Query(statement: statement)
|
|
||||||
for row in rows(db, sql statement):
|
for row in rows(db, sql statement):
|
||||||
add(query.rows, row)
|
var rec = initRecord(label, len(row))
|
||||||
discard publish(turn, ds, query)
|
for col, val in row: rec[col] = val.toPreserve
|
||||||
|
discard publish(turn, ds, rec)
|
||||||
do:
|
do:
|
||||||
close(db)
|
close(db)
|
||||||
|
|
Loading…
Reference in New Issue