Răsfoiți Sursa

ULib: apply async model to test query and update (#4011)

stefano casazza 7 ani în urmă
părinte
comite
017292abbb

+ 1 - 3
frameworks/C++/ulib/src/db.usp

@@ -29,11 +29,9 @@ static void usp_fork_db() { World::handlerForkSql(); }
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 if (World::pstmt)
 if (World::pstmt)
    {
    {
-   UServer_Base::handler_db1->handlerQuery();
-
    World::sendQueryPrepared();
    World::sendQueryPrepared();
 
 
-   UServer_Base::handler_db1->handlerResult(handlerResult);
+   UServer_Base::handler_db1->handlerQuery(handlerResult);
    }
    }
 else
 else
 #endif
 #endif

+ 0 - 9
frameworks/C++/ulib/src/fortune.h

@@ -114,15 +114,6 @@ public:
 	static PGconn* conn;
 	static PGconn* conn;
 	static UPgSqlStatement* pstmt;
 	static UPgSqlStatement* pstmt;
 
 
-	static PGresult* execPrepared()
-		{
-		U_TRACE_NO_PARAM(5, "Fortune::execPrepared()")
-
-		PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 0, 0, 0, 0, 1);
-
-		U_RETURN_POINTER(res, PGresult);
-		}
-
 	static void sendQueryPrepared()
 	static void sendQueryPrepared()
 		{
 		{
 		U_TRACE_NO_PARAM(5, "Fortune::sendQueryPrepared()")
 		U_TRACE_NO_PARAM(5, "Fortune::sendQueryPrepared()")

+ 1 - 3
frameworks/C++/ulib/src/fortune.usp

@@ -55,11 +55,9 @@ static void usp_fork_fortune() { Fortune::handlerForkSql(); }
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 if (Fortune::pstmt)
 if (Fortune::pstmt)
    {
    {
-   UServer_Base::handler_db2->handlerQuery();
-
    Fortune::sendQueryPrepared();
    Fortune::sendQueryPrepared();
 
 
-   UServer_Base::handler_db2->handlerResult(handlerResult);
+   UServer_Base::handler_db2->handlerQuery(handlerResult);
    }
    }
 else
 else
 #endif
 #endif

+ 28 - 18
frameworks/C++/ulib/src/query.usp

@@ -5,39 +5,49 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 <!--#declaration
 #include "world.h"
 #include "world.h"
 
 
+static uint32_t num_queries;
+
+#ifdef U_STATIC_ORM_DRIVER_PGSQL
+static void handlerResult(void* res, uint32_t num_result)
+{
+   U_TRACE(5, "::handlerResult(%p,%u)", res, num_result)
+
+   U_INTERNAL_ASSERT_EQUALS(PQnfields((PGresult*)res), 1)
+   U_INTERNAL_ASSERT_EQUALS(PQntuples((PGresult*)res), 1)
+
+   char* randomNumber = U_SYSCALL(PQgetvalue, "%p,%d,%d", (PGresult*)res, 0, 0);
+
+   if (num_result == 1) World::initResult();
+   else                 World::addResult(num_result);
+
+   World::addRandom(ntohl(*(uint32_t*)randomNumber));
+
+   if (num_result == num_queries) World::endResult();
+}
+#endif
+
 static void usp_init_query() { World::handlerInitSql(); }
 static void usp_init_query() { World::handlerInitSql(); }
 static void usp_fork_query() { World::handlerForkSql(); }
 static void usp_fork_query() { World::handlerForkSql(); }
 -->
 -->
 <!--#header
 <!--#header
 -->
 -->
 <!--#code
 <!--#code
-uint32_t i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
+uint32_t i = 0;
 
 
-World::initResult();
+num_queries = UHTTP::getFormFirstNumericValue(1, 500);
 
 
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 if (World::pstmt)
 if (World::pstmt)
    {
    {
-   PGresult* res;
-   char* randomNumber;
-
-   for (; i < num_queries; ++i)
-      {
-      res = World::execPrepared(i);
-
-      U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
-      U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)
-
-      randomNumber = U_SYSCALL(PQgetvalue, "%p,%d,%d", res, 0, 0);
+   while (i < num_queries) World::sendQueryPrepared(i++);
 
 
-      World::handlerResult(i, ntohl(*(uint32_t*)randomNumber));
-
-      U_SYSCALL_VOID(PQclear, "%p", res);
-      }
+   UServer_Base::handler_db1->handlerQuery(handlerResult, num_queries);
    }
    }
 else
 else
 #endif
 #endif
 {
 {
+World::initResult();
+
 for (; i < num_queries; ++i)
 for (; i < num_queries; ++i)
    {
    {
    World::pworld_query->id = World::rnumber[i];
    World::pworld_query->id = World::rnumber[i];
@@ -46,7 +56,7 @@ for (; i < num_queries; ++i)
 
 
    World::handlerResult(i, World::pworld_query->randomNumber);
    World::handlerResult(i, World::pworld_query->randomNumber);
    }
    }
-}
 
 
 World::endResult();
 World::endResult();
+}
 -->
 -->

+ 17 - 19
frameworks/C++/ulib/src/update.usp

@@ -7,7 +7,18 @@ TechEmpower Web Framework Benchmarks
 
 
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 static char query[8192];
 static char query[8192];
+
+static void handlerResult(void* res, uint32_t num_result)
+{
+   U_TRACE(5, "::handlerResult(%p,%u)", res, num_result)
+
+   U_INTERNAL_ASSERT_EQUALS(PQnfields((PGresult*)res), 1)
+   U_INTERNAL_ASSERT_EQUALS(PQntuples((PGresult*)res), 1)
+
+   (void) U_SYSCALL(PQgetvalue, "%p,%d,%d", (PGresult*)res, 0, 0);
+}
 #endif
 #endif
+
 static UOrmStatement* pstmt_update;
 static UOrmStatement* pstmt_update;
 
 
 static void usp_init_update() { World::handlerInitSql(); }
 static void usp_init_update() { World::handlerInitSql(); }
@@ -41,32 +52,21 @@ World::initResult();
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 #ifdef U_STATIC_ORM_DRIVER_PGSQL
 if (World::pstmt)
 if (World::pstmt)
    {
    {
-   PGresult* res;
    char* pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
    char* pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
 
 
    for (; i < num_queries; ++i)
    for (; i < num_queries; ++i)
       {
       {
-      *pquery = '(';
-
-      pquery = u_num2str32(World::rnumber[i], pquery+1);
-
-      res = World::execPrepared(i);
-
-      U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
-      U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)
-
-      (void) U_SYSCALL(PQgetvalue, "%p,%d,%d", res, 0, 0);
+      World::sendQueryPrepared(i);
 
 
+      *pquery = '(';
+       pquery = u_num2str32(World::rnumber[i], pquery+1);
       *pquery = ',';
       *pquery = ',';
-
-      pquery = u_num2str32(World::rnum = u_get_num_random_range1(10000), pquery+1);
+       pquery = u_num2str32(World::rnum = u_get_num_random_range1(10000), pquery+1);
 
 
       u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
       u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
                          pquery += 2;
                          pquery += 2;
 
 
       World::handlerResult(i, World::rnum);
       World::handlerResult(i, World::rnum);
-
-      U_SYSCALL_VOID(PQclear, "%p", res);
       }
       }
 
 
    World::endResult();
    World::endResult();
@@ -74,11 +74,9 @@ if (World::pstmt)
    (void) memcpy(pquery-1, ") AS v (id,randomNumber) WHERE World.id = v.id;",
    (void) memcpy(pquery-1, ") AS v (id,randomNumber) WHERE World.id = v.id;",
            U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;")+1);
            U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;")+1);
 
 
-   res = (PGresult*) U_SYSCALL(PQexec, "%p,%S", (PGconn*)World::conn, query);
-
-   U_INTERNAL_ASSERT_EQUALS(PQresultStatus(res), PGRES_COMMAND_OK)
+   (void) U_SYSCALL(PQsendQueryParams, "%p,%S,%u,%p,%p,%p,%p,%u", World::conn, query, 0, 0, 0, 0, 0, 1);
 
 
-   U_SYSCALL_VOID(PQclear, "%p", res);
+   UServer_Base::handler_db1->handlerQuery(handlerResult, num_queries);
    }
    }
 else
 else
 #endif
 #endif

+ 5 - 24
frameworks/C++/ulib/src/world.h

@@ -119,30 +119,11 @@ public:
 	static UPgSqlStatement* pstmt;
 	static UPgSqlStatement* pstmt;
 	static char num2str[sizeof(unsigned int)];
 	static char num2str[sizeof(unsigned int)];
 
 
-	static PGresult* execPrepared()
+	static void _sendQueryPrepared()
 		{
 		{
-		U_TRACE_NO_PARAM(5, "World::execPrepared()")
+		U_TRACE_NO_PARAM(5, "World::_sendQueryPrepared()")
 
 
-		U_INTERNAL_ASSERT_MAJOR(rnumber[0], 0)
-
-		*(unsigned int*)num2str = htonl(rnumber[0]);
-
-		PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
-
-		U_RETURN_POINTER(res, PGresult);
-		}
-
-	static PGresult* execPrepared(uint32_t i)
-		{
-		U_TRACE(5, "World::execPrepared(%u)", i)
-
-		U_INTERNAL_ASSERT_MAJOR(rnumber[i], 0)
-
-		*(unsigned int*)num2str = htonl(rnumber[i]);
-
-		PGresult* res = (PGresult*) U_SYSCALL(PQexecPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
-
-		U_RETURN_POINTER(res, PGresult);
+		(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
 		}
 		}
 
 
 	static void sendQueryPrepared()
 	static void sendQueryPrepared()
@@ -153,7 +134,7 @@ public:
 
 
 		*(unsigned int*)num2str = htonl(rnumber[0]);
 		*(unsigned int*)num2str = htonl(rnumber[0]);
 
 
-		(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
+		_sendQueryPrepared();
 		}
 		}
 
 
 	static void sendQueryPrepared(uint32_t i)
 	static void sendQueryPrepared(uint32_t i)
@@ -164,7 +145,7 @@ public:
 
 
 		*(unsigned int*)num2str = htonl(rnumber[i]);
 		*(unsigned int*)num2str = htonl(rnumber[i]);
 
 
-		(void) U_SYSCALL(PQsendQueryPrepared, "%p,%S,%u,%p,%p,%p,%u", conn, pstmt->stmtName, 1, pstmt->paramValues, pstmt->paramLengths, pstmt->paramFormats, 1);
+		_sendQueryPrepared();
 		}
 		}
 #endif
 #endif