feat: canonical Nim client refactor with typed rows, pool, and allographer wrapper
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled

- Extract wire protocol into clients/nim/src/baradb/wire.nim
- Add BaraError exception hierarchy
- Refactor BaraClient/SyncClient with typedRows, AsyncLock request queue, timeouts, TLS config
- Add BaraPool and optional HTTP fallback
- Add mock-server wire and pool unit tests
- Bump baradb nimble package to 1.2.0
- Make nim-allographer depend on canonical baradb client
- Use typed rows in allographer toJson
- Deprecate src/barabadb/client/client.nim
- Update docs/en/clients.md and clients/nim/README.md
This commit is contained in:
2026-06-18 21:29:39 +03:00
parent 1c42eff7ef
commit aa4ab11210
18 changed files with 2813 additions and 1265 deletions
+80 -73
View File
@@ -4,7 +4,7 @@
import std/unittest
import std/asyncdispatch
import std/asyncnet
import std/net as netmod
import std/strutils
import std/os
import baradb/client
@@ -15,8 +15,8 @@ const
proc serverAvailable(): bool =
try:
var socket = newAsyncSocket()
waitFor socket.connect(TestHost, Port(TestPort))
var socket = netmod.newSocket()
socket.connect(TestHost, Port(TestPort), timeout = 1000)
socket.close()
return true
except:
@@ -26,96 +26,103 @@ let hasServer = serverAvailable()
suite "Integration: Connection":
test "Connect and close":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
check not client.isConnected
waitFor client.connect()
check client.isConnected
client.close()
check not client.isConnected
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
check not client.isConnected
waitFor client.connect()
check client.isConnected
client.close()
check not client.isConnected
test "Ping":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
check (waitFor client.ping()) == true
client.close()
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
check (waitFor client.ping()) == true
client.close()
suite "Integration: Query":
test "Simple SELECT":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
let result = waitFor client.query("SELECT 1 as one")
check result.rowCount >= 0
client.close()
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
let result = waitFor client.query("SELECT 1 as one")
check result.rowCount >= 0
client.close()
test "Parameterized query":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
let result = waitFor client.query(
"SELECT $1 as num, $2 as txt",
@[WireValue(kind: fkInt64, int64Val: 42), WireValue(kind: fkString, strVal: "hello")]
)
check result.rowCount >= 0
client.close()
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
let result = waitFor client.query(
"SELECT $1 as num, $2 as txt",
@[WireValue(kind: fkInt64, int64Val: 42), WireValue(kind: fkString, strVal: "hello")]
)
check result.rowCount >= 0
client.close()
suite "Integration: DDL & DML":
test "Create table, insert, select, drop":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
try:
discard waitFor client.exec("DROP TABLE IF EXISTS nim_test_users")
except:
discard
discard waitFor client.exec("CREATE TABLE nim_test_users (id INT PRIMARY KEY, name STRING, age INT)")
let affected = waitFor client.exec("INSERT INTO nim_test_users (id, name, age) VALUES (1, 'Alice', 30)")
check affected >= 0
let result = waitFor client.query("SELECT name, age FROM nim_test_users WHERE id = 1")
check result.rowCount == 1
client.close()
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
try:
discard waitFor client.exec("DROP TABLE IF EXISTS nim_test_users")
except:
discard
discard waitFor client.exec("CREATE TABLE nim_test_users (id INT PRIMARY KEY, name STRING, age INT)")
let affected = waitFor client.exec("INSERT INTO nim_test_users (id, name, age) VALUES (1, 'Alice', 30)")
check affected >= 0
let result = waitFor client.query("SELECT name, age FROM nim_test_users WHERE id = 1")
check result.rowCount == 1
client.close()
suite "Integration: QueryBuilder":
test "Builder exec":
if not hasServer:
if hasServer:
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
try:
discard waitFor client.exec("DROP TABLE IF EXISTS nim_test_products")
except:
discard
discard waitFor client.exec("CREATE TABLE nim_test_products (id INT PRIMARY KEY, name STRING, price FLOAT)")
discard waitFor client.exec("INSERT INTO nim_test_products (id, name, price) VALUES (1, 'Widget', 9.99)")
let result = waitFor newQueryBuilder(client)
.select("name", "price")
.from("nim_test_products")
.where("id = 1")
.exec()
check result.rowCount == 1
discard waitFor client.exec("DROP TABLE nim_test_products")
client.close()
else:
skip()
var client = newClient(ClientConfig(host: TestHost, port: TestPort))
waitFor client.connect()
try:
discard waitFor client.exec("DROP TABLE IF EXISTS nim_test_products")
except:
discard
discard waitFor client.exec("CREATE TABLE nim_test_products (id INT PRIMARY KEY, name STRING, price FLOAT)")
discard waitFor client.exec("INSERT INTO nim_test_products (id, name, price) VALUES (1, 'Widget', 9.99)")
let result = waitFor newQueryBuilder(client)
.select("name", "price")
.from("nim_test_products")
.where("id = 1")
.exec()
check result.rowCount == 1
discard waitFor client.exec("DROP TABLE nim_test_products")
client.close()
suite "Integration: SyncClient":
test "Sync query":
if not hasServer:
if hasServer:
var client = newSyncClient(ClientConfig(host: TestHost, port: TestPort))
client.connect()
let result = client.query("SELECT 1 as one")
check result.rowCount >= 0
client.close()
else:
skip()
var client = newSyncClient(ClientConfig(host: TestHost, port: TestPort))
client.connect()
let result = client.query("SELECT 1 as one")
check result.rowCount >= 0
client.close()