commit 43e0a069d37b281212e267f34dae67a0a2e12e9f Author: Emery Hemingway Date: Fri May 26 12:02:01 2023 +0100 Initial commit diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..294916a --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +use flake "git+https://gitea.c3d2.de/ehmry/meta?ref=flake#simplex_history_actor" +source_env .. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ad6275 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.direnv diff --git a/Tuprules.tup b/Tuprules.tup new file mode 100644 index 0000000..f902ead --- /dev/null +++ b/Tuprules.tup @@ -0,0 +1,2 @@ +include ../syndicate-nim/depends.tup +NIM_FLAGS += --path:$(TUP_CWD)/../syndicate-nim/src diff --git a/sqlite.prs b/sqlite.prs new file mode 100644 index 0000000..1501266 --- /dev/null +++ b/sqlite.prs @@ -0,0 +1,4 @@ +version 1 . + +Query = . +Row = [string ...] . diff --git a/sqlite_actor.nimble b/sqlite_actor.nimble new file mode 100644 index 0000000..5135c17 --- /dev/null +++ b/sqlite_actor.nimble @@ -0,0 +1,8 @@ +version = "20230526" +author = "Emery Hemingway" +description = "Syndicate Actor for accessing SQLite databases" +license = "Unlicense" +srcDir = "src" +bin = @["sqlite_actor"] + +requires "nim >= 1.6.10", "syndicate >= 20230518" diff --git a/src/Tupfile b/src/Tupfile new file mode 100644 index 0000000..2ee2cbb --- /dev/null +++ b/src/Tupfile @@ -0,0 +1,4 @@ +include_rules +: foreach ../*.prs |> !preserves_schema_nim |> {schema} +: sqlite_actor.nim | $(SYNDICATE_PROTOCOL) {schema} |> !nim_bin |> {bin} +: {bin} |> !assert_built |> diff --git a/src/sqlite.nim b/src/sqlite.nim new file mode 100644 index 0000000..4088cf7 --- /dev/null +++ b/src/sqlite.nim @@ -0,0 +1,15 @@ + +import + preserves + +type + Query* {.preservesRecord: "sql".} = object + `statement`*: string + `rows`*: seq[Row] + + Row* = seq[string] +proc `$`*(x: Query | Row): string = + `$`(toPreserve(x)) + +proc encode*(x: Query | Row): seq[byte] = + encode(toPreserve(x)) diff --git a/src/sqlite_actor.nim b/src/sqlite_actor.nim new file mode 100644 index 0000000..10b7c23 --- /dev/null +++ b/src/sqlite_actor.nim @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: ☭ Emery Hemingway +# SPDX-License-Identifier: Unlicense + +# {.passC: staticExec("pkg-config --cflags sqlcipher").} +# {.passL: staticExec("pkg-config --libs sqlcipher").} + +import std/db_sqlite +import preserves, syndicate +import ./sqlite + +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) + for row in rows(db, sql statement): + add(query.rows, row) + discard publish(turn, ds, query) + do: + close(db)