update.usp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <!--#
  2. Test type 5: Database updates
  3. TechEmpower Web Framework Benchmarks
  4. -->
  5. <!--#declaration
  6. #include "world.h"
  7. #ifdef U_STATIC_ORM_DRIVER_PGSQL
  8. static char query[8192];
  9. static void handlerResult(void* res, uint32_t num_result)
  10. {
  11. U_TRACE(5, "::handlerResult(%p,%u)", res, num_result)
  12. U_INTERNAL_ASSERT_EQUALS(PQnfields((PGresult*)res), 1)
  13. U_INTERNAL_ASSERT_EQUALS(PQntuples((PGresult*)res), 1)
  14. (void) U_SYSCALL(PQgetvalue, "%p,%d,%d", (PGresult*)res, 0, 0);
  15. }
  16. #endif
  17. static UOrmStatement* pstmt_update;
  18. static void usp_init_update() { World::handlerInitSql(); }
  19. static void usp_fork_update()
  20. {
  21. U_TRACE(5, "::usp_fork_update()")
  22. World::handlerForkSql();
  23. if (World::psql_query)
  24. {
  25. # ifdef U_STATIC_ORM_DRIVER_PGSQL
  26. if (World::pstmt) (void) memcpy(query, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES"));
  27. else
  28. # endif
  29. {
  30. U_NEW(UOrmStatement, pstmt_update, UOrmStatement(*World::psql_query, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = ? WHERE id = ?")));
  31. pstmt_update->use(World::pworld_query->randomNumber, World::pworld_query->id);
  32. }
  33. }
  34. }
  35. -->
  36. <!--#header
  37. -->
  38. <!--#code
  39. uint32_t i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
  40. World::initResult();
  41. #ifdef U_STATIC_ORM_DRIVER_PGSQL
  42. if (World::pstmt)
  43. {
  44. char* pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
  45. for (; i < num_queries; ++i)
  46. {
  47. World::sendQueryPrepared(i);
  48. *pquery = '(';
  49. pquery = u_num2str32(World::rnumber[i], pquery+1);
  50. *pquery = ',';
  51. pquery = u_num2str32(World::rnum = u_get_num_random_range1(10000), pquery+1);
  52. u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
  53. pquery += 2;
  54. World::handlerResult(i, World::rnum);
  55. }
  56. World::endResult();
  57. (void) memcpy(pquery-1, ") AS v (id,randomNumber) WHERE World.id = v.id;",
  58. U_CONSTANT_SIZE(") AS v (id,randomNumber) WHERE World.id = v.id;")+1);
  59. (void) U_SYSCALL(PQsendQueryParams, "%p,%S,%u,%p,%p,%p,%p,%u", World::conn, query, 0, 0, 0, 0, 0, 1);
  60. UServer_Base::handler_db1->handlerQuery(handlerResult, num_queries);
  61. }
  62. else
  63. #endif
  64. {
  65. for (; i < num_queries; ++i)
  66. {
  67. World::pworld_query->id = World::rnumber[i];
  68. World::pstmt_query->execute();
  69. World::pworld_query->randomNumber = u_get_num_random_range1(10000);
  70. pstmt_update->execute();
  71. World::handlerResult(i, World::pworld_query->randomNumber);
  72. }
  73. World::endResult();
  74. }
  75. -->