Browse Source

ULib: fix warning on query tests, json tests with different number of preforked process, elasticsearch code

stefanocasazza 9 years ago
parent
commit
e66d75512d

+ 3 - 0
frameworks/C++/ulib/README.md

@@ -11,12 +11,14 @@ This is the [ULib](http://stefanocasazza.github.io/ULib/) portion of a [benchmar
 * [Database test source (SQL)](src/db.usp)
 * [Database test source (REDIS)](src/rdb.usp)
 * [Database test source (MONGODB)](src/mdb.usp)
+* [Database test source (ELASTICSEARCH)](src/edb.usp)
 
 ### Variable Query Test
 
 * [Variable Query test source (SQL)](src/query.usp)
 * [Variable Query test source (REDIS)](src/rquery.usp)
 * [Variable Query test source (MONGODB)](src/mquery.usp)
+* [Variable Query test source (ELASTICSEARCH)](src/equery.usp)
 
 ### Fortune Query Test
 
@@ -29,6 +31,7 @@ This is the [ULib](http://stefanocasazza.github.io/ULib/) portion of a [benchmar
 * [Variable Query (update) test source (SQL)](src/update.usp)
 * [Variable Query (update) test source (REDIS)](src/rupdate.usp)
 * [Variable Query (update) test source (MONGODB)](src/mupdate.usp)
+* [Variable Query (update) test source (ELASTICSEARCH)](src/eupdate.usp)
 
 ### Plaintext Test
 

+ 55 - 1
frameworks/C++/ulib/benchmark_config.json

@@ -19,7 +19,7 @@
       "notes": "",
       "versus": ""
     },
-    "json": {
+    "json_normal": {
       "setup_file": "setup_json",
       "json_url": "/json",
       "port": 8080,
@@ -37,6 +37,60 @@
       "notes": "",
       "versus": ""
     },
+    "json_medium": {
+      "setup_file": "setup_json_medium",
+      "json_url": "/json",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "ULib",
+      "language": "C++",
+      "orm": "Micro",
+      "platform": "ULib",
+      "webserver": "ULib",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "ULib",
+      "notes": "",
+      "versus": ""
+    },
+    "json_large": {
+      "setup_file": "setup_json_large",
+      "json_url": "/json",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "ULib",
+      "language": "C++",
+      "orm": "Micro",
+      "platform": "ULib",
+      "webserver": "ULib",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "ULib",
+      "notes": "",
+      "versus": ""
+    },
+    "json_extra": {
+      "setup_file": "setup_json_extra",
+      "json_url": "/json",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "ULib",
+      "language": "C++",
+      "orm": "Micro",
+      "platform": "ULib",
+      "webserver": "ULib",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "ULib",
+      "notes": "",
+      "versus": ""
+    },
     "mysql": {
       "setup_file": "setup_mysql",
       "db_url": "/db",

+ 24 - 0
frameworks/C++/ulib/setup_elasticsearch.sh

@@ -0,0 +1,24 @@
+#!/bin/bash
+
+fw_depends ulib
+
+MAX_THREADS=$(( 2 * $MAX_THREADS ))
+
+# 1. Change ULib Server (userver_tcp) configuration
+sed -i "s|TCP_LINGER_SET .*|TCP_LINGER_SET 0|g"									  $IROOT/ULib/benchmark.cfg
+sed -i "s|LISTEN_BACKLOG .*|LISTEN_BACKLOG 256|g"								  $IROOT/ULib/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g"					  $IROOT/ULib/benchmark.cfg
+sed -i "s|CLIENT_FOR_PARALLELIZATION .*|CLIENT_FOR_PARALLELIZATION 100|g" $IROOT/ULib/benchmark.cfg
+
+# 2. Start ULib Server (userver_tcp)
+export ELASTICSEARCH_HOST=$DBHOST
+export UMEMPOOL="1261,0,0,49,274,-14,-15,-24,40"
+
+# Never use setcap inside of TRAVIS 
+[ "$TRAVIS" != "true" ] || { \
+if [ `ulimit -r` -eq 99 ]; then
+	sudo setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp
+fi
+}
+
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 2 - 4
frameworks/C++/ulib/setup_json.sh

@@ -2,10 +2,8 @@
 
 fw_depends ulib
 
-# Travis is broken
-if [ "$TRAVIS" != "true" ]; then
-MAX_THREADS=$(( 3 * $MAX_THREADS / 2 ))
-else
+# Travis is really broken!!
+if [ "$TRAVIS" == "true" ]; then
 MAX_THREADS=$(( 2 * $MAX_THREADS ))
 fi
 

+ 28 - 0
frameworks/C++/ulib/setup_json_extra.sh

@@ -0,0 +1,28 @@
+#!/bin/bash
+
+fw_depends ulib
+
+# Travis is broken
+if [ "$TRAVIS" != "true" ]; then
+MAX_THREADS=$(( 3 * $MAX_THREADS ))
+else
+MAX_THREADS=$(( 2 * $MAX_THREADS ))
+fi
+
+# 1. Change ULib Server (userver_tcp) configuration
+sed -i "s|TCP_LINGER_SET .*|TCP_LINGER_SET 0|g"									  $IROOT/ULib/benchmark.cfg
+sed -i "s|LISTEN_BACKLOG .*|LISTEN_BACKLOG 256|g"								  $IROOT/ULib/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g"					  $IROOT/ULib/benchmark.cfg
+sed -i "s|CLIENT_FOR_PARALLELIZATION .*|CLIENT_FOR_PARALLELIZATION 100|g" $IROOT/ULib/benchmark.cfg
+
+# 2. Start ULib Server (userver_tcp)
+export UMEMPOOL="58,0,0,41,273,-15,-14,-20,36"
+
+# Never use setcap inside of TRAVIS 
+[ "$TRAVIS" != "true" ] || { \
+if [ `ulimit -r` -eq 99 ]; then
+	sudo setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp
+fi
+}
+
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 23 - 0
frameworks/C++/ulib/setup_json_large.sh

@@ -0,0 +1,23 @@
+#!/bin/bash
+
+fw_depends ulib
+
+MAX_THREADS=$(( 2 * $MAX_THREADS ))
+
+# 1. Change ULib Server (userver_tcp) configuration
+sed -i "s|TCP_LINGER_SET .*|TCP_LINGER_SET 0|g"									  $IROOT/ULib/benchmark.cfg
+sed -i "s|LISTEN_BACKLOG .*|LISTEN_BACKLOG 256|g"								  $IROOT/ULib/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g"					  $IROOT/ULib/benchmark.cfg
+sed -i "s|CLIENT_FOR_PARALLELIZATION .*|CLIENT_FOR_PARALLELIZATION 100|g" $IROOT/ULib/benchmark.cfg
+
+# 2. Start ULib Server (userver_tcp)
+export UMEMPOOL="58,0,0,41,273,-15,-14,-20,36"
+
+# Never use setcap inside of TRAVIS 
+[ "$TRAVIS" != "true" ] || { \
+if [ `ulimit -r` -eq 99 ]; then
+	sudo setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp
+fi
+}
+
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 28 - 0
frameworks/C++/ulib/setup_json_medium.sh

@@ -0,0 +1,28 @@
+#!/bin/bash
+
+fw_depends ulib
+
+# Travis is broken
+if [ "$TRAVIS" != "true" ]; then
+MAX_THREADS=$(( 3 * $MAX_THREADS / 2 ))
+else
+MAX_THREADS=$(( 2 * $MAX_THREADS ))
+fi
+
+# 1. Change ULib Server (userver_tcp) configuration
+sed -i "s|TCP_LINGER_SET .*|TCP_LINGER_SET 0|g"									  $IROOT/ULib/benchmark.cfg
+sed -i "s|LISTEN_BACKLOG .*|LISTEN_BACKLOG 256|g"								  $IROOT/ULib/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g"					  $IROOT/ULib/benchmark.cfg
+sed -i "s|CLIENT_FOR_PARALLELIZATION .*|CLIENT_FOR_PARALLELIZATION 100|g" $IROOT/ULib/benchmark.cfg
+
+# 2. Start ULib Server (userver_tcp)
+export UMEMPOOL="58,0,0,41,273,-15,-14,-20,36"
+
+# Never use setcap inside of TRAVIS 
+[ "$TRAVIS" != "true" ] || { \
+if [ `ulimit -r` -eq 99 ]; then
+	sudo setcap cap_sys_nice,cap_sys_resource,cap_net_bind_service,cap_net_raw+eip $IROOT/ULib/bin/userver_tcp
+fi
+}
+
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 3 - 0
frameworks/C++/ulib/source_code

@@ -1,13 +1,16 @@
 ./src/db.usp
+./src/edb.usp
 ./src/rdb.usp
 ./src/mdb.usp
 ./src/world.h
 ./src/json.usp
 ./src/fortune.h
 ./src/query.usp
+./src/equery.usp
 ./src/rquery.usp
 ./src/mquery.usp
 ./src/update.usp
+./src/eupdate.usp
 ./src/rupdate.usp
 ./src/mupdate.usp
 ./src/fortune.usp

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

@@ -17,21 +17,21 @@ static void usp_fork_db()
 {
    U_TRACE(5, "::usp_fork_db()")
 
-   psql_db = U_NEW(UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
+   U_NEW(UOrmSession, psql_db, UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
 
    if (psql_db->isReady())
       {
-      pstmt_db = U_NEW(UOrmStatement(*psql_db, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
+      U_NEW(UOrmStatement, pstmt_db, UOrmStatement(*psql_db, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
 
       if (pstmt_db == 0) U_WARNING("usp_fork_db(): we cound't connect to db");
 
-      pworld_db = U_NEW(World);
+      U_NEW(World, pworld_db, World);
 
       pstmt_db->use( pworld_db->id);
       pstmt_db->into(pworld_db->randomNumber);
 
 #  ifndef AS_cpoll_cppsp_DO
-      pvalue = U_NEW(UValue(OBJECT_VALUE));
+      U_NEW(UValue, pvalue, UValue(OBJECT_VALUE));
 #  endif
       }
 }
@@ -58,7 +58,7 @@ static void usp_end_db()
 Content-Type: application/json
 -->
 <!--#code
-pworld_db->id = u_get_num_random(10000);
+pworld_db->id = u_get_num_random(10000-1);
 
 pstmt_db->execute();
 

+ 68 - 0
frameworks/C++/ulib/src/edb.usp

@@ -0,0 +1,68 @@
+<!--#
+Test type 2: Single database query
+TechEmpower Web Framework Benchmarks
+-->
+<!--#declaration
+#include "world.h"
+
+static char buffer[128];
+static UElasticSearchClient* es;
+
+#ifndef AS_cpoll_cppsp_DO
+static UValue*	pvalue;
+#endif
+
+#define QLEN U_CONSTANT_SIZE("{\"query\":{\"match\":{\"_id\":\"")
+
+static void usp_fork_edb()
+{
+	U_TRACE(5, "::usp_fork_edb()")
+
+	U_NEW(UElasticSearchClient, es, UElasticSearchClient);
+
+	if (es->connect() == false)
+		{
+		U_WARNING("usp_fork_edb(): connection disabled or failed");
+
+		return;
+		}
+
+	u__memcpy(buffer,	"{\"query\":{\"match\":{\"_id\":\"", QLEN, __PRETTY_FUNCTION__);
+
+#ifndef AS_cpoll_cppsp_DO
+	U_NEW(UValue, pvalue, UValue(OBJECT_VALUE));
+#endif
+}
+
+#ifdef DEBUG
+static void usp_end_edb()
+{
+	U_TRACE(5, "::usp_end_edb()")
+
+	delete es;
+
+#ifndef AS_cpoll_cppsp_DO
+	if (pvalue) delete pvalue;
+#endif
+}
+#endif
+-->
+<!--#header
+Content-Type: application/json
+-->
+<!--#code
+uint32_t id;
+UString result;
+
+(void) es->sendPOST(U_CONSTANT_TO_PARAM("/tfb/world/_search"), buffer, u__snprintf(buffer+QLEN, 128, "%u\"}}}", id = u_get_num_random(10000-1))+QLEN);
+
+(void) UValue::jfind(es->getContent(), U_CONSTANT_TO_PARAM("randomNumber"), result);
+
+#ifdef AS_cpoll_cppsp_DO
+USP_PRINTF_ADD("{\"id\":%u,\"randomNumber\":%v}", id, result.rep);
+#else
+World world(id, u_strtoul(result.data(), result.end()));
+USP_JSON_stringify(*pvalue, World, world);
+pvalue->clear();
+#endif
+-->

+ 102 - 0
frameworks/C++/ulib/src/equery.usp

@@ -0,0 +1,102 @@
+<!--#
+Test type 3: Multiple database queries
+TechEmpower Web Framework Benchmarks
+-->
+<!--#declaration
+#include "world.h"
+
+static char buffer[128];
+static UElasticSearchClient* es;
+
+#ifndef AS_cpoll_cppsp_DO
+static UValue* pvalue;
+static UVector<World*>* pvworld_query;
+#endif
+
+#define QLEN U_CONSTANT_SIZE("{\"query\":{\"match\":{\"_id\":\"")
+
+static void usp_fork_equery()
+{
+   U_TRACE(5, "::usp_fork_equery()")
+
+   U_NEW(UElasticSearchClient, es, UElasticSearchClient);
+
+   if (es->connect() == false)
+      {
+      U_WARNING("usp_fork_equery(): connection disabled or failed");
+
+      return;
+      }
+
+   u__memcpy(buffer, "{\"query\":{\"match\":{\"_id\":\"", QLEN, __PRETTY_FUNCTION__);
+
+#ifndef AS_cpoll_cppsp_DO
+   U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+   U_NEW(UVector<World*>, pvworld_query, UVector<World*>(500));
+#endif
+}
+
+#ifdef DEBUG
+static void usp_end_equery()
+{
+   U_TRACE(5, "::usp_end_equery()")
+
+   delete es;
+
+#ifndef AS_cpoll_cppsp_DO
+   if (pvalue)
+      {
+      delete pvalue;
+      delete pvworld_query;
+      }
+#endif
+}
+#endif
+-->
+<!--#header
+Content-Type: application/json
+-->
+<!--#code
+uint32_t id;
+UString rnumber;
+int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
+
+#ifdef AS_cpoll_cppsp_DO
+USP_PUTS_CHAR('[');
+#endif
+
+while (true)
+   {
+   (void) es->sendPOST(U_CONSTANT_TO_PARAM("/tfb/world/_search"), buffer, QLEN+u__snprintf(buffer+QLEN, 128, "%u\"}}}", id = u_get_num_random(10000-1)));
+
+   rnumber.clear();
+
+   (void) UValue::jfind(es->getContent(), U_CONSTANT_TO_PARAM("randomNumber"), rnumber);
+
+#ifdef AS_cpoll_cppsp_DO
+   USP_PRINTF("{\"id\":%u,\"randomNumber\":%v}", id, rnumber.rep);
+#else
+   World* pworld;
+
+   U_NEW(World, pworld, World(id, u_strtoul(rnumber.data(), rnumber.end())));
+
+   pvworld_query->push_back(pworld);
+#endif
+
+   if (++i == num_queries) break;
+
+#ifdef AS_cpoll_cppsp_DO
+   USP_PUTS_CHAR(',');
+#endif
+
+   rnumber.clear();
+   }
+
+#ifdef AS_cpoll_cppsp_DO
+USP_PUTS_CHAR(']');
+#else
+USP_JSON_stringify(*pvalue, UVector<World*>, *pvworld_query);
+pvalue->clear();
+pvworld_query->clear();
+#endif
+-->

+ 108 - 0
frameworks/C++/ulib/src/eupdate.usp

@@ -0,0 +1,108 @@
+<!--#
+Test type 5: Database updates
+TechEmpower Web Framework Benchmarks
+-->
+<!--#declaration
+#include "world.h"
+
+static char* pbuffer1;
+static char* pbuffer2;
+static char buffer1[128];
+static char buffer2[128];
+static UElasticSearchClient* es;
+
+#ifndef AS_cpoll_cppsp_DO
+static UValue* pvalue;
+static UVector<World*>* pvworld_update;
+#endif
+
+#define ULEN U_CONSTANT_SIZE("/tfb/world/")
+#define QLEN U_CONSTANT_SIZE("{\"doc\":{\"_id\":\"")
+
+static void usp_fork_eupdate()
+{
+   U_TRACE(5, "::usp_fork_eupdate()")
+
+   U_NEW(UElasticSearchClient, es, UElasticSearchClient);
+
+   if (es->connect() == false)
+      {
+      U_WARNING("usp_fork_eupdate(): connection disabled or failed");
+
+      return;
+      }
+
+   u__memcpy(buffer1, "/tfb/world/", ULEN, __PRETTY_FUNCTION__);
+
+   pbuffer1 = buffer1 + ULEN;
+
+   u__memcpy(buffer2, "{\"doc\":{\"_id\":\"", QLEN, __PRETTY_FUNCTION__);
+
+   pbuffer2 = buffer2 + QLEN;
+
+#ifndef AS_cpoll_cppsp_DO
+   U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+   U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
+#endif
+}
+
+#ifdef DEBUG
+static void usp_end_eupdate()
+{
+   U_TRACE(5, "::usp_end_eupdate()")
+
+   delete es;
+
+#ifndef AS_cpoll_cppsp_DO
+   if (pvalue)
+      {
+      delete pvalue;
+      delete pvworld_update;
+      }
+#endif
+}
+#endif
+-->
+<!--#header
+Content-Type: application/json
+-->
+<!--#code
+uint32_t len1, len2, id, rnum;
+int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
+
+#ifdef AS_cpoll_cppsp_DO
+USP_PUTS_CHAR('[');
+#endif
+
+while (true)
+   {
+   len1 = u__snprintf(pbuffer1, 100, "%u/_update", id = u_get_num_random(10000-1));
+   len2 = u__snprintf(pbuffer2, 100, "%u\"}}",   rnum = u_get_num_random(10000-1));
+
+   (void) es->sendPOST(buffer1, len1+ULEN, buffer2, len2+QLEN);
+
+#ifdef AS_cpoll_cppsp_DO
+   USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", id, rnum);
+#else
+   World* pworld;
+
+   U_NEW(World, pworld, World(id, rnum));
+
+   pvworld_update->push_back(pworld);
+#endif
+
+   if (++i == num_queries) break;
+
+#ifdef AS_cpoll_cppsp_DO
+   USP_PUTS_CHAR(',');
+#endif
+   }
+
+#ifdef AS_cpoll_cppsp_DO
+USP_PUTS_CHAR(']');
+#else
+USP_JSON_stringify(*pvalue, UVector<World*>, *pvworld_update);
+pvalue->clear();
+pvworld_update->clear();
+#endif
+-->

+ 16 - 8
frameworks/C++/ulib/src/fortune.usp

@@ -16,23 +16,23 @@ static void usp_fork_fortune()
 {
    U_TRACE(5, "::usp_fork_fortune()")
 
-   psql_fortune = U_NEW(UOrmSession(U_CONSTANT_TO_PARAM("fortune")));
+   U_NEW(UOrmSession, psql_fortune, UOrmSession(U_CONSTANT_TO_PARAM("fortune")));
 
    if (psql_fortune->isReady())
       {
-      pstmt_fortune = U_NEW(UOrmStatement(*psql_fortune, U_CONSTANT_TO_PARAM("SELECT id, message FROM Fortune")));
+      U_NEW(UOrmStatement, pstmt_fortune, UOrmStatement(*psql_fortune, U_CONSTANT_TO_PARAM("SELECT id, message FROM Fortune")));
 
       if (pstmt_fortune == 0) U_WARNING("usp_fork_fortune(): we cound't connect to db");
 
       if (UOrmDriver::isPGSQL()) *psql_fortune << "BEGIN ISOLATION LEVEL SERIALIZABLE; COMMIT";
 
-      pfortune = U_NEW(Fortune);
+      U_NEW(Fortune, pfortune, Fortune);
 
       pstmt_fortune->into(*pfortune);
 
-      pencoded     = U_NEW(UString(100U));
-      pvfortune    = U_NEW(UVector<Fortune*>);
-      pfortune2add = U_NEW(Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
+      U_NEW(UString, pencoded, UString(100U));
+      U_NEW(UVector<Fortune*>, pvfortune, UVector<Fortune*>);
+      U_NEW(Fortune, pfortune2add, Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
       }
 }
 
@@ -55,10 +55,18 @@ static void usp_end_fortune()
 #endif
 -->
 <!doctype html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr><!--#code
+Fortune* item;
+
+U_NEW(Fortune, item, Fortune(*pfortune2add));
+pvfortune->push_back(item);
+
 pstmt_fortune->execute();
 
-     pvfortune->push_back(U_NEW(Fortune(*pfortune2add)));
-do { pvfortune->push_back(U_NEW(Fortune(*pfortune))); } while (pstmt_fortune->nextRow());
+do {
+   U_NEW(Fortune, item, Fortune(*pfortune));
+   pvfortune->push_back(item);
+   }
+while (pstmt_fortune->nextRow());
 
 pvfortune->sort(Fortune::cmp_obj);
 

+ 2 - 2
frameworks/C++/ulib/src/json.usp

@@ -18,8 +18,8 @@ static void usp_init_json()
    U_TRACE(5, "::usp_init_json()")
 
 #ifndef AS_cpoll_cppsp_DO
-   pkey   = U_NEW(U_STRING_FROM_CONSTANT("message"));
-   pvalue = U_NEW(U_STRING_FROM_CONSTANT("Hello, World!"));
+   U_NEW(UString, pkey,   U_STRING_FROM_CONSTANT("message"));
+   U_NEW(UString, pvalue, U_STRING_FROM_CONSTANT("Hello, World!"));
 #endif
 }
 

+ 25 - 36
frameworks/C++/ulib/src/mdb.usp

@@ -5,58 +5,47 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "world.h"
 
-static World* pworld;
-static UString* jquery;
 static UMongoDBClient* mc;
 
 #ifndef AS_cpoll_cppsp_DO
-static UValue* pvalue;
+static UValue*	pvalue;
 #endif
 
 static void usp_fork_mdb()
 {
-   U_TRACE(5, "::usp_fork_mdb()")
+	U_TRACE(5, "::usp_fork_mdb()")
 
-   mc = U_NEW(UMongoDBClient);
+	U_NEW(UMongoDBClient, mc, UMongoDBClient);
 
-   if (mc->connect() == false)
-      {
-      U_WARNING("usp_fork_mdb(): connection failed");
+	if (mc->connect() == false)
+		{
+		U_WARNING("usp_fork_mdb(): connection failed");
 
-      return;
-      }
+		return;
+		}
 
-   if (mc->selectCollection("hello_world", "World") == false)
-      {
-      U_WARNING("usp_fork_mdb(): selectCollection() failed");
+	if (mc->selectCollection("hello_world", "World") == false)
+		{
+		U_WARNING("usp_fork_mdb(): selectCollection() failed");
 
-      return;
-      }
-
-   pworld = U_NEW(World);
-   jquery = U_NEW(U_STRING_FROM_CONSTANT("{'randomNumber'"));
+		return;
+		}
 
 #ifndef AS_cpoll_cppsp_DO
-   pvalue = U_NEW(UValue(OBJECT_VALUE));
+	U_NEW(UValue, pvalue, UValue(OBJECT_VALUE));
 #endif
 }
 
 #ifdef DEBUG
 static void usp_end_mdb()
 {
-   U_TRACE(5, "::usp_end_mdb()")
-
-   delete mc;
+	U_TRACE(5, "::usp_end_mdb()")
 
-   if (pworld)
-      {
-      delete pworld;
-      delete jquery;
+	delete mc;
 
-#  ifndef AS_cpoll_cppsp_DO
-      delete pvalue;
-#  endif
-      }
+#ifndef AS_cpoll_cppsp_DO
+	if (pvalue) delete pvalue;
+#endif
 }
 #endif
 -->
@@ -64,18 +53,18 @@ static void usp_end_mdb()
 Content-Type: application/json
 -->
 <!--#code
+uint32_t id;
 UString result;
 
-(void) mc->findOne(pworld->id = u_get_num_random(10000));
-
-(void) UValue::jread(mc->vitem[0], *jquery, result); // { "_id" : 8980.000000, "id" : 8980.000000, "randomNumber" : 2131.000000 }
+(void) mc->findOne(id = u_get_num_random(10000-1));
 
-pworld->randomNumber = u_strtoul(result.data(), result.end());
+(void) UValue::jfind(mc->vitem[0], U_CONSTANT_TO_PARAM("randomNumber"), result);
 
 #ifdef AS_cpoll_cppsp_DO
-USP_PRINTF_ADD("{\"id\":%u,\"randomNumber\":%v}", pworld->id, result.rep);
+USP_PRINTF_ADD("{\"id\":%u,\"randomNumber\":%v}", id, result.rep);
 #else
-USP_JSON_stringify(*pvalue, World, *pworld);
+World world(id, u_strtoul(result.data(), result.end()));
+USP_JSON_stringify(*pvalue, World, world);
 pvalue->clear();
 #endif
 -->

+ 48 - 44
frameworks/C++/ulib/src/mfortune.usp

@@ -5,7 +5,6 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "fortune.h"
 
-static UString* jquery;
 static UString* pencoded;
 static UMongoDBClient* mc;
 static Fortune* pfortune2add;
@@ -13,77 +12,82 @@ static UVector<Fortune*>* pvfortune;
 
 static void usp_fork_mfortune()
 {
-   U_TRACE(5, "::usp_fork_mfortune()")
+	U_TRACE(5, "::usp_fork_mfortune()")
 
-   mc = U_NEW(UMongoDBClient);
+	U_NEW(UMongoDBClient, mc, UMongoDBClient);
 
-   if (mc->connect() == false)
-      {
-      U_WARNING("usp_fork_mfortune(): connection failed");
+	if (mc->connect() == false)
+		{
+		U_WARNING("usp_fork_mfortune(): connection failed");
 
-      return;
-      }
+		return;
+		}
 
-   if (mc->selectCollection("hello_world", "Fortune") == false)
-      {
-      U_WARNING("usp_fork_mfortune(): selectCollection() failed");
+	if (mc->selectCollection("hello_world", "Fortune") == false)
+		{
+		U_WARNING("usp_fork_mfortune(): selectCollection() failed");
 
-      return;
-      }
+		return;
+		}
 
-   jquery       = U_NEW(U_STRING_FROM_CONSTANT("{'message'"));
-   pencoded     = U_NEW(UString(100U));
-   pvfortune    = U_NEW(UVector<Fortune*>);
-   pfortune2add = U_NEW(Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
+	U_NEW(UString, pencoded, UString(100U));
+	U_NEW(UVector<Fortune*>, pvfortune, UVector<Fortune*>);
+	U_NEW(Fortune, pfortune2add, Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
 }
 
 #ifdef DEBUG
 static void usp_end_mfortune()
 {
-   U_TRACE(5, "::usp_end_mfortune()")
+	U_TRACE(5, "::usp_end_mfortune()")
 
-   delete mc;
+	delete mc;
 
-   if (jquery)
-      {
-      delete jquery;
-      delete pencoded;
-      delete pvfortune;
-      delete pfortune2add;
-      }
+	if (pencoded)
+		{
+		delete pencoded;
+		delete pvfortune;
+		delete pfortune2add;
+		}
 }
 #endif
 -->
 <!doctype html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr><!--#code
+Fortune* item;
 uint32_t i, n;
 UString result;
 
-(void) mc->findAll();
+U_NEW(Fortune, item, Fortune(*pfortune2add));
+
+pvfortune->push_back(item);
 
-pvfortune->push_back(U_NEW(Fortune(*pfortune2add)));
+(void) mc->findAll();
 
 for (i = 0, n = mc->vitem.size(); i < n; ++i)
-   {
-   (void) UValue::jread(mc->vitem[i], *jquery, result); // { "_id" : 5.000000, "id" : 5.000000, "message" : "A computer program does what you tell it to do, not what you want it to do." }
+	{
+	result.clear();
+
+	(void) UValue::jfind(mc->vitem[i], U_CONSTANT_TO_PARAM("message"), result);
+
+   U_NEW(Fortune, item, Fortune(i+1, result));
 
-   pvfortune->push_back(U_NEW(Fortune(i+1, result)));
-   }
+   pvfortune->push_back(item);
+	}
 
 pvfortune->sort(Fortune::cmp_obj);
 
 for (i = 0, ++n; i < n; ++i)
-   {
-   Fortune* elem = (*pvfortune)[i];
-
-   UXMLEscape::encode(elem->message, *pencoded);
-
-   USP_PRINTF_ADD(
-      "<tr>"
-      "<td>%u</td>"
-      "<td>%v</td>"
-      "</tr>",
-      elem->id, pencoded->rep);
-   }
+	{
+	Fortune* elem = (*pvfortune)[i];
+
+	UXMLEscape::encode(elem->message, *pencoded);
+
+	USP_PRINTF_ADD(
+		"<tr>"
+		"<td>%u</td>"
+		"<td>%v</td>"
+		"</tr>",
+		elem->id, pencoded->rep);
+	}
 
 pvfortune->clear();
 --></table></body></html>

+ 38 - 41
frameworks/C++/ulib/src/mquery.usp

@@ -5,61 +5,53 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "world.h"
 
-static UString* jquery;
 static UMongoDBClient* mc;
-static World* pworld_query;
 
 #ifndef AS_cpoll_cppsp_DO
-static UValue* pvalue;
+static UValue*	pvalue;
 static UVector<World*>* pvworld_query;
 #endif
 
 static void usp_fork_mquery()
 {
-   U_TRACE(5, "::usp_fork_mquery()")
+	U_TRACE(5, "::usp_fork_mquery()")
 
-   mc = U_NEW(UMongoDBClient);
+   U_NEW(UMongoDBClient, mc, UMongoDBClient);
 
-   if (mc->connect() == false)
-      {
-      U_WARNING("usp_fork_mquery(): connection disabled or failed");
+	if (mc->connect() == false)
+		{
+		U_WARNING("usp_fork_mquery(): connection disabled or failed");
 
-      return;
-      }
+		return;
+		}
 
-   if (mc->selectCollection("hello_world", "World") == false)
-      {
-      U_WARNING("usp_fork_mquery(): selectCollection() failed");
+	if (mc->selectCollection("hello_world", "World") == false)
+		{
+		U_WARNING("usp_fork_mquery(): selectCollection() failed");
 
-      return;
-      }
-
-   jquery       = U_NEW(U_STRING_FROM_CONSTANT("{'randomNumber'"));
-   pworld_query = U_NEW(World);
+		return;
+		}
 
 #ifndef AS_cpoll_cppsp_DO
-   pvalue        = U_NEW(UValue(ARRAY_VALUE));
-   pvworld_query = U_NEW(UVector<World*>(500));
+	U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+	U_NEW(UVector<World*>, pvworld_query, UVector<World*>(500));
 #endif
 }
 
 #ifdef DEBUG
 static void usp_end_mquery()
 {
-   U_TRACE(5, "::usp_end_mquery()")
-
-   delete mc;
+	U_TRACE(5, "::usp_end_mquery()")
 
-   if (jquery)
-      {
-      delete jquery;
-      delete pworld_query;
+	delete mc;
 
-#  ifndef AS_cpoll_cppsp_DO
-      delete pvalue;
-      delete pvworld_query;
-#  endif
-      }
+#ifndef AS_cpoll_cppsp_DO
+	if (pvalue)
+		{
+		delete pvalue;
+		delete pvworld_query;
+		}
+#endif
 }
 #endif
 -->
@@ -67,6 +59,7 @@ static void usp_end_mquery()
 Content-Type: application/json
 -->
 <!--#code
+uint32_t id;
 UString rnumber;
 int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
 
@@ -75,25 +68,29 @@ USP_PUTS_CHAR('[');
 #endif
 
 while (true)
-   {
-   (void) mc->findOne(pworld_query->id = u_get_num_random(10000));
+	{
+	(void) mc->findOne(id = u_get_num_random(10000-1));
+
+	rnumber.clear();
 
-   (void) UValue::jread(mc->vitem[0], *jquery, rnumber); // { "_id" : 8980.000000, "id" : 8980.000000, "randomNumber" : 2131.000000 }
+	(void) UValue::jfind(mc->vitem[0], U_CONSTANT_TO_PARAM("randomNumber"), rnumber);
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PRINTF("{\"id\":%u,\"randomNumber\":%v}", pworld_query->id, rnumber.rep);
+	USP_PRINTF("{\"id\":%u,\"randomNumber\":%v}", id, rnumber.rep);
 #else
-   pworld_query->randomNumber = u_strtoul(rnumber.data(), rnumber.end());
+	World* pworld;
+
+	U_NEW(World, pworld, World(id, u_strtoul(rnumber.data(), rnumber.end())));
 
-   pvworld_query->push_back(U_NEW(World(*pworld_query)));
+	pvworld_query->push_back(pworld);
 #endif
 
-   if (++i == num_queries) break;
+	if (++i == num_queries) break;
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PUTS_CHAR(',');
+	USP_PUTS_CHAR(',');
 #endif
-   }
+	}
 
 #ifdef AS_cpoll_cppsp_DO
 USP_PUTS_CHAR(']');

+ 17 - 16
frameworks/C++/ulib/src/mupdate.usp

@@ -6,7 +6,6 @@ TechEmpower Web Framework Benchmarks
 #include "world.h"
 
 static UMongoDBClient* mc;
-static World* pworld_update;
 
 #ifndef AS_cpoll_cppsp_DO
 static UValue* pvalue;
@@ -17,7 +16,7 @@ static void usp_fork_mupdate()
 {
    U_TRACE(5, "::usp_fork_mupdate()")
 
-   mc = U_NEW(UMongoDBClient);
+   U_NEW(UMongoDBClient, mc, UMongoDBClient);
 
    if (mc->connect() == false)
       {
@@ -33,11 +32,9 @@ static void usp_fork_mupdate()
       return;
       }
 
-   pworld_update = U_NEW(World);
-
 #ifndef AS_cpoll_cppsp_DO
-   pvalue         = U_NEW(UValue(ARRAY_VALUE));
-   pvworld_update = U_NEW(UVector<World*>(500));
+   U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+   U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
 #endif
 }
 
@@ -48,15 +45,13 @@ static void usp_end_mupdate()
 
    delete mc;
 
-   if (pworld_update)
+#ifndef AS_cpoll_cppsp_DO
+   if (pvalue)
       {
-      delete pworld_update;
-
-#  ifndef AS_cpoll_cppsp_DO
       delete pvalue;
       delete pvworld_update;
-#  endif
       }
+#endif
 }
 #endif
 -->
@@ -64,6 +59,8 @@ static void usp_end_mupdate()
 Content-Type: application/json
 -->
 <!--#code
+uint32_t id, rnum;
+mongoc_bulk_operation_t* bulk = mc->createBulk(false);
 int i = 0, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
 
 #ifdef AS_cpoll_cppsp_DO
@@ -72,14 +69,16 @@ USP_PUTS_CHAR('[');
 
 while (true)
    {
-   (void) mc->findOne(pworld_update->id = u_get_num_random(10000));
-
-   (void) mc->update(pworld_update->id, "randomNumber", pworld_update->randomNumber = u_get_num_random(10000));
+   mc->updateOneBulk(bulk, id = u_get_num_random(10000-1), "randomNumber", rnum = u_get_num_random(10000-1));
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld_update->id, pworld_update->randomNumber);
+   USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", id, rnum);
 #else
-   pvworld_update->push_back(U_NEW(World(*pworld_update)));
+   World* pworld;
+
+   U_NEW(World, pworld, World(id, rnum));
+
+   pvworld_update->push_back(pworld);
 #endif
 
    if (++i == num_queries) break;
@@ -89,6 +88,8 @@ while (true)
 #endif
    }
 
+(void) mc->executeBulk(bulk);
+
 #ifdef AS_cpoll_cppsp_DO
 USP_PUTS_CHAR(']');
 #else

+ 11 - 7
frameworks/C++/ulib/src/query.usp

@@ -18,24 +18,24 @@ static void usp_fork_query()
 {
    U_TRACE(5, "::usp_fork_query()")
 
-   psql_query = U_NEW(UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
+   U_NEW(UOrmSession, psql_query, UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
 
    if (psql_query->isReady())
       {
-      pstmt_query = U_NEW(UOrmStatement(*psql_query, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
+      U_NEW(UOrmStatement, pstmt_query, UOrmStatement(*psql_query, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
 
       if (pstmt_query == 0) U_WARNING("usp_fork_query(): we cound't connect to db");
 
       if (UOrmDriver::isPGSQL()) *psql_query << "BEGIN TRANSACTION";
 
-      pworld_query = U_NEW(World);
+      U_NEW(World, pworld_query, World);
 
       pstmt_query->use( pworld_query->id);
       pstmt_query->into(pworld_query->randomNumber);
 
 #  ifndef AS_cpoll_cppsp_DO
-      pvalue        = U_NEW(UValue(ARRAY_VALUE));
-      pvworld_query = U_NEW(UVector<World*>(500));
+      U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+      U_NEW(UVector<World*>, pvworld_query, UVector<World*>(500));
 #  endif
       }
 }
@@ -71,14 +71,18 @@ USP_PUTS_CHAR('[');
 
 while (true)
    {
-   pworld_query->id = u_get_num_random(10000);
+   pworld_query->id = u_get_num_random(10000-1);
 
    pstmt_query->execute();
 
 #ifdef AS_cpoll_cppsp_DO
    USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld_query->id, pworld_query->randomNumber);
 #else
-   pvworld_query->push_back(U_NEW(World(*pworld_query)));
+   World* pworld;
+
+   U_NEW(World, pworld, World(*pworld_query));
+
+   pvworld_query->push_back(pworld);
 #endif
 
    if (++i == num_queries) break;

+ 22 - 31
frameworks/C++/ulib/src/rdb.usp

@@ -5,50 +5,43 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "world.h"
 
-static World* pworld;
+static char buffer[128];
 static UREDISClient_Base* rc;
 
 #ifndef AS_cpoll_cppsp_DO
-static UValue* pvalue;
+static UValue*	pvalue;
 #endif
 
 static void usp_fork_rdb()
 {
-   U_TRACE(5, "::usp_fork_rdb()")
+	U_TRACE(5, "::usp_fork_rdb()")
 
-   rc = U_NEW(UREDISClient<UTCPSocket>);
+	U_NEW(UREDISClient<UTCPSocket>, rc, UREDISClient<UTCPSocket>);
 
-   if (rc->connect() == false)
-      {
-      U_WARNING("usp_fork_rdb(): %V", rc->UClient_Base::getResponse().rep);
+	if (rc->connect() == false)
+		{
+		U_WARNING("usp_fork_rdb(): %V", rc->UClient_Base::getResponse().rep);
 
-      return;
-      }
+		return;
+		}
 
-   pworld = U_NEW(World);
+	u__memcpy(buffer, "world:", U_CONSTANT_SIZE("world:"), __PRETTY_FUNCTION__);
 
 #ifndef AS_cpoll_cppsp_DO
-   pvalue = U_NEW(UValue(OBJECT_VALUE));
+	U_NEW(UValue, pvalue, UValue(OBJECT_VALUE));
 #endif
-
-   u__memcpy(u_buffer, "world:", U_CONSTANT_SIZE("world:"), __PRETTY_FUNCTION__);
 }
 
 #ifdef DEBUG
 static void usp_end_rdb()
 {
-   U_TRACE(5, "::usp_end_rdb()")
-
-   delete rc;
+	U_TRACE(5, "::usp_end_rdb()")
 
-   if (pworld)
-      {
-      delete pworld;
+	delete rc;
 
-#  ifndef AS_cpoll_cppsp_DO
-      delete pvalue;
-#  endif
-      }
+#ifndef AS_cpoll_cppsp_DO
+	if (pvalue) delete pvalue;
+#endif
 }
 #endif
 -->
@@ -56,18 +49,16 @@ static void usp_end_rdb()
 Content-Type: application/json
 -->
 <!--#code
-UStringRep* rep;
-
-(void) rc->get(u_buffer, 6+u_num2str32(u_buffer+6, pworld->id = u_get_num_random(10000)));
-
-rep = rc->vitem[0].rep;
+uint32_t id;
 
-pworld->randomNumber = u_strtoul(rep->data(), rep->end());
+(void) rc->get(buffer, 6+u_num2str32(buffer+6, id = u_get_num_random(10000-1)));
 
 #ifdef AS_cpoll_cppsp_DO
-USP_PRINTF_ADD("{\"id\":%u,\"randomNumber\":%v}", pworld->id, rep);
+USP_PRINTF_ADD("{\"id\":%u,\"randomNumber\":%v}", id, rc->vitem[0].rep);
 #else
-USP_JSON_stringify(*pvalue, World, *pworld);
+UStringRep* rep = rc->vitem[0].rep;
+World world(id, u_strtoul(rep->data(), rep->end()));
+USP_JSON_stringify(*pvalue, World, world);
 pvalue->clear();
 #endif
 -->

+ 14 - 6
frameworks/C++/ulib/src/rfortune.usp

@@ -14,7 +14,7 @@ static void usp_fork_rfortune()
 {
    U_TRACE(5, "::usp_fork_rfortune()")
 
-   rc = U_NEW(UREDISClient<UTCPSocket>);
+   U_NEW(UREDISClient<UTCPSocket>, rc, UREDISClient<UTCPSocket>);
 
    if (rc->connect() == false)
       {
@@ -23,9 +23,9 @@ static void usp_fork_rfortune()
       return;
       }
 
-   pencoded     = U_NEW(UString(100U));
-   pvfortune    = U_NEW(UVector<Fortune*>);
-   pfortune2add = U_NEW(Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
+   U_NEW(UString, pencoded, UString(100U));
+   U_NEW(UVector<Fortune*>, pvfortune, UVector<Fortune*>);
+   U_NEW(Fortune, pfortune2add, Fortune(0, U_STRING_FROM_CONSTANT("Additional fortune added at request time.")));
 }
 
 #ifdef DEBUG
@@ -45,13 +45,21 @@ static void usp_end_rfortune()
 #endif
 -->
 <!doctype html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr><!--#code
+Fortune* item;
 uint32_t i, n;
 
+U_NEW(Fortune, item, Fortune(*pfortune2add));
+
+pvfortune->push_back(item);
+
 (void) rc->lrange(U_CONSTANT_TO_PARAM("fortunes 0 -1"));
 
-pvfortune->push_back(U_NEW(Fortune(*pfortune2add)));
+for (i = 0, n = rc->vitem.size(); i < n; ++i)
+   {
+   U_NEW(Fortune, item, Fortune(i+1, rc->vitem[i]));
 
-for (i = 0, n = rc->vitem.size(); i < n; ++i) pvfortune->push_back(U_NEW(Fortune(i+1, rc->vitem[i])));
+   pvfortune->push_back(item);
+   }
 
 pvfortune->sort(Fortune::cmp_obj);
 

+ 36 - 33
frameworks/C++/ulib/src/rquery.usp

@@ -5,48 +5,49 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "world.h"
 
+static char buffer[128];
 static UREDISClient_Base* rc;
-static UVector<World*>* pvworld_query;
+static UVector<World*>*	pvworld_query;
 
 #ifndef AS_cpoll_cppsp_DO
-static UValue* pvalue;
+static UValue*	pvalue;
 #endif
 
 static void usp_fork_rquery()
 {
-   U_TRACE(5, "::usp_fork_rquery()")
+	U_TRACE(5, "::usp_fork_rquery()")
 
-   rc = U_NEW(UREDISClient<UTCPSocket>);
+	U_NEW(UREDISClient<UTCPSocket>, rc, UREDISClient<UTCPSocket>);
 
-   if (rc->connect() == false)
-      {
-      U_WARNING("usp_fork_rquery(): %V", rc->UClient_Base::getResponse().rep);
+	if (rc->connect() == false)
+		{
+		U_WARNING("usp_fork_rquery(): %V", rc->UClient_Base::getResponse().rep);
 
-      return;
-      }
+		return;
+		}
 
-   pvworld_query = U_NEW(UVector<World*>(500));
+	U_NEW(UVector<World*>, pvworld_query, UVector<World*>(500));
 
 #ifndef AS_cpoll_cppsp_DO
-   pvalue = U_NEW(UValue(ARRAY_VALUE));
+	U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
 #endif
 }
 
 #ifdef DEBUG
 static void usp_end_rquery()
 {
-   U_TRACE(5, "::usp_end_rquery()")
+	U_TRACE(5, "::usp_end_rquery()")
 
-   delete rc;
+	delete rc;
 
-   if (pvworld_query)
-      {
-      delete pvworld_query;
+	if (pvworld_query)
+		{
+		delete pvworld_query;
 
-#  ifndef AS_cpoll_cppsp_DO
-      delete pvalue;
-#  endif
-      }
+#	ifndef AS_cpoll_cppsp_DO
+		delete pvalue;
+#	endif
+		}
 }
 #endif
 -->
@@ -56,7 +57,7 @@ Content-Type: application/json
 <!--#code
 World* pworld;
 UStringRep* rep;
-char* pbuffer = u_buffer;
+char* pbuffer = buffer;
 int i, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
 
 #ifdef AS_cpoll_cppsp_DO
@@ -64,36 +65,38 @@ USP_PUTS_CHAR('[');
 #endif
 
 for (i = 0; i < num_queries; ++i)
-   {
-   pvworld_query->push_back(pworld = U_NEW(World));
+	{
+	U_NEW(World, pworld, World);
+
+	pvworld_query->push_back(pworld);
 
-   u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
+	u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
 
-   pbuffer += 7+u_num2str32(pbuffer+7, pworld->id = u_get_num_random(10000));
-   }
+	pbuffer += 7+u_num2str32(pbuffer+7, pworld->id = u_get_num_random(10000-1));
+	}
 
-(void) rc->mget(u_buffer, pbuffer-u_buffer);
+(void) rc->mget(buffer, pbuffer-buffer);
 
 i = 0;
 
 while (true)
    {
-   pworld = pvworld_query->at(i);
+	pworld = pvworld_query->at(i);
 
-   rep = rc->vitem[i].rep;
+	rep = rc->vitem[i].rep;
 
-   pworld->randomNumber = u_strtoul(rep->data(), rep->end());
+	pworld->randomNumber = u_strtoul(rep->data(), rep->end());
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PRINTF("{\"id\":%u,\"randomNumber\":%v}", pworld->id, rep);
+	USP_PRINTF("{\"id\":%u,\"randomNumber\":%v}", pworld->id, rep);
 #endif
 
    if (++i == num_queries) break;
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PUTS_CHAR(',');
+	USP_PUTS_CHAR(',');
 #endif
-   }
+	}
 
 #ifdef AS_cpoll_cppsp_DO
 USP_PUTS_CHAR(']');

+ 38 - 35
frameworks/C++/ulib/src/rupdate.usp

@@ -5,48 +5,49 @@ TechEmpower Web Framework Benchmarks
 <!--#declaration
 #include "world.h"
 
+static char buffer[128];
 static UREDISClient_Base* rc;
 static UVector<World*>* pvworld;
 
 #ifndef AS_cpoll_cppsp_DO
-static UValue* pvalue;
+static UValue*	pvalue;
 #endif
 
 static void usp_fork_rupdate()
 {
-   U_TRACE(5, "::usp_fork_rupdate()")
+	U_TRACE(5, "::usp_fork_rupdate()")
 
-   rc = U_NEW(UREDISClient<UTCPSocket>);
+	U_NEW(UREDISClient<UTCPSocket>, rc, UREDISClient<UTCPSocket>);
 
-   if (rc->connect() == false)
-      {
-      U_WARNING("usp_fork_rupdate(): %V", rc->UClient_Base::getResponse().rep);
+	if (rc->connect() == false)
+		{
+		U_WARNING("usp_fork_rupdate(): %V", rc->UClient_Base::getResponse().rep);
 
-      return;
-      }
+		return;
+		}
 
-   pvworld = U_NEW(UVector<World*>(500));
+	U_NEW(UVector<World*>, pvworld, UVector<World*>(500));
 
 #ifndef AS_cpoll_cppsp_DO
-   pvalue = U_NEW(UValue(ARRAY_VALUE));
+	U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
 #endif
 }
 
 #ifdef DEBUG
 static void usp_end_rupdate()
 {
-   U_TRACE(5, "::usp_end_rupdate()")
+	U_TRACE(5, "::usp_end_rupdate()")
 
-   delete rc;
+	delete rc;
 
-   if (pvworld)
-      {
-      delete pvworld;
+	if (pvworld)
+		{
+		delete pvworld;
 
-#  ifndef AS_cpoll_cppsp_DO
-      delete pvalue;
-#  endif
-      }
+#	ifndef AS_cpoll_cppsp_DO
+		delete pvalue;
+#	endif
+		}
 }
 #endif
 -->
@@ -55,7 +56,7 @@ Content-Type: application/json
 -->
 <!--#code
 World* pworld;
-char* pbuffer = u_buffer;
+char* pbuffer = buffer;
 int i, num_queries = UHTTP::getFormFirstNumericValue(1, 500);
 
 #ifdef AS_cpoll_cppsp_DO
@@ -63,41 +64,43 @@ USP_PUTS_CHAR('[');
 #endif
 
 for (i = 0; i < num_queries; ++i)
-   {
-   pvworld->push_back(pworld = U_NEW(World));
+	{
+	U_NEW(World, pworld, World);
+
+	pvworld->push_back(pworld);
 
-   u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
+	u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
 
-   pbuffer += 7+u_num2str32(pbuffer+7, pworld->id = u_get_num_random(10000));
-   }
+	pbuffer += 7+u_num2str32(pbuffer+7, pworld->id = u_get_num_random(10000-1));
+	}
 
-(void) rc->mget(u_buffer, pbuffer-u_buffer);
+(void) rc->mget(buffer, pbuffer-buffer);
 
 i = 0;
-pbuffer = u_buffer;
+pbuffer = buffer;
 
 while (true)
    {
-   pworld = pvworld->at(i);
+	pworld = pvworld->at(i);
 
-   u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
+	u_put_unalignedp64(pbuffer, U_MULTICHAR_CONSTANT64(' ','w','o','r','l','d',':','\0'));
 
-   pbuffer += 7+u_num2str32(pbuffer+7, pworld->id);
+	pbuffer += 7+u_num2str32(pbuffer+7, pworld->id);
   *pbuffer  = ' ';
-   pbuffer += 1+u_num2str32(pbuffer+1, pworld->randomNumber = u_get_num_random(10000));
+	pbuffer += 1+u_num2str32(pbuffer+1, pworld->randomNumber = u_get_num_random(10000-1));
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld->id, pworld->randomNumber);
+	USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld->id, pworld->randomNumber);
 #endif
 
    if (++i == num_queries) break;
 
 #ifdef AS_cpoll_cppsp_DO
-   USP_PUTS_CHAR(',');
+	USP_PUTS_CHAR(',');
 #endif
-   }
+	}
 
-(void) rc->mset(u_buffer, pbuffer-u_buffer);
+(void) rc->mset(buffer, pbuffer-buffer);
 
 #ifdef AS_cpoll_cppsp_DO
 USP_PUTS_CHAR(']');

+ 13 - 11
frameworks/C++/ulib/src/update.usp

@@ -19,12 +19,12 @@ static void usp_fork_update()
 {
    U_TRACE(5, "::usp_fork_update()")
 
-   psql_update = U_NEW(UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
+   U_NEW(UOrmSession, psql_update, UOrmSession(U_CONSTANT_TO_PARAM("hello_world")));
 
    if (psql_update->isReady())
       {
-      pstmt1 = U_NEW(UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
-      pstmt2 = U_NEW(UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = ? WHERE id = ?")));
+      U_NEW(UOrmStatement, pstmt1, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("SELECT randomNumber FROM World WHERE id = ?")));
+      U_NEW(UOrmStatement, pstmt2, UOrmStatement(*psql_update, U_CONSTANT_TO_PARAM("UPDATE World SET randomNumber = ? WHERE id = ?")));
 
       if (pstmt1 == 0 ||
           pstmt2 == 0)
@@ -32,17 +32,15 @@ static void usp_fork_update()
          U_WARNING("usp_fork_update(): we cound't connect to db");
          }
 
-		if (UOrmDriver::isPGSQL()) *psql_update << "SET synchronous_commit TO OFF";
-
-      pworld_update = U_NEW(World);
+      U_NEW(World, pworld_update, World);
 
       pstmt1->use( pworld_update->id);
       pstmt1->into(pworld_update->randomNumber);
       pstmt2->use( pworld_update->randomNumber, pworld_update->id);
 
 #  ifndef AS_cpoll_cppsp_DO
-      pvalue         = U_NEW(UValue(ARRAY_VALUE));
-      pvworld_update = U_NEW(UVector<World*>(500));
+      U_NEW(UValue, pvalue, UValue(ARRAY_VALUE));
+      U_NEW(UVector<World*>, pvworld_update, UVector<World*>(500));
 #  endif
       }
 }
@@ -80,18 +78,22 @@ USP_PUTS_CHAR('[');
 
 while (true)
    {
-   pworld_update->id = u_get_num_random(10000);
+   pworld_update->id = u_get_num_random(10000-1);
 
    pstmt1->execute();
 
-   pworld_update->randomNumber = u_get_num_random(10000);
+   pworld_update->randomNumber = u_get_num_random(10000-1);
 
    pstmt2->execute();
 
 #ifdef AS_cpoll_cppsp_DO
    USP_PRINTF("{\"id\":%u,\"randomNumber\":%u}", pworld_update->id, pworld_update->randomNumber);
 #else
-   pvworld_update->push_back(U_NEW(World(*pworld_update)));
+   World* pworld;
+
+   U_NEW(World, pworld, World(*pworld_update));
+
+   pvworld_update->push_back(pworld);
 #endif
 
    if (++i == num_queries) break;

+ 2 - 4
frameworks/C++/ulib/src/world.h

@@ -27,11 +27,9 @@ public:
 #  endif
       }
 
-   World(const World& w) : id(w.id), randomNumber(w.randomNumber)
+   World(uint32_t _id, uint32_t _randomNumber) : id(_id), randomNumber(_randomNumber)
       {
-      U_TRACE_REGISTER_OBJECT(5, World, "%p", &w)
-
-      U_MEMORY_TEST_COPY(w)
+      U_TRACE_REGISTER_OBJECT(5, World, "%u,%u", _id, _randomNumber)
       }
 
    ~World()

+ 1 - 1
toolset/setup/linux/frameworks/ulib.sh

@@ -68,7 +68,7 @@ CXX=g++ # C++ compiler command
 gcc_version=`g++ -dumpversion`
 
 case "$gcc_version" in
-  3*|4.0*|4.1*|4.2*|4.3*|4.4*|4.5*|4.6*|4.7*)
+  3*|4.0*|4.1*|4.2*|4.3*|4.4*|4.5*|4.6*|4.7*|4.8*)
 	  CC='gcc-4.9'
 	 CXX='g++-4.9'
   ;;