Skip to content

Commit 017292a

Browse files
stefanocasazzamichaelhixson
authored andcommitted
ULib: apply async model to test query and update (#4011)
1 parent 59c5b89 commit 017292a

File tree

6 files changed

+52
-76
lines changed

6 files changed

+52
-76
lines changed

frameworks/C++/ulib/src/db.usp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@ static void usp_fork_db() { World::handlerForkSql(); }
2929
#ifdef U_STATIC_ORM_DRIVER_PGSQL
3030
if (World::pstmt)
3131
{
32-
UServer_Base::handler_db1->handlerQuery();
33-
3432
World::sendQueryPrepared();
3533

36-
UServer_Base::handler_db1->handlerResult(handlerResult);
34+
UServer_Base::handler_db1->handlerQuery(handlerResult);
3735
}
3836
else
3937
#endif

frameworks/C++/ulib/src/fortune.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,6 @@ class U_EXPORT Fortune {
114114
static PGconn* conn;
115115
static UPgSqlStatement* pstmt;
116116

117-
static PGresult* execPrepared()
118-
{
119-
U_TRACE_NO_PARAM(5, "Fortune::execPrepared()")
120-
121-
PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 0, 0, 0, 0, 1);
122-
123-
U_RETURN_POINTER(res, PGresult);
124-
}
125-
126117
static void sendQueryPrepared()
127118
{
128119
U_TRACE_NO_PARAM(5, "Fortune::sendQueryPrepared()")

frameworks/C++/ulib/src/fortune.usp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,9 @@ static void usp_fork_fortune() { Fortune::handlerForkSql(); }
5555
#ifdef U_STATIC_ORM_DRIVER_PGSQL
5656
if (Fortune::pstmt)
5757
{
58-
UServer_Base::handler_db2->handlerQuery();
59-
6058
Fortune::sendQueryPrepared();
6159

62-
UServer_Base::handler_db2->handlerResult(handlerResult);
60+
UServer_Base::handler_db2->handlerQuery(handlerResult);
6361
}
6462
else
6563
#endif

frameworks/C++/ulib/src/query.usp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,49 @@ TechEmpower Web Framework Benchmarks
55
<!--#declaration
66
#include "world.h"
77

8+
static uint32_t num_queries;
9+
10+
#ifdef U_STATIC_ORM_DRIVER_PGSQL
11+
static void handlerResult(void* res, uint32_t num_result)
12+
{
13+
U_TRACE(5, "::handlerResult(%p,%u)", res, num_result)
14+
15+
U_INTERNAL_ASSERT_EQUALS(PQnfields((PGresult*)res), 1)
16+
U_INTERNAL_ASSERT_EQUALS(PQntuples((PGresult*)res), 1)
17+
18+
char* randomNumber = U_SYSCALL(PQgetvalue, "%p,%d,%d", (PGresult*)res, 0, 0);
19+
20+
if (num_result == 1) World::initResult();
21+
else World::addResult(num_result);
22+
23+
World::addRandom(ntohl(*(uint32_t*)randomNumber));
24+
25+
if (num_result == num_queries) World::endResult();
26+
}
27+
#endif
28+
829
static void usp_init_query() { World::handlerInitSql(); }
930
static void usp_fork_query() { World::handlerForkSql(); }
1031
-->
1132
<!--#header
1233
-->
1334
<!--#code
14-
uint32_t i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
35+
uint32_t i = 0;
1536

16-
World::initResult();
37+
num_queries = UHTTP::getFormFirstNumericValue(1, 500);
1738

1839
#ifdef U_STATIC_ORM_DRIVER_PGSQL
1940
if (World::pstmt)
2041
{
21-
PGresult* res;
22-
char* randomNumber;
23-
24-
for (; i < num_queries; ++i)
25-
{
26-
res = World::execPrepared(i);
27-
28-
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
29-
U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)
30-
31-
randomNumber = U_SYSCALL(PQgetvalue, "%p,%d,%d", res, 0, 0);
42+
while (i < num_queries) World::sendQueryPrepared(i++);
3243

33-
World::handlerResult(i, ntohl(*(uint32_t*)randomNumber));
34-
35-
U_SYSCALL_VOID(PQclear, "%p", res);
36-
}
44+
UServer_Base::handler_db1->handlerQuery(handlerResult, num_queries);
3745
}
3846
else
3947
#endif
4048
{
49+
World::initResult();
50+
4151
for (; i < num_queries; ++i)
4252
{
4353
World::pworld_query->id = World::rnumber[i];
@@ -46,7 +56,7 @@ for (; i < num_queries; ++i)
4656

4757
World::handlerResult(i, World::pworld_query->randomNumber);
4858
}
49-
}
5059

5160
World::endResult();
61+
}
5262
-->

