1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
This commit is contained in:
stefanocasazza 2018-06-30 19:25:10 +02:00
parent b24a4c9b48
commit fd941c38c0
49 changed files with 362 additions and 391 deletions

View File

@ -197,7 +197,7 @@ extern U_EXPORT void runDynamicPage_ir_web(int param);
usp_body_ir_web();
UHTTP::putDataSession();
U_http_info.endHeader = 0;
UHTTP::mime_index = U_html;
U_http_info.endHeader = 0;
} }

View File

@ -358,6 +358,9 @@ public:
*/
static uint32_t size_output;
static char* pstringify; // buffer to stringify json
void stringify() const;
UString output() const
{
@ -606,7 +609,6 @@ protected:
value;
static UFlatBuffer* pfb;
static char* pstringify; // buffer to stringify json
typedef struct parser_stack_data {
uint64_t keys;
@ -776,7 +778,6 @@ protected:
}
}
void stringify() const;
void prettify(uint32_t indent) const;
void toFlatBufferFromJSON() const;
@ -2400,71 +2401,80 @@ public:
# if defined(HAVE_CXX17) && !defined(__clang__)
# include <unordered_map>
template <class T> class U_EXPORT UJsonTypeHandler<std::unordered_map<UString, T> > : public UJsonTypeHandler_Base {
public:
typedef std::unordered_map<UString, T> stringtobitmaskmap;
explicit UJsonTypeHandler(stringtobitmaskmap& map) : UJsonTypeHandler_Base(&map) {}
void clear()
{
U_TRACE_NO_PARAM(0, "UJsonTypeHandler<stringtobitmaskmap>::clear()")
((stringtobitmaskmap*)pval)->clear();
}
void toJSON(UString& json)
{
U_TRACE(0, "UJsonTypeHandler<stringtobitmaskmap>::toJSON(%V)", json.rep)
stringtobitmaskmap* pmap = (stringtobitmaskmap*)pval;
if (pmap->empty())
{
char* ptr = json.pend();
u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16('{','}'));
json.rep->_length += 2;
}
else
{
json.__push('{');
// this is is C++17 vvv
for (const auto & [ key, value ] : *pmap) json.toJSON<T>(key, UJsonTypeHandler<T>(value));
json.setLastChar('}');
}
U_INTERNAL_DUMP("json(%u) = %V", json.size(), json.rep)
}
void fromJSON(UValue& json)
{
U_TRACE(0, "UJsonTypeHandler<stringtobitmaskmap>::fromJSON(%p)", &json)
U_ASSERT(((stringtobitmaskmap*)pval)->empty())
UValue* pelement = json.toNode();
while (pelement)
{
uint64_t pitem;
UJsonTypeHandler<uint64_t>(pitem).fromJSON(*pelement);
UStringRep* rep = (UStringRep*)u_getPayload(pelement->pkey.ival);
U_INTERNAL_DUMP("pelement->pkey(%p) = %V", rep, rep)
((stringtobitmaskmap*)pval)->insert_or_assign(rep, pitem); // insert_or_assign is C++17
pelement = pelement->next;
}
}
};
# define PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(type, templateParameter, accessQualifier) \
\
template <templateParameter> class U_EXPORT UJsonTypeHandler<std::unordered_map<UString, type> > : public UJsonTypeHandler_Base { \
public: \
typedef std::unordered_map<UString, type> ustringmap; \
\
explicit UJsonTypeHandler(ustringmap& map) : UJsonTypeHandler_Base(&map) {} \
\
void clear() \
{ \
U_TRACE_NO_PARAM(0, "UJsonTypeHandler<ustring" #type "map>::clear()") \
\
((ustringmap*)pval)->clear(); \
} \
\
void toJSON(UString& json) \
{ \
U_TRACE(0, "UJsonTypeHandler<ustring" #type "map>::toJSON(%p)", &json) \
\
ustringmap* pmap = (ustringmap*)pval; \
\
if (pmap->empty()) \
{ \
char* ptr = json.pend(); \
\
u_put_unalignedp16(ptr, U_MULTICHAR_CONSTANT16('{','}')); \
\
json.rep->_length += 2; \
} \
else \
{ \
json.__push('{'); \
\
for (auto & [ key, value ] : *pmap) json.toJSON<type>(key, UJsonTypeHandler<type>(value)); \
\
json.setLastChar('}'); \
} \
\
U_INTERNAL_DUMP("json(%u) = %V", json.size(), json.rep) \
} \
\
void fromJSON(UValue& json) \
{ \
U_TRACE(0, "UJsonTypeHandler<ustring" #type "map>::fromJSON(%p)", &json) \
\
U_ASSERT(((ustringmap*)pval)->empty()) \
\
UValue* pelement = json.toNode(); \
\
while (pelement) \
{ \
type pitem; \
\
UJsonTypeHandler<type>(accessQualifier pitem).fromJSON(*pelement); \
\
UString key = UString((UStringRep*)u_getPayload(pelement->pkey.ival)); \
\
U_INTERNAL_DUMP("pelement->pkey(%p) = %V", key, key.rep) \
\
((ustringmap*)pval)->insert_or_assign(key, pitem); \
\
pelement = pelement->next; \
} \
} \
}; \
#define noPointer
#define yesPointer *
PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE( int64_t, , noPointer)
PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(uint64_t, , noPointer)
PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(T, class T, noPointer)
PRINT_U_STRING_UNORDERED_MAP_JSON_HANDLER_FOR_TYPE(T*, class T, yesPointer)
#undef noPointer
#undef yesPointer
# endif
#endif
#endif

View File

@ -21,7 +21,7 @@ extern "C" {
}
#ifndef U_MYSQL_STRING_SIZE
#define U_MYSQL_STRING_SIZE (8192-sizeof(USqlStatementBindResult))
#define U_MYSQL_STRING_SIZE (4096-sizeof(USqlStatementBindResult))
#endif
class U_EXPORT UMySqlStatementBindParam : public USqlStatementBindParam {

View File

@ -1300,6 +1300,8 @@ data_missing:
#if defined(U_SERVER_CAPTIVE_PORTAL) && defined(ENABLE_THREAD)
if (UHTTP::checkForUSP()) U_RETURN(U_NOTIFIER_OK);
if (U_ClientImage_parallelization == U_PARALLELIZATION_PARENT) U_RETURN(U_NOTIFIER_DELETE);
#endif
size_request = 0;
@ -1585,7 +1587,7 @@ end: if (U_ClientImage_parallelization == U_PARALLELIZATION_CHILD) goto death;
}
death:
UServer_Base::endNewChild(); // no return;
UServer_Base::endNewChild(); // no return
}
last_event = u_now->tv_sec;

View File

@ -7,15 +7,6 @@ TechEmpower Web Framework Benchmarks
static UCache* cache;
static void handlerQuery(uint32_t i)
{
U_TRACE(5, "::handlerQuery(%u)", i)
U_INTERNAL_ASSERT_POINTER(cache)
World::rnum = cache->getNumber(World::rnumber[i]);
}
static void usp_init_cached_worlds()
{
U_TRACE(5, "::usp_init_cached_worlds()")
@ -49,17 +40,16 @@ static void usp_init_cached_worlds()
World::handlerFork();
}
#ifdef DEBUG
static void usp_end_cached_worlds()
static void handlerQuery(uint32_t i)
{
U_TRACE(5, "::usp_end_cached_worlds()")
U_TRACE(5, "::handlerQuery(%u)", i)
if (cache) U_DELETE(cache)
U_INTERNAL_ASSERT_POINTER(cache)
World::rnum = cache->getNumber(World::rnumber[i]);
}
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(handlerQuery);

View File

@ -6,8 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "world.h"
#ifdef U_STATIC_ORM_DRIVER_PGSQL
static UOrmDriver* pdrv;
static USqlStatement* pstmt;
static UOrmDriverPgSql* pdrv;
static UPgSqlStatement* pstmt;
#endif
static void usp_fork_db()
@ -19,32 +19,27 @@ static void usp_fork_db()
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (UOrmDriver::isPGSQL())
{
pdrv = World::psql_query->getDriver();
pstmt = World::pstmt_query->getStatement();
pdrv = (UOrmDriverPgSql*) World::psql_query->getDriver();
pstmt = (UPgSqlStatement*) World::pstmt_query->getStatement();
(void) ((UPgSqlStatement*)pstmt)->setBindParam(pdrv);
}
#endif
}
#ifdef DEBUG
static void usp_end_db() { World::handlerEndSql(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::pwbuffer = UClientImage_Base::wbuffer->pend();
World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500];
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv)
{
((UPgSqlStatement*)pstmt)->setBindParam();
pstmt->setBindParam();
PGresult* res = ((UOrmDriverPgSql*)pdrv)->execPrepared(pstmt);
PGresult* res = pdrv->execPrepared(pstmt);
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_edb() { WorldNoSql::handlerForkElasticSearch(); }
#ifdef DEBUG
static void usp_end_edb() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryElasticSearch);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_equery() { WorldNoSql::handlerForkElasticSearch(); }
#ifdef DEBUG
static void usp_end_equery() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryElasticSearch);

