SQL: don't label results, send tuples to a continuation

This commit is contained in:
Emery Hemingway 2024-01-18 12:58:17 +02:00
parent ff1f1ac44b
commit 2d3189288f
6 changed files with 16 additions and 17 deletions

View File

@ -148,9 +148,9 @@ let ?sqlspace = dataspace
let ?tuplespace = dataspace let ?tuplespace = dataspace
$sqlspace <query example-row "SELECT id, name FROM stuff" $tuplespace> $sqlspace <query "SELECT id, name FROM stuff" $tuplespace>
$tuplespace ? <example-row ?id ?name> [ $tuplespace ? [?id ?name] [
$log ! <log "-" { row: <example-row $id $name> }> $log ! <log "-" { row: <example-row $id $name> }>
] ]
``` ```
@ -197,9 +197,9 @@ let ?sqlspace = dataspace
let ?tuplespace = dataspace let ?tuplespace = dataspace
$sqlspace <query example-row "SELECT id, name FROM stuff" $tuplespace> $sqlspace <query "SELECT id, name FROM stuff" $tuplespace>
$tuplespace ? <example-row ?id ?name> [ $tuplespace ? [?id ?name] [
$log ! <log "-" { row: <example-row $id $name> }> $log ! <log "-" { row: <example-row $id $name> }>
] ]
``` ```

View File

@ -2,4 +2,4 @@ version 1 .
# When asserted the actor reponds to @target rows as records # When asserted the actor reponds to @target rows as records
# of the given label and row columns as record fields. # of the given label and row columns as record fields.
Query = <query @label any @statement string @target #!any> . Query = <query @statement string @target #!any> .

View File

@ -4,7 +4,6 @@ import
type type
Query* {.preservesRecord: "query".} = object Query* {.preservesRecord: "query".} = object
`label`*: Value
`statement`*: string `statement`*: string
`target`* {.preservesEmbedded.}: Value `target`* {.preservesEmbedded.}: Value

View File

@ -103,20 +103,20 @@ proc spawnPostgreActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
statusHandle = publish(turn, ds, statusHandle = publish(turn, ds,
initRecord("status", toSymbol($status), msg.toPreserves)) initRecord("status", toSymbol($status), msg.toPreserves))
if status == CONNECTION_OK: if status == CONNECTION_OK:
during(turn, ds, ?:Query) do (label: Value, statement: string, target: Cap): during(turn, ds, ?:Query) do (statement: string, target: Cap):
var res = PQexec(conn, statement) var res = PQexec(conn, statement)
var st = PQresultStatus(res) var st = PQresultStatus(res)
discard publish(turn, ds, toRecord( discard publish(turn, ds, toRecord(
label, toSymbol($PQresStatus(st)), $PQresultErrorMessage(res))) "error", statement, toSymbol($PQresStatus(st)), $PQresultErrorMessage(res)))
if st == PGRES_TUPLES_OK or st == PGRES_SINGLE_TUPLE: if st == PGRES_TUPLES_OK or st == PGRES_SINGLE_TUPLE:
let tuples = PQntuples(res) let tuples = PQntuples(res)
let fields = PQnfields(res) let fields = PQnfields(res)
if tuples > 0 and fields > 0: if tuples > 0 and fields > 0:
for r in 0..<tuples: for r in 0..<tuples:
var rec = initRecord(label, fields) var tupl = initSequence(fields)
for f in 0..<fields: for f in 0..<fields:
rec[f] = toPreserves($PQgetvalue(res, r, f)) tupl[f] = toPreserves($PQgetvalue(res, r, f))
discard publish(turn, target, rec) discard publish(turn, target, tupl)
PQclear(res) PQclear(res)
else: else:
stderr.writeLine "refusing to do anything when status is ", status stderr.writeLine "refusing to do anything when status is ", status

View File

@ -74,9 +74,9 @@ proc extractValue(stmt: Stmt; col: cint): Value =
else: else:
result = initRecord("null") result = initRecord("null")
proc extractRecord(stmt: Stmt; label: Value, arity: cint): Value = proc extractTuple(stmt: Stmt; arity: cint): Value =
result = initRecord(label, arity) result = initSequence(arity)
for col in 0..<arity: result.record[col] = extractValue(stmt, col) for col in 0..<arity: result[col] = extractValue(stmt, col)
proc spawnSqliteActor*(turn: var Turn; root: Cap): Actor {.discardable.} = proc spawnSqliteActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("sqlite-actor", turn) do (turn: var Turn): spawn("sqlite-actor", turn) do (turn: var Turn):
@ -85,7 +85,7 @@ proc spawnSqliteActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
if open_v2(path, addr db, SQLITE_OPEN_READONLY, nil) != SQLITE_OK: if open_v2(path, addr db, SQLITE_OPEN_READONLY, nil) != SQLITE_OK:
logError(db, path) logError(db, path)
else: else:
during(turn, ds, ?:Query) do (label: Value, statement: string, target: Cap): during(turn, ds, ?:Query) do (statement: string, target: Cap):
var stmt: Stmt var stmt: Stmt
if prepare_v2(db, statement, statement.len.cint, addr stmt, nil) != SQLITE_OK: if prepare_v2(db, statement, statement.len.cint, addr stmt, nil) != SQLITE_OK:
logError(db, statement) logError(db, statement)
@ -94,7 +94,7 @@ proc spawnSqliteActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
let arity = column_count(stmt) let arity = column_count(stmt)
var res = step(stmt) var res = step(stmt)
while res == SQLITE_ROW: while res == SQLITE_ROW:
var rec = extractRecord(stmt, label, arity) var rec = extractTuple(stmt, arity)
discard publish(turn, target, rec) discard publish(turn, target, rec)
res = step(stmt) res = step(stmt)
assert res != 100 assert res != 100

View File

@ -1,6 +1,6 @@
# Package # Package
version = "20240116" version = "20240118"
author = "Emery Hemingway" author = "Emery Hemingway"
description = "Utilites for Syndicated Actors and Synit" description = "Utilites for Syndicated Actors and Synit"
license = "unlicense" license = "unlicense"