frameworks/C++/ulib/src/update.usp

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,18 @@ TechEmpower Web Framework Benchmarks
77

88
#ifdef U_STATIC_ORM_DRIVER_PGSQL
99
static char query[8192];
10+
11+
static void handlerResult(void* res, uint32_t num_result)
12+
{
13+
U_TRACE(5, "::handlerResult(%p,%u)", res, num_result)
14+
15+
U_INTERNAL_ASSERT_EQUALS(PQnfields((PGresult*)res), 1)
16+
U_INTERNAL_ASSERT_EQUALS(PQntuples((PGresult*)res), 1)
17+
18+
(void) U_SYSCALL(PQgetvalue, "%p,%d,%d", (PGresult*)res, 0, 0);
19+
}
1020
#endif
21+
1122
static UOrmStatement* pstmt_update;
1223

1324
static void usp_init_update() { World::handlerInitSql(); }
@@ -41,44 +52,31 @@ World::initResult();
4152
#ifdef U_STATIC_ORM_DRIVER_PGSQL
4253
if (World::pstmt)
4354
{
44-
PGresult* res;
4555
char* pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
4656

4757
for (; i < num_queries; ++i)
4858
{
49-
*pquery = '(';
50-
51-
pquery = u_num2str32(World::rnumber[i], pquery+1);
52-
53-
res = World::execPrepared(i);
54-
55-
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
56-
U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)
57-
58-
(void) U_SYSCALL(PQgetvalue, "%p,%d,%d", res, 0, 0);
59+
World::sendQueryPrepared(i);
5960

61+
*pquery = '(';
62+
pquery = u_num2str32(World::rnumber[i], pquery+1);
6063
*pquery = ',';
61-
62-
pquery = u_num2str32(World::rnum = u_get_num_random_range1(10000), pquery+1);
64+
pquery = u_num2str32(World::rnum = u_get_num_random_range1(10000), pquery+1);
6365

6466
u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
6567
pquery += 2;
6668

6769
World::handlerResult(i, World::rnum);
68-
69-
U_SYSCALL_VOID(PQclear, "%p", res);
7070
}
7171

7272
World::endResult();
7373

7474
(void) memcpy(pquery-1, ") AS v (id,randomNumber) WHERE World.id = v.id;",
7575
U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;")+1);
7676

77-
res = (PGresult*) U_SYSCALL(PQexec, "%p,%S", (PGconn*)World::conn, query);
78-
79-
U_INTERNAL_ASSERT_EQUALS(PQresultStatus(res), PGRES_COMMAND_OK)
77+
(void) U_SYSCALL(PQsendQueryParams, "%p,%S,%u,%p,%p,%p,%p,%u", World::conn, query, 0, 0, 0, 0, 0, 1);
8078

81-
U_SYSCALL_VOID(PQclear, "%p", res);
79+
UServer_Base::handler_db1->handlerQuery(handlerResult, num_queries);
8280
}
8381
else
8482
#endif

frameworks/C++/ulib/src/world.h

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -119,30 +119,11 @@ class U_EXPORT World {
119119
static UPgSqlStatement* pstmt;
120120
static char num2str[sizeof(unsigned int)];
121121

122-
static PGresult* execPrepared()
122+
static void _sendQueryPrepared()
123123
{
124-
U_TRACE_NO_PARAM(5, "World::execPrepared()")
124+
U_TRACE_NO_PARAM(5, "World::_sendQueryPrepared()")
125125

126-
U_INTERNAL_ASSERT_MAJOR(rnumber[0], 0)
127-
128-
*(unsigned int*)num2str = htonl(rnumber[0]);
129-
130-
PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
131-
132-
U_RETURN_POINTER(res, PGresult);
133-
}
134-
135-
static PGresult* execPrepared(uint32_t i)
136-
{
137-
U_TRACE(5, "World::execPrepared(%u)", i)
138-
139-
U_INTERNAL_ASSERT_MAJOR(rnumber[i], 0)
140-
141-
*(unsigned int*)num2str = htonl(rnumber[i]);
142-
143-
PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
144-
145-
U_RETURN_POINTER(res, PGresult);
126+
(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
146127
}
147128

148129
static void sendQueryPrepared()
@@ -153,7 +134,7 @@ class U_EXPORT World {
153134

154135
*(unsigned int*)num2str = htonl(rnumber[0]);
155136

156-
(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
137+
_sendQueryPrepared();
157138
}
158139

159140
static void sendQueryPrepared(uint32_t i)
@@ -164,7 +145,7 @@ class U_EXPORT World {
164145

165146
*(unsigned int*)num2str = htonl(rnumber[i]);
166147

167-
(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
148+
_sendQueryPrepared();
168149
}
169150
#endif
170151

0 commit comments

Comments
 (0)