View File

@ -20,13 +20,8 @@ static void usp_fork_eupdate()
WorldNoSql::pbuffer2 = WorldNoSql::es_buffer2 + U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"");
}
}
#ifdef DEBUG
static void usp_end_eupdate() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateElasticSearch);

View File

@ -139,7 +139,7 @@ public:
U_INTERNAL_ASSERT_POINTER(pvfortune)
char* pwbuffer = UClientImage_Base::wbuffer->pend();
char* pwbuffer = UClientImage_Base::wbuffer->data();
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64('<','!','d','o','c','t','y','p'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('e',' ','h','t','m','l','>','<'));

View File

@ -7,8 +7,8 @@ TechEmpower Web Framework Benchmarks
static vPF handle_query;
#ifdef U_STATIC_ORM_DRIVER_PGSQL
static UOrmDriver* pdrv;
static USqlStatement* pstmt;
static UOrmDriverPgSql* pdrv;
static UPgSqlStatement* pstmt;
#endif
static void handlerQuery()
@ -33,7 +33,7 @@ static void handlerQueryPGSQL()
int sz;
char* id;
char* ptr;
PGresult* res = ((UOrmDriverPgSql*)pdrv)->execPrepared(pstmt);
PGresult* res = pdrv->execPrepared(pstmt);
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 2)
@ -62,17 +62,13 @@ static void usp_fork_fortune()
handle_query = handlerQueryPGSQL;
# ifdef U_STATIC_ORM_DRIVER_PGSQL
pdrv = Fortune::psql_fortune->getDriver();
pstmt = Fortune::pstmt_fortune->getStatement();
pdrv = (UOrmDriverPgSql*) Fortune::psql_fortune->getDriver();
pstmt = (UPgSqlStatement*) Fortune::pstmt_fortune->getStatement();
((UPgSqlStatement*)pstmt)->prepareStatement(pdrv);
pstmt->prepareStatement(pdrv);
# endif
}
}
#ifdef DEBUG
static void usp_end_fortune() { Fortune::handlerEndSql(); }
#endif
-->
<!--#code
Fortune::doQuery(handle_query);

