From 12a8c2d4851225cc9583c89ef12c16934f304c0a Mon Sep 17 00:00:00 2001 From: itsumura-h Date: Fri, 3 Apr 2026 01:18:40 +0000 Subject: [PATCH] prepared statement --- .../http/controllers/benchmark_controller.nim | 129 +++++++++------- .../prepared_benchmark_controller.nim | 140 ------------------ .../basolato/basolato.dockerfile | 32 +--- .../basolato/basolato.nimble | 2 +- .../basolato/benchmark_config.json | 4 +- .../FrameworkBenchmarks/basolato/main.nim | 9 -- 6 files changed, 84 insertions(+), 232 deletions(-) delete mode 100644 examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/prepared_benchmark_controller.nim diff --git a/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/benchmark_controller.nim b/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/benchmark_controller.nim index e353281e..51966c88 100644 --- a/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/benchmark_controller.nim +++ b/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/benchmark_controller.nim @@ -3,7 +3,6 @@ import std/algorithm import std/json import std/random import std/strutils -import std/sequtils import std/tables # framework import basolato/controller @@ -17,8 +16,39 @@ import ../views/pages/fortune_scf_view const range1_10000 = 1..10000 +const worldByIdSql = """SELECT id, randomnumber FROM "World" WHERE id = ?""" +const orderedFortuneSql = """SELECT id, message FROM "Fortune" ORDER BY message ASC""" +const worldUpdateSql = """UPDATE "World" SET randomnumber = ? WHERE id = ?""" +let emptyArgs: seq[string] = @[] + +let worldByIdStmt = rdb.prepare(worldByIdSql) +let orderedFortuneStmt = rdb.prepare(orderedFortuneSql) +let worldUpdateStmt = rdb.prepare(worldUpdateSql) + randomize() + +proc readCount(context: Context, key: string, defaultVal: int = 1): int = + var countNum = + try: + context.params.getInt(key) + except: + defaultVal + if countNum < 1: + countNum = 1 + if countNum > 500: + countNum = 500 + return countNum + + +proc fetchWorldRow(id: int): Future[seq[string]] {.async.} = + return await worldByIdStmt.firstPlain(@[$id]) + + +proc fetchFortuneRows(): Future[seq[seq[string]]] {.async.} = + return await orderedFortuneStmt.getPlain(emptyArgs) + + proc plaintext*(context:Context):Future[Response] {.async.} = return render("Hello, World!") @@ -28,69 +58,68 @@ proc json*(context:Context):Future[Response] {.async.} = proc db*(context:Context):Future[Response] {.async.} = - let i = rand(1..10000) - let res = rdb.table("World").findPlain(i).await + let i = rand(range1_10000) + let res = fetchWorldRow(i).await return render(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt}) proc query*(context:Context):Future[Response] {.async.} = - var countNum = - try: - context.params.getInt("queries") - except: - 1 - if countNum < 1: - countNum = 1 - elif countNum > 500: - countNum = 500 + let countNum = readCount(context, "queries") - var resp:seq[JsonNode] - for i in 1..countNum: - let n = rand(range1_10000) - let res = rdb.table("World").findPlain(n).await - resp.add(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt}) + var response = newSeq[JsonNode](countNum) + var futures = newSeq[Future[void]](countNum) + for i in 0.. 500: - countNum = 500 + let countNum = readCount(context, "queries") var response = newSeq[JsonNode](countNum) var futures = newSeq[Future[void]](countNum) - for i in 1..countNum: - let index = rand(range1_10000) - let number = rand(range1_10000) - response[i-1] = %*{"id": index, "randomNumber": number} - futures[i-1] = ( - proc():Future[void] {.async.} = - discard rdb.table("World").findPlain(index).await - rdb.table("World").where("id", "=", index).update(%*{"randomnumber": number}).await + + for i in 0.. 500: - countNum = 500 + var countNum = readCount(context, "count") var response = newSeq[JsonNode](countNum) for i in 1..countNum: diff --git a/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/prepared_benchmark_controller.nim b/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/prepared_benchmark_controller.nim deleted file mode 100644 index 51966c88..00000000 --- a/examples/benchmark/FrameworkBenchmarks/basolato/app/http/controllers/prepared_benchmark_controller.nim +++ /dev/null @@ -1,140 +0,0 @@ -import std/asyncdispatch -import std/algorithm -import std/json -import std/random -import std/strutils -import std/tables -# framework -import basolato/controller -# databse -import allographer/query_builder -import ../../../config/database -# model -import ../../models/fortune -# view -import ../views/pages/fortune_scf_view - - -const range1_10000 = 1..10000 -const worldByIdSql = """SELECT id, randomnumber FROM "World" WHERE id = ?""" -const orderedFortuneSql = """SELECT id, message FROM "Fortune" ORDER BY message ASC""" -const worldUpdateSql = """UPDATE "World" SET randomnumber = ? WHERE id = ?""" -let emptyArgs: seq[string] = @[] - -let worldByIdStmt = rdb.prepare(worldByIdSql) -let orderedFortuneStmt = rdb.prepare(orderedFortuneSql) -let worldUpdateStmt = rdb.prepare(worldUpdateSql) - -randomize() - - -proc readCount(context: Context, key: string, defaultVal: int = 1): int = - var countNum = - try: - context.params.getInt(key) - except: - defaultVal - if countNum < 1: - countNum = 1 - if countNum > 500: - countNum = 500 - return countNum - - -proc fetchWorldRow(id: int): Future[seq[string]] {.async.} = - return await worldByIdStmt.firstPlain(@[$id]) - - -proc fetchFortuneRows(): Future[seq[seq[string]]] {.async.} = - return await orderedFortuneStmt.getPlain(emptyArgs) - - -proc plaintext*(context:Context):Future[Response] {.async.} = - return render("Hello, World!") - - -proc json*(context:Context):Future[Response] {.async.} = - return render(%*{"message":"Hello, World!"}) - - -proc db*(context:Context):Future[Response] {.async.} = - let i = rand(range1_10000) - let res = fetchWorldRow(i).await - return render(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt}) - - -proc query*(context:Context):Future[Response] {.async.} = - let countNum = readCount(context, "queries") - - var response = newSeq[JsonNode](countNum) - var futures = newSeq[Future[void]](countNum) - for i in 0..= 2.0.0" -requires "https://github.com/itsumura-h/nim-basolato#fix" +requires "https://github.com/itsumura-h/nim-basolato#main" task test, "run testament": echo staticExec("testament p \"./tests/test_*.nim\"") diff --git a/examples/benchmark/FrameworkBenchmarks/basolato/benchmark_config.json b/examples/benchmark/FrameworkBenchmarks/basolato/benchmark_config.json index 45a2a404..8d76184b 100644 --- a/examples/benchmark/FrameworkBenchmarks/basolato/benchmark_config.json +++ b/examples/benchmark/FrameworkBenchmarks/basolato/benchmark_config.json @@ -18,13 +18,13 @@ "language": "Nim", "flavor": "None", "orm": "Full", - "platform": "asynchttpserver", + "platform": "httpbeast", "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "Basolato", "notes": "", - "versus": "httpbeast, prologue" + "versus": "jester, prologue" } } ] diff --git a/examples/benchmark/FrameworkBenchmarks/basolato/main.nim b/examples/benchmark/FrameworkBenchmarks/basolato/main.nim index 7cca28ad..c84bf871 100644 --- a/examples/benchmark/FrameworkBenchmarks/basolato/main.nim +++ b/examples/benchmark/FrameworkBenchmarks/basolato/main.nim @@ -4,7 +4,6 @@ import std/strutils import basolato # controller import ./app/http/controllers/benchmark_controller -import ./app/http/controllers/prepared_benchmark_controller let routes = @[ Route.get("/plaintext", benchmark_controller.plainText), @@ -14,14 +13,6 @@ let routes = @[ Route.get("/fortunes", benchmark_controller.fortune), Route.get("/updates", benchmark_controller.update), Route.get("/cached-queries", benchmark_controller.cachedQuery), - - Route.get("/prepared/plaintext", prepared_benchmark_controller.plainText), - Route.get("/prepared/json", prepared_benchmark_controller.json), - Route.get("/prepared/db", prepared_benchmark_controller.db), - Route.get("/prepared/queries", prepared_benchmark_controller.query), - Route.get("/prepared/fortunes", prepared_benchmark_controller.fortune), - Route.get("/prepared/updates", prepared_benchmark_controller.update), - Route.get("/prepared/cached-queries", prepared_benchmark_controller.cachedQuery), ] let settings = Settings.new(