From fb2ad6903a82382286c77c199a59fcf9dc73039d Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 26 May 2023 23:59:01 +0100 Subject: [PATCH] Assert each row as a record --- README.md | 28 ++++++++++++++++++++++++++++ sqlite.prs | 6 ++++-- sqlite_actor.nimble | 2 +- src/sqlite.nim | 9 ++++----- src/sqlite_actor.nim | 15 ++++++++------- 5 files changed, 45 insertions(+), 15 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e542bcd --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# sqlite_actor + +Syndicate actor for accessing SQLite databases. + +## Example configuration +``` +? [ + + $ds + + $ds ? [ + $log ! }> + ] + + > + ? ?cap> [ + $cap { + dataspace: $ds + database: "/var/db/example.db" + } + ] + + +] +``` diff --git a/sqlite.prs b/sqlite.prs index 1501266..679a7e6 100644 --- a/sqlite.prs +++ b/sqlite.prs @@ -1,4 +1,6 @@ version 1 . -Query = . -Row = [string ...] . +; When asserted the actor reponds with +; rows as records of the given label and +; row columns as record fields. +Query = . diff --git a/sqlite_actor.nimble b/sqlite_actor.nimble index 5135c17..6c43a63 100644 --- a/sqlite_actor.nimble +++ b/sqlite_actor.nimble @@ -1,4 +1,4 @@ -version = "20230526" +version = "20230527" author = "Emery Hemingway" description = "Syndicate Actor for accessing SQLite databases" license = "Unlicense" diff --git a/src/sqlite.nim b/src/sqlite.nim index 4088cf7..4702c16 100644 --- a/src/sqlite.nim +++ b/src/sqlite.nim @@ -3,13 +3,12 @@ import preserves type - Query* {.preservesRecord: "sql".} = object + Query* {.preservesRecord: "query".} = object + `label`*: Preserve[void] `statement`*: string - `rows`*: seq[Row] - Row* = seq[string] -proc `$`*(x: Query | Row): string = +proc `$`*(x: Query): string = `$`(toPreserve(x)) -proc encode*(x: Query | Row): seq[byte] = +proc encode*(x: Query): seq[byte] = encode(toPreserve(x)) diff --git a/src/sqlite_actor.nim b/src/sqlite_actor.nim index 10b7c23..9790835 100644 --- a/src/sqlite_actor.nim +++ b/src/sqlite_actor.nim @@ -1,26 +1,27 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense -# {.passC: staticExec("pkg-config --cflags sqlcipher").} -# {.passL: staticExec("pkg-config --libs sqlcipher").} +{.passC: staticExec("pkg-config --cflags sqlcipher").} +{.passL: staticExec("pkg-config --libs sqlcipher").} import std/db_sqlite import preserves, syndicate import ./sqlite +type Value = Preserve[void] + type Args {.preservesDictionary.}= object database: string dataspace: Ref runActor("main") do (root: Ref; turn: var Turn): connectStdio(root, turn) - let queryPat = ?Observe(pattern: !Query) ?? {0: grabLit()} during(turn, root, ?Args) do (path: string, ds: Ref): let db = open(path, "", "", "") - during(turn, ds, queryPat) do (statement: string): - var query = Query(statement: statement) + during(turn, ds, ?Query) do (label: Value, statement: string): for row in rows(db, sql statement): - add(query.rows, row) - discard publish(turn, ds, query) + var rec = initRecord(label, len(row)) + for col, val in row: rec[col] = val.toPreserve + discard publish(turn, ds, rec) do: close(db)