View File

@ -13,20 +13,23 @@ static void usp_init_json()
U_NEW_STRING(pkey, UString(U_CONSTANT_TO_PARAM("message")));
U_NEW_STRING(pvalue, UString(U_CONSTANT_TO_PARAM("Hello, World!")));
}
#ifdef DEBUG
static void usp_end_json()
{
U_TRACE(5, "::usp_end_json()")
U_DELETE(pkey)
U_DELETE(pvalue)
}
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
UValue::stringify(*UClientImage_Base::wbuffer, UValue(*pkey, *pvalue));
char* pwbuffer = UClientImage_Base::wbuffer->data();
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(pwbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(pwbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp16(pwbuffer+32, U_MULTICHAR_CONSTANT16('\r','\n'));
UValue::pstringify = pwbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
UValue(*pkey, *pvalue).stringify();
UClientImage_Base::wbuffer->size_adjust(UValue::pstringify);
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
-->

View File

@ -2,6 +2,7 @@
#include "world.h"
char World::wbuffer[18000];
char* World::pwbuffer;
World* World::pworld_query;
uint32_t World::rnum;

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mdb() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mdb() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryMongoDB);

View File

@ -6,10 +6,6 @@ TechEmpower Web Framework Benchmarks
#include "fortuneNoSql.h"
static void usp_fork_mfortune() { FortuneNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mfortune() { FortuneNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#code
Fortune::doQuery(FortuneNoSql::handlerQueryMongoDB);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mquery() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mquery() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryMongoDB);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mupdate() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mupdate() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateMongoDB);

View File

@ -6,21 +6,16 @@ TechEmpower Web Framework Benchmarks
#include "world.h"
static void usp_fork_query() { World::handlerForkSql(); }
#ifdef DEBUG
static void usp_end_query() { World::handlerEndSql(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult(num_queries);
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
for (uint32_t i = 0; i < num_queries; ++i)
{
World::pworld_query->id = World::rnumber[i];

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rdb() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rdb() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryREDIS);

View File

@ -6,10 +6,6 @@ TechEmpower Web Framework Benchmarks
#include "fortuneNoSql.h"
static void usp_fork_rfortune() { FortuneNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rfortune() { FortuneNoSql::handlerEndREDIS(); }
#endif
-->
Fortune::doQuery(FortuneNoSql::handlerQueryREDIS);
-->

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rquery() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rquery() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryREDIS);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rupdate() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rupdate() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateREDIS);

View File

@ -28,16 +28,24 @@ static void usp_fork_update()
}
-->
<!--#header
Content-Type: application/json
-->
<!--#vcode
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
uint32_t i, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult(num_queries);
World::initResult();
if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
{
for (i = 0; i < num_queries; ++i)
for (uint32_t i = 0; i < num_queries; ++i)
{
World::pworld_query->id = World::rnumber[i];
@ -58,7 +66,7 @@ else
pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
for (i = 0; i < num_queries; ++i)
for (uint32_t i = 0; i < num_queries; ++i)
{
*pquery++ = '(';

View File

@ -43,6 +43,7 @@ public:
bfirst_pass =
is_html =
test_if_html =
bhttp_header_empty =
bpreprocessing_failed = false;
}
@ -466,29 +467,33 @@ public:
setDirectiveItem(directive, U_CONSTANT_SIZE("header"));
// NB: we use insert because the possibility of UHTTP::callService() (see chat.usp)...
if (token.empty()) bhttp_header_empty = true;
else
{
// NB: we use insert because the possibility of UHTTP::callService() (see chat.usp)...
bool bheader = (U_STRING_FIND(token, 0, "Content-Type") != U_NOT_FOUND);
bool bheader = (U_STRING_FIND(token, 0, "Content-Type") != U_NOT_FOUND);
http_header = UStringExt::dos2unix(token, true);
http_header = UStringExt::dos2unix(token, true);
(void) http_header.append(U_CONSTANT_TO_PARAM("\r\n\r\n"));
(void) http_header.append(U_CONSTANT_TO_PARAM("\r\n\r\n"));
uint32_t n = http_header.size();
uint32_t n = http_header.size();
UString encoded(n * 4);
UString encoded(n * 4);
UEscape::encode(http_header, encoded);
UEscape::encode(http_header, encoded);
U_ASSERT(encoded.isQuoted())
U_ASSERT(encoded.isQuoted())
(void) output1.reserve(200U);
(void) http_header.reserve(200U + encoded.size());
(void) output1.reserve(200U);
(void) http_header.reserve(200U + encoded.size());
(void) http_header.snprintf(U_CONSTANT_TO_PARAM("\n\tU_ASSERT_EQUALS(UClientImage_Base::wbuffer->findEndHeader(),false)"
"\n\t(void) UClientImage_Base::wbuffer->insert(0, U_CONSTANT_TO_PARAM(%v));\n\t\n"), encoded.rep);
(void) http_header.snprintf(U_CONSTANT_TO_PARAM("\n\tU_ASSERT_EQUALS(UClientImage_Base::wbuffer->findEndHeader(),false)"
"\n\t(void) UClientImage_Base::wbuffer->insert(0, U_CONSTANT_TO_PARAM(%v));\n\t\n"), encoded.rep);
(void) output1.snprintf_add(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = %.*s%u;\n"), bheader ? U_CONSTANT_SIZE("(uint32_t)-") : 0, "(uint32_t)-", n);
(void) output1.snprintf_add(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = %.*s%u;\n"), bheader ? U_CONSTANT_SIZE("(uint32_t)-") : 0, "(uint32_t)-", n);
}
}
else if (strncmp(directive, U_CONSTANT_TO_PARAM("number")) == 0)
{
@ -834,8 +839,9 @@ loop: distance = t.getDistance();
if (http_header.empty())
{
(void) output1.append(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = 0;\n"));
if (is_html) (void) output1.append(U_CONSTANT_TO_PARAM("\n\tUHTTP::mime_index = U_html;\n"));
if (bhttp_header_empty == false) (void) output1.append(U_CONSTANT_TO_PARAM("\n\tU_http_info.endHeader = 0;\n"));
}
// NB: we check for presence of 'return' inside the code...
@ -932,7 +938,7 @@ private:
UString pinclude, usp, token, output0, output1, declaration, vcode, http_header, sseloop, vars;
const char* basename_ptr;
uint32_t basename_sz;
bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bpreprocessing_failed;
bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bhttp_header_empty, bpreprocessing_failed;
U_DISALLOW_COPY_AND_ASSIGN(Application)
};

View File

@ -112,55 +112,70 @@ public:
}
static char* pwbuffer;
static char wbuffer[18000];
static uint32_t rnum, rnumber[500];
static World* pworld_query;
static UOrmSession* psql_query;
static UOrmStatement* pstmt_query;
static void initResult(uint32_t num_queries)
static void initResult()
{
U_TRACE(0, "World::initResult(%u)", num_queries)
U_TRACE(0, "World::initResult()")
(void) UClientImage_Base::wbuffer->reserve(36U * num_queries);
u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(wbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(wbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp32(wbuffer+32, U_MULTICHAR_CONSTANT32('\r','\n','[','\0'));
pwbuffer = UClientImage_Base::wbuffer->pend();
pwbuffer = wbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n[");
*pwbuffer++ = '[';
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
}
static void endResult()
{
U_TRACE_NO_PARAM(0, "World::endResult()")
U_INTERNAL_ASSERT_POINTER(pwbuffer)
*(pwbuffer-1) = ']';
UClientImage_Base::wbuffer->size_adjust(pwbuffer);
UClientImage_Base::wbuffer->setConstant(wbuffer, pwbuffer-wbuffer);
}
static void initOneResult()
{
U_TRACE(0, "World::initOneResult()")
u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(wbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(wbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp32(wbuffer+32, U_MULTICHAR_CONSTANT32('\r','\n','{','\0'));
pwbuffer = wbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n{");
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
}
static void endOneResult()
{
U_TRACE_NO_PARAM(0, "World::endOneResult()")
U_INTERNAL_ASSERT_POINTER(pwbuffer)
*pwbuffer = '}';
*pwbuffer++ = '}';
UClientImage_Base::wbuffer->size_adjust(pwbuffer);
UClientImage_Base::wbuffer->setConstant(wbuffer, pwbuffer-wbuffer+1);
}
static void handlerOneResult(uint32_t uid, uint32_t random)
{
U_TRACE(0, "World::handlerOneResult(%u,%u)", uid, random)
U_INTERNAL_ASSERT_POINTER(pwbuffer)
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('"','i','d','"'));
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
pwbuffer[4] = ':';
pwbuffer = u_num2str32(uid, pwbuffer+6);
pwbuffer = u_num2str32(uid, pwbuffer+5);
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
@ -172,7 +187,15 @@ public:
{
U_TRACE(0, "World::handlerResult(%u,%u)", uid, random)
handlerOneResult(uid, random);
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
pwbuffer = u_num2str32(uid, pwbuffer+6);
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
pwbuffer = u_num2str32(random, pwbuffer+16);
u_put_unalignedp16(pwbuffer, U_MULTICHAR_CONSTANT16('}',','));
pwbuffer += 2;
@ -200,11 +223,9 @@ public:
{
U_TRACE(0, "World::doUpdateNoSql(%p)", handlerUpdateNoSql)
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
initResult();
initResult(num_queries);
for (uint32_t i = 0; i < num_queries; ++i)
for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i)
{
handlerUpdateNoSql(i);

View File

@ -24,17 +24,18 @@ public:
U_INTERNAL_ASSERT_POINTER(str_rnumber)
U_INTERNAL_ASSERT_POINTER(World::pwbuffer)
uint32_t sz = str_rnumber->size();
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('"','i','d','"'));
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(World::pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
World::pwbuffer[4] = ':';
World::pwbuffer = u_num2str32(uid, World::pwbuffer+6);
World::pwbuffer = u_num2str32(uid, World::pwbuffer+5);
u_put_unalignedp64(World::pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(World::pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
World::pwbuffer += 16;
uint32_t sz = str_rnumber->size();
(void) memcpy(World::pwbuffer, str_rnumber->data(), sz);
World::pwbuffer += sz;
@ -45,7 +46,24 @@ public:
{
U_TRACE(0, "WorldNoSql::handlerResult(%u)", uid)
handlerOneResult(uid);
U_INTERNAL_ASSERT_POINTER(str_rnumber)
U_INTERNAL_ASSERT_POINTER(World::pwbuffer)
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(World::pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
World::pwbuffer = u_num2str32(uid, World::pwbuffer+6);
u_put_unalignedp64(World::pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(World::pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
World::pwbuffer += 16;
uint32_t sz = str_rnumber->size();
(void) memcpy(World::pwbuffer, str_rnumber->data(), sz);
World::pwbuffer += sz;
str_rnumber->clear();
u_put_unalignedp16(World::pwbuffer, U_MULTICHAR_CONSTANT16('}',','));
World::pwbuffer += 2;
@ -55,11 +73,13 @@ public:
{
U_TRACE(0, "WorldNoSql::doOneQuery(%p)", handlerQuery)
World::pwbuffer = UClientImage_Base::wbuffer->pend();
World::initOneResult();
handlerQuery(World::rnumber[0]);
uint32_t i = u_now->tv_usec % 500;
handlerOneResult(World::rnumber[0]);
handlerQuery(World::rnumber[i]);
handlerOneResult(World::rnumber[i]);
World::endOneResult();
}
@ -68,11 +88,9 @@ public:
{
U_TRACE(0, "WorldNoSql::doQuery(%p)", handlerQuery)
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult();
World::initResult(num_queries);
for (uint32_t i = 0; i < num_queries; ++i)
for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i)
{
handlerQuery(World::rnumber[i]);

View File

@ -11727,11 +11727,16 @@ next: if (*ptr1 == '?')
usp->runDynamicPage(0);
setDynamicResponse();
if (U_ClientImage_parallelization < U_PARALLELIZATION_PARENT)
{
setDynamicResponse();
(void) UServer_Base::pClientImage->writeResponse();
(void) UServer_Base::pClientImage->writeResponse();
U_RETURN(true);
if (U_ClientImage_parallelization == U_PARALLELIZATION_CHILD) UServer_Base::endNewChild(); // no return
U_RETURN(true);
}
}
}

View File

@ -1 +1 @@
017A
0181

View File

@ -7,15 +7,6 @@ TechEmpower Web Framework Benchmarks
static UCache* cache;
static void handlerQuery(uint32_t i)
{
U_TRACE(5, "::handlerQuery(%u)", i)
U_INTERNAL_ASSERT_POINTER(cache)
World::rnum = cache->getNumber(World::rnumber[i]);
}
static void usp_init_cached_worlds()
{
U_TRACE(5, "::usp_init_cached_worlds()")
@ -49,17 +40,16 @@ static void usp_init_cached_worlds()
World::handlerFork();
}
#ifdef DEBUG
static void usp_end_cached_worlds()
static void handlerQuery(uint32_t i)
{
U_TRACE(5, "::usp_end_cached_worlds()")
U_TRACE(5, "::handlerQuery(%u)", i)
if (cache) U_DELETE(cache)
U_INTERNAL_ASSERT_POINTER(cache)
World::rnum = cache->getNumber(World::rnumber[i]);
}
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(handlerQuery);

View File

@ -6,8 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "world.h"
#ifdef U_STATIC_ORM_DRIVER_PGSQL
static UOrmDriver* pdrv;
static USqlStatement* pstmt;
static UOrmDriverPgSql* pdrv;
static UPgSqlStatement* pstmt;
#endif
static void usp_fork_db()
@ -19,32 +19,27 @@ static void usp_fork_db()
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (UOrmDriver::isPGSQL())
{
pdrv = World::psql_query->getDriver();
pstmt = World::pstmt_query->getStatement();
pdrv = (UOrmDriverPgSql*) World::psql_query->getDriver();
pstmt = (UPgSqlStatement*) World::pstmt_query->getStatement();
(void) ((UPgSqlStatement*)pstmt)->setBindParam(pdrv);
}
#endif
}
#ifdef DEBUG
static void usp_end_db() { World::handlerEndSql(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::pwbuffer = UClientImage_Base::wbuffer->pend();
World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500];
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv)
{
((UPgSqlStatement*)pstmt)->setBindParam();
pstmt->setBindParam();
PGresult* res = ((UOrmDriverPgSql*)pdrv)->execPrepared(pstmt);
PGresult* res = pdrv->execPrepared(pstmt);
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 1)
U_INTERNAL_ASSERT_EQUALS(PQntuples(res), 1)

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_edb() { WorldNoSql::handlerForkElasticSearch(); }
#ifdef DEBUG
static void usp_end_edb() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryElasticSearch);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_equery() { WorldNoSql::handlerForkElasticSearch(); }
#ifdef DEBUG
static void usp_end_equery() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryElasticSearch);

View File

@ -20,13 +20,8 @@ static void usp_fork_eupdate()
WorldNoSql::pbuffer2 = WorldNoSql::es_buffer2 + U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"");
}
}
#ifdef DEBUG
static void usp_end_eupdate() { WorldNoSql::handlerEndElasticSearch(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateElasticSearch);

View File

@ -139,7 +139,7 @@ public:
U_INTERNAL_ASSERT_POINTER(pvfortune)
char* pwbuffer = UClientImage_Base::wbuffer->pend();
char* pwbuffer = UClientImage_Base::wbuffer->data();
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64('<','!','d','o','c','t','y','p'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('e',' ','h','t','m','l','>','<'));

View File

@ -7,8 +7,8 @@ TechEmpower Web Framework Benchmarks
static vPF handle_query;
#ifdef U_STATIC_ORM_DRIVER_PGSQL
static UOrmDriver* pdrv;
static USqlStatement* pstmt;
static UOrmDriverPgSql* pdrv;
static UPgSqlStatement* pstmt;
#endif
static void handlerQuery()
@ -33,7 +33,7 @@ static void handlerQueryPGSQL()
int sz;
char* id;
char* ptr;
PGresult* res = ((UOrmDriverPgSql*)pdrv)->execPrepared(pstmt);
PGresult* res = pdrv->execPrepared(pstmt);
U_INTERNAL_ASSERT_EQUALS(PQnfields(res), 2)
@ -62,17 +62,13 @@ static void usp_fork_fortune()
handle_query = handlerQueryPGSQL;
# ifdef U_STATIC_ORM_DRIVER_PGSQL
pdrv = Fortune::psql_fortune->getDriver();
pstmt = Fortune::pstmt_fortune->getStatement();
pdrv = (UOrmDriverPgSql*) Fortune::psql_fortune->getDriver();
pstmt = (UPgSqlStatement*) Fortune::pstmt_fortune->getStatement();
((UPgSqlStatement*)pstmt)->prepareStatement(pdrv);
pstmt->prepareStatement(pdrv);
# endif
}
}
#ifdef DEBUG
static void usp_end_fortune() { Fortune::handlerEndSql(); }
#endif
-->
<!--#code
Fortune::doQuery(handle_query);

View File

@ -13,20 +13,23 @@ static void usp_init_json()
U_NEW_STRING(pkey, UString(U_CONSTANT_TO_PARAM("message")));
U_NEW_STRING(pvalue, UString(U_CONSTANT_TO_PARAM("Hello, World!")));
}
#ifdef DEBUG
static void usp_end_json()
{
U_TRACE(5, "::usp_end_json()")
U_DELETE(pkey)
U_DELETE(pvalue)
}
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
UValue::stringify(*UClientImage_Base::wbuffer, UValue(*pkey, *pvalue));
char* pwbuffer = UClientImage_Base::wbuffer->data();
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(pwbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(pwbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp16(pwbuffer+32, U_MULTICHAR_CONSTANT16('\r','\n'));
UValue::pstringify = pwbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
UValue(*pkey, *pvalue).stringify();
UClientImage_Base::wbuffer->size_adjust(UValue::pstringify);
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
-->

View File

@ -2,6 +2,7 @@
#include "world.h"
char World::wbuffer[18000];
char* World::pwbuffer;
World* World::pworld_query;
uint32_t World::rnum;

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mdb() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mdb() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryMongoDB);

View File

@ -6,10 +6,6 @@ TechEmpower Web Framework Benchmarks
#include "fortuneNoSql.h"
static void usp_fork_mfortune() { FortuneNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mfortune() { FortuneNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#code
Fortune::doQuery(FortuneNoSql::handlerQueryMongoDB);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mquery() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mquery() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryMongoDB);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_mupdate() { WorldNoSql::handlerForkMongoDB(); }
#ifdef DEBUG
static void usp_end_mupdate() { WorldNoSql::handlerEndMongoDB(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateMongoDB);

View File

@ -6,21 +6,16 @@ TechEmpower Web Framework Benchmarks
#include "world.h"
static void usp_fork_query() { World::handlerForkSql(); }
#ifdef DEBUG
static void usp_end_query() { World::handlerEndSql(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult(num_queries);
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
for (uint32_t i = 0; i < num_queries; ++i)
{
World::pworld_query->id = World::rnumber[i];

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rdb() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rdb() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doOneQuery(WorldNoSql::handlerQueryREDIS);

View File

@ -6,10 +6,6 @@ TechEmpower Web Framework Benchmarks
#include "fortuneNoSql.h"
static void usp_fork_rfortune() { FortuneNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rfortune() { FortuneNoSql::handlerEndREDIS(); }
#endif
-->
Fortune::doQuery(FortuneNoSql::handlerQueryREDIS);
-->

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rquery() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rquery() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
WorldNoSql::doQuery(WorldNoSql::handlerQueryREDIS);

View File

@ -6,13 +6,8 @@ TechEmpower Web Framework Benchmarks
#include "worldNoSql.h"
static void usp_fork_rupdate() { WorldNoSql::handlerForkREDIS(); }
#ifdef DEBUG
static void usp_end_rupdate() { WorldNoSql::handlerEndREDIS(); }
#endif
-->
<!--#header
Content-Type: application/json
-->
<!--#code
World::doUpdateNoSql(WorldNoSql::handlerUpdateREDIS);

View File

@ -28,16 +28,24 @@ static void usp_fork_update()
}
-->
<!--#header
Content-Type: application/json
-->
<!--#vcode
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
uint32_t i, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult(num_queries);
World::initResult();
if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
{
for (i = 0; i < num_queries; ++i)
for (uint32_t i = 0; i < num_queries; ++i)
{
World::pworld_query->id = World::rnumber[i];
@ -58,7 +66,7 @@ else
pquery = query + U_CONSTANT_SIZE("UPDATE World SET randomNumber = v.randomNumber FROM (VALUES");
for (i = 0; i < num_queries; ++i)
for (uint32_t i = 0; i < num_queries; ++i)
{
*pquery++ = '(';

View File

@ -112,55 +112,70 @@ public:
}
static char* pwbuffer;
static char wbuffer[18000];
static uint32_t rnum, rnumber[500];
static World* pworld_query;
static UOrmSession* psql_query;
static UOrmStatement* pstmt_query;
static void initResult(uint32_t num_queries)
static void initResult()
{
U_TRACE(0, "World::initResult(%u)", num_queries)
U_TRACE(0, "World::initResult()")
(void) UClientImage_Base::wbuffer->reserve(36U * num_queries);
u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(wbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(wbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp32(wbuffer+32, U_MULTICHAR_CONSTANT32('\r','\n','[','\0'));
pwbuffer = UClientImage_Base::wbuffer->pend();
pwbuffer = wbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n[");
*pwbuffer++ = '[';
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
}
static void endResult()
{
U_TRACE_NO_PARAM(0, "World::endResult()")
U_INTERNAL_ASSERT_POINTER(pwbuffer)
*(pwbuffer-1) = ']';
UClientImage_Base::wbuffer->size_adjust(pwbuffer);
UClientImage_Base::wbuffer->setConstant(wbuffer, pwbuffer-wbuffer);
}
static void initOneResult()
{
U_TRACE(0, "World::initOneResult()")
u_put_unalignedp64(wbuffer, U_MULTICHAR_CONSTANT64('C','o','n','t','e','n','t','-'));
u_put_unalignedp64(wbuffer+8, U_MULTICHAR_CONSTANT64('T','y','p','e',':',' ','a','p'));
u_put_unalignedp64(wbuffer+16, U_MULTICHAR_CONSTANT64('p','l','i','c','a','t','i','o'));
u_put_unalignedp64(wbuffer+24, U_MULTICHAR_CONSTANT64('n','/','j','s','o','n','\r','\n'));
u_put_unalignedp32(wbuffer+32, U_MULTICHAR_CONSTANT32('\r','\n','{','\0'));
pwbuffer = wbuffer + U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n{");
U_http_info.endHeader = (uint32_t)-U_CONSTANT_SIZE("Content-Type: application/json\r\n\r\n");
}
static void endOneResult()
{
U_TRACE_NO_PARAM(0, "World::endOneResult()")
U_INTERNAL_ASSERT_POINTER(pwbuffer)
*pwbuffer = '}';
*pwbuffer++ = '}';
UClientImage_Base::wbuffer->size_adjust(pwbuffer);
UClientImage_Base::wbuffer->setConstant(wbuffer, pwbuffer-wbuffer+1);
}
static void handlerOneResult(uint32_t uid, uint32_t random)
{
U_TRACE(0, "World::handlerOneResult(%u,%u)", uid, random)
U_INTERNAL_ASSERT_POINTER(pwbuffer)
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('"','i','d','"'));
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
pwbuffer[4] = ':';
pwbuffer = u_num2str32(uid, pwbuffer+6);
pwbuffer = u_num2str32(uid, pwbuffer+5);
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
@ -172,7 +187,15 @@ public:
{
U_TRACE(0, "World::handlerResult(%u,%u)", uid, random)
handlerOneResult(uid, random);
u_put_unalignedp32(pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
pwbuffer = u_num2str32(uid, pwbuffer+6);
u_put_unalignedp64(pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
pwbuffer = u_num2str32(random, pwbuffer+16);
u_put_unalignedp16(pwbuffer, U_MULTICHAR_CONSTANT16('}',','));
pwbuffer += 2;
@ -200,11 +223,9 @@ public:
{
U_TRACE(0, "World::doUpdateNoSql(%p)", handlerUpdateNoSql)
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
initResult();
initResult(num_queries);
for (uint32_t i = 0; i < num_queries; ++i)
for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i)
{
handlerUpdateNoSql(i);

View File

@ -24,17 +24,18 @@ public:
U_INTERNAL_ASSERT_POINTER(str_rnumber)
U_INTERNAL_ASSERT_POINTER(World::pwbuffer)
uint32_t sz = str_rnumber->size();
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('"','i','d','"'));
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(World::pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
World::pwbuffer[4] = ':';
World::pwbuffer = u_num2str32(uid, World::pwbuffer+6);
World::pwbuffer = u_num2str32(uid, World::pwbuffer+5);
u_put_unalignedp64(World::pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(World::pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
World::pwbuffer += 16;
uint32_t sz = str_rnumber->size();
(void) memcpy(World::pwbuffer, str_rnumber->data(), sz);
World::pwbuffer += sz;
@ -45,7 +46,24 @@ public:
{
U_TRACE(0, "WorldNoSql::handlerResult(%u)", uid)
handlerOneResult(uid);
U_INTERNAL_ASSERT_POINTER(str_rnumber)
U_INTERNAL_ASSERT_POINTER(World::pwbuffer)
u_put_unalignedp32(World::pwbuffer, U_MULTICHAR_CONSTANT32('{','"','i','d'));
u_put_unalignedp16(World::pwbuffer+4, U_MULTICHAR_CONSTANT16('"',':'));
World::pwbuffer = u_num2str32(uid, World::pwbuffer+6);
u_put_unalignedp64(World::pwbuffer, U_MULTICHAR_CONSTANT64(',','"','r','a','n','d','o','m'));
u_put_unalignedp64(World::pwbuffer+8, U_MULTICHAR_CONSTANT64('N','u','m','b','e','r','"',':'));
World::pwbuffer += 16;
uint32_t sz = str_rnumber->size();
(void) memcpy(World::pwbuffer, str_rnumber->data(), sz);
World::pwbuffer += sz;
str_rnumber->clear();
u_put_unalignedp16(World::pwbuffer, U_MULTICHAR_CONSTANT16('}',','));
World::pwbuffer += 2;
@ -55,11 +73,13 @@ public:
{
U_TRACE(0, "WorldNoSql::doOneQuery(%p)", handlerQuery)
World::pwbuffer = UClientImage_Base::wbuffer->pend();
World::initOneResult();
handlerQuery(World::rnumber[0]);
uint32_t i = u_now->tv_usec % 500;
handlerOneResult(World::rnumber[0]);
handlerQuery(World::rnumber[i]);
handlerOneResult(World::rnumber[i]);
World::endOneResult();
}
@ -68,11 +88,9 @@ public:
{
U_TRACE(0, "WorldNoSql::doQuery(%p)", handlerQuery)
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
World::initResult();
World::initResult(num_queries);
for (uint32_t i = 0; i < num_queries; ++i)
for (uint32_t i = 0, n = UHTTP::getFormFirstNumericValue(1, 500); i < n; ++i)
{
handlerQuery(World::rnumber[i]);