Browse Source

Upgrade to v5.0 (#5964)

Add postgres-raw support
Add mongo-raw support
Sumeet Chhetri 5 years ago
parent
commit
79d5d5d6f3
57 changed files with 1589 additions and 169 deletions
  1. 50 1
      frameworks/C++/ffead-cpp/benchmark_config.json
  2. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-apache.dockerfile
  3. 4 2
      frameworks/C++/ffead-cpp/ffead-cpp-base.dockerfile
  4. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-cinatra.dockerfile
  5. 7 7
      frameworks/C++/ffead-cpp/ffead-cpp-crystal-h2o.dockerfile
  6. 7 7
      frameworks/C++/ffead-cpp/ffead-cpp-crystal-http.dockerfile
  7. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-drogon.dockerfile
  8. 7 7
      frameworks/C++/ffead-cpp/ffead-cpp-go-fasthttp.dockerfile
  9. 7 7
      frameworks/C++/ffead-cpp/ffead-cpp-go-gnet.dockerfile
  10. 11 11
      frameworks/C++/ffead-cpp/ffead-cpp-java-base.dockerfile
  11. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-java-firenio.dockerfile
  12. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-java-rapidoid.dockerfile
  13. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-java-wizzardo-http.dockerfile
  14. 7 7
      frameworks/C++/ffead-cpp/ffead-cpp-libreactor.dockerfile
  15. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-lithium.dockerfile
  16. 7 0
      frameworks/C++/ffead-cpp/ffead-cpp-mongo-raw.dockerfile
  17. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-mysql.dockerfile
  18. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-nginx.dockerfile
  19. 7 0
      frameworks/C++/ffead-cpp/ffead-cpp-postgresql-raw.dockerfile
  20. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-postgresql.dockerfile
  21. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-rust-actix.dockerfile
  22. 11 11
      frameworks/C++/ffead-cpp/ffead-cpp-rust-base.dockerfile
  23. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-rust-hyper.dockerfile
  24. 13 11
      frameworks/C++/ffead-cpp/ffead-cpp-rust-rocket-base.dockerfile
  25. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-rust-rocket.dockerfile
  26. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-rust-thruster.dockerfile
  27. 13 11
      frameworks/C++/ffead-cpp/ffead-cpp-v-base.dockerfile
  28. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-v-picov.dockerfile
  29. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp-v-vweb.dockerfile
  30. 2 2
      frameworks/C++/ffead-cpp/ffead-cpp.dockerfile
  31. 2 2
      frameworks/C++/ffead-cpp/install-mimalloc-snmalloc.sh
  32. 1 1
      frameworks/C++/ffead-cpp/install_ffead-cpp-backends.sh
  33. 4 4
      frameworks/C++/ffead-cpp/install_ffead-cpp-dependencies.sh
  34. 28 20
      frameworks/C++/ffead-cpp/install_ffead-cpp-framework.sh
  35. 9 9
      frameworks/C++/ffead-cpp/install_ffead-cpp-httpd.sh
  36. 2 2
      frameworks/C++/ffead-cpp/install_ffead-cpp-nginx.sh
  37. 33 15
      frameworks/C++/ffead-cpp/run_ffead.sh
  38. 10 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/CMakeLists.txt
  39. 24 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/application.xml
  40. 13 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cache.xml
  41. 15 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cachememcached.xml
  42. 15 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cacheredis.xml
  43. 17 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/sdorm.xml
  44. 109 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/include/TeBkUmMgr.h
  45. 450 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/src/TeBkUmMgr.cpp
  46. 17 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/src/autotools/Makefile.am
  47. 13 0
      frameworks/C++/ffead-cpp/te-benchmark-um-mgr/tpe/fortunes.tpe
  48. 10 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/CMakeLists.txt
  49. 24 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/application.xml
  50. 13 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cache.xml
  51. 15 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cachememcached.xml
  52. 15 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cacheredis.xml
  53. 14 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/sdorm.xml
  54. 106 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/include/TeBkUmLpq.h
  55. 415 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/src/TeBkUmLpq.cpp
  56. 17 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/src/autotools/Makefile.am
  57. 13 0
      frameworks/C++/ffead-cpp/te-benchmark-um-pq/tpe/fortunes.tpe

+ 50 - 1
frameworks/C++/ffead-cpp/benchmark_config.json

@@ -20,11 +20,35 @@
 			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-mongo-redis",
+			"display_name": "ffead-cpp-mongo",
 			"notes": "mongodb redis",
 			"versus": "",
 			"tags": []
 		},
+		"mongo-raw": {
+			"json_url": "/te-benchmark-um-mgr/json",
+			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-mgr/db",
+			"query_url": "/te-benchmark-um-mgr/queries?queries=",
+			"fortune_url": "/te-benchmark-um-mgr/fortunes",
+			"update_url": "/te-benchmark-um-mgr/updates?queries=",
+			"cached_query_url": "/te-benchmark-um-mgr/cached-worlds?count=",
+			"port": 8080,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "mongodb",
+			"framework": "ffead-cpp",
+			"language": "C++",
+			"orm": "Raw",
+			"platform": "None",
+			"webserver": "ffead-cpp",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "ffead-cpp-mongo-raw",
+			"notes": "mongodb raw redis",
+			"versus": "",
+			"tags": []
+		},
 		"lithium": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
@@ -378,6 +402,7 @@
 			"query_url": "/te-benchmark-um/queries?queries=",
 			"fortune_url": "/te-benchmark-um/fortunes",
 			"update_url": "/te-benchmark-um/updates?queries=",
+			"cached_query_url": "/te-benchmark-um/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
@@ -394,6 +419,30 @@
 			"versus": "",
 			"tags": []
 		},
+		"postgresql-raw": {
+			"json_url": "/te-benchmark-um-pq/json",
+			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-pq/db",
+			"query_url": "/te-benchmark-um-pq/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq/fortunes",
+			"update_url": "/te-benchmark-um-pq/updates?queries=",
+			"cached_query_url": "/te-benchmark-um-pq/cached-worlds?count=",
+			"port": 8080,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "postgres",
+			"framework": "ffead-cpp",
+			"language": "C++",
+			"orm": "Raw",
+			"platform": "None",
+			"webserver": "ffead-cpp",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "ffead-cpp-postgresql-raw",
+			"notes": "",
+			"versus": "",
+			"tags": []
+		},
 		"nginx": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-apache.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 apache mongo
+CMD ./run_ffead.sh ffead-cpp-5.0 apache mongo

+ 4 - 2
frameworks/C++/ffead-cpp/ffead-cpp-base.dockerfile

@@ -1,12 +1,14 @@
 FROM buildpack-deps:bionic
 LABEL maintainer="Sumeet Chhetri"
-LABEL version="1.0"
-LABEL description="Base ffead-cpp docker image with commit id - 83dd80bcf3c12403e4ba9819496ffcf85acfc43b"
+LABEL version="latest"
+LABEL description="Base ffead-cpp docker image with commit id - 5f62633149d832c5608c64fd4a1097fb6ebf6f5c"
 
 ENV IROOT=/installs
 
 RUN mkdir /installs
 COPY te-benchmark-um/ /installs/te-benchmark-um/
+COPY te-benchmark-um-pq/ /installs/te-benchmark-um-pq/
+COPY te-benchmark-um-mgr/ /installs/te-benchmark-um-mgr/
 
 WORKDIR ${IROOT}
 

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-cinatra.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 cinatra
+CMD ./run_ffead.sh ffead-cpp-5.0 cinatra

+ 7 - 7
frameworks/C++/ffead-cpp/ffead-cpp-crystal-h2o.dockerfile

@@ -1,13 +1,13 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN apt-get update -y && apt-get install -yqq libh2o-evloop-dev libwslay-dev libyaml-0-2 libevent-dev libpcre3-dev \
@@ -21,4 +21,4 @@ RUN shards install && gcc -shared -O3 lib/h2o/src/ext/h2o.c -I/usr/include -fPIC
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 crystal-h2o
+CMD ./run_ffead.sh ffead-cpp-5.0 crystal-h2o

+ 7 - 7
frameworks/C++/ffead-cpp/ffead-cpp-crystal-http.dockerfile

@@ -1,13 +1,13 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN curl -sL "https://keybase.io/crystal/pgp_keys.asc" | apt-key add - \
@@ -18,4 +18,4 @@ RUN crystal build --release --no-debug crystal-ffead-cpp.cr -o crystal-ffead-cpp
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 crystal-http
+CMD ./run_ffead.sh ffead-cpp-5.0 crystal-http

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-drogon.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 drogon
+CMD ./run_ffead.sh ffead-cpp-5.0 drogon

+ 7 - 7
frameworks/C++/ffead-cpp/ffead-cpp-go-fasthttp.dockerfile

@@ -1,13 +1,13 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN wget -q https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz
@@ -17,4 +17,4 @@ RUN make && cp fasthttp-ffead-cpp $IROOT/ && rm -rf ${IROOT}/lang-server-backend
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 go-fasthttp
+CMD ./run_ffead.sh ffead-cpp-5.0 go-fasthttp

+ 7 - 7
frameworks/C++/ffead-cpp/ffead-cpp-go-gnet.dockerfile

@@ -1,13 +1,13 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN wget -q https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz && tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz
@@ -17,4 +17,4 @@ RUN make && cp gnet-ffead-cpp $IROOT/ && rm -rf ${IROOT}/lang-server-backends
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 go-gnet
+CMD ./run_ffead.sh ffead-cpp-5.0 go-gnet

+ 11 - 11
frameworks/C++/ffead-cpp/ffead-cpp-java-base.dockerfile

@@ -1,16 +1,16 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 LABEL maintainer="Sumeet Chhetri"
-LABEL version="1.0"
-LABEL description="Base java docker image with master code found on 3rd July 2020 4:18PM IST"
+LABEL version="latest"
+LABEL description="Base java docker image with commit id - 5f62633149d832c5608c64fd4a1097fb6ebf6f5c"
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 	
 RUN apt update -yqq && apt install -y --no-install-recommends default-jre maven gradle && rm -rf /var/lib/apt/lists/*
@@ -21,9 +21,9 @@ RUN rm -rf ${IROOT}/lang-server-backends
 
 FROM buildpack-deps:bionic
 RUN apt update -yqq && apt install --no-install-recommends -yqq uuid-dev odbc-postgresql unixodbc unixodbc-dev memcached \
-	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server default-jre && rm -rf /var/lib/apt/lists/*
-COPY --from=0 /installs/ffead-cpp-4.0 /installs/ffead-cpp-4.0
-COPY --from=0 /installs/ffead-cpp-4.0-sql /installs/ffead-cpp-4.0-sql
+	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server default-jre libpq-dev && rm -rf /var/lib/apt/lists/*
+COPY --from=0 /installs/ffead-cpp-5.0 /installs/ffead-cpp-5.0
+COPY --from=0 /installs/ffead-cpp-5.0-sql /installs/ffead-cpp-5.0-sql
 COPY --from=0 /installs/firenio-ffead-cpp-0.1-jar-with-dependencies.jar /installs/
 COPY --from=0 /installs/rapidoid-ffead-cpp-1.0-jar-with-dependencies.jar /installs/
 COPY --from=0 /installs/wizzardo-ffead-cpp-all-1.0.jar /installs/

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-java-firenio.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-java-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-java-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 java-firenio
+CMD ./run_ffead.sh ffead-cpp-5.0 java-firenio

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-java-rapidoid.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-java-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-java-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 java-rapidoid
+CMD ./run_ffead.sh ffead-cpp-5.0 java-rapidoid

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-java-wizzardo-http.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-java-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-java-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 java-wizzardo-http
+CMD ./run_ffead.sh ffead-cpp-5.0 java-wizzardo-http

+ 7 - 7
frameworks/C++/ffead-cpp/ffead-cpp-libreactor.dockerfile

@@ -1,13 +1,13 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 WORKDIR ${IROOT}
@@ -24,4 +24,4 @@ RUN make && cp libreactor-ffead-cpp $IROOT/ && rm -rf ${IROOT}/lang-server-backe
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 libreactor
+CMD ./run_ffead.sh ffead-cpp-5.0 libreactor

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-lithium.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 lithium
+CMD ./run_ffead.sh ffead-cpp-5.0 lithium

+ 7 - 0
frameworks/C++/ffead-cpp/ffead-cpp-mongo-raw.dockerfile

@@ -0,0 +1,7 @@
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
+
+ENV IROOT=/installs
+
+WORKDIR /
+
+CMD ./run_ffead.sh ffead-cpp-5.0 emb mongo-raw redis

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-mysql.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0-sql emb mysql
+CMD ./run_ffead.sh ffead-cpp-5.0-sql emb mysql

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-nginx.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 nginx mongo
+CMD ./run_ffead.sh ffead-cpp-5.0 nginx mongo

+ 7 - 0
frameworks/C++/ffead-cpp/ffead-cpp-postgresql-raw.dockerfile

@@ -0,0 +1,7 @@
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
+
+ENV IROOT=/installs
+
+WORKDIR /
+
+CMD ./run_ffead.sh ffead-cpp-5.0-sql emb postgresql-raw redis

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-postgresql.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0-sql emb postgresql
+CMD ./run_ffead.sh ffead-cpp-5.0-sql emb postgresql redis

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-rust-actix.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-rust-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-rust-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 rust-actix
+CMD ./run_ffead.sh ffead-cpp-5.0 rust-actix

+ 11 - 11
frameworks/C++/ffead-cpp/ffead-cpp-rust-base.dockerfile

@@ -1,16 +1,16 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 LABEL maintainer="Sumeet Chhetri"
-LABEL version="1.0"
-LABEL description="Base rust docker image with ffead-cpp v4.0 - commit id - 83dd80bcf3c12403e4ba9819496ffcf85acfc43b"
+LABEL version="latest"
+LABEL description="Base rust docker image with commit id - 5f62633149d832c5608c64fd4a1097fb6ebf6f5c"
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
@@ -23,9 +23,9 @@ RUN cd ${IROOT}/lang-server-backends/rust/actix-ffead-cpp && RUSTFLAGS="-C targe
 
 FROM buildpack-deps:bionic
 RUN apt update -yqq && apt install --no-install-recommends -yqq uuid-dev odbc-postgresql unixodbc unixodbc-dev memcached \
-	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server && rm -rf /var/lib/apt/lists/*
-COPY --from=0 /installs/ffead-cpp-4.0 /installs/ffead-cpp-4.0
-COPY --from=0 /installs/ffead-cpp-4.0-sql /installs/ffead-cpp-4.0-sql
+	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server libpq-dev && rm -rf /var/lib/apt/lists/*
+COPY --from=0 /installs/ffead-cpp-5.0 /installs/ffead-cpp-5.0
+COPY --from=0 /installs/ffead-cpp-5.0-sql /installs/ffead-cpp-5.0-sql
 COPY --from=0 /installs/actix-ffead-cpp /installs/
 COPY --from=0 /installs/hyper-ffead-cpp /installs/
 COPY --from=0 /installs/thruster-ffead-cpp /installs/

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-rust-hyper.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-rust-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-rust-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 rust-hyper
+CMD ./run_ffead.sh ffead-cpp-5.0 rust-hyper

+ 13 - 11
frameworks/C++/ffead-cpp/ffead-cpp-rust-rocket-base.dockerfile

@@ -1,29 +1,31 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
+LABEL maintainer="Sumeet Chhetri"
+LABEL version="2.0"
+LABEL description="Base rust rocket docker image with commit id - 5f62633149d832c5608c64fd4a1097fb6ebf6f5c"
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 
 RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
 WORKDIR ${IROOT}/lang-server-backends/rust/rocket-ffead-cpp/
 ENV PATH="/root/.cargo/bin:${PATH}"
 RUN rustup default nightly && cargo update && cargo build --release && cp target/release/rocket-ffead-cpp $IROOT/ && rm -rf ${IROOT}/lang-server-backends
-RUN rm -rf /root/.rustup /root/.cargo
 
 FROM buildpack-deps:bionic
 RUN apt update -yqq && apt install --no-install-recommends -yqq uuid-dev odbc-postgresql unixodbc unixodbc-dev memcached \
-	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server && rm -rf /var/lib/apt/lists/*
-COPY --from=0 /installs/ffead-cpp-4.0 /installs/ffead-cpp-4.0
-COPY --from=0 /installs/ffead-cpp-4.0-sql /installs/ffead-cpp-4.0-sql
+	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server libpq-dev && rm -rf /var/lib/apt/lists/*
+COPY --from=0 /installs/ffead-cpp-5.0 /installs/ffead-cpp-5.0
+COPY --from=0 /installs/ffead-cpp-5.0-sql /installs/ffead-cpp-5.0-sql
 COPY --from=0 /installs/rocket-ffead-cpp /installs/
 RUN mkdir -p /installs/snmalloc-0.4.2/build
 COPY --from=0 /installs/snmalloc-0.4.2/build/libsnmallocshim-1mib.so /installs/snmalloc-0.4.2/build
 COPY --from=0 /usr/lib/x86_64-linux-gnu/odbc /usr/lib/x86_64-linux-gnu/odbc
 COPY --from=0 /usr/local/lib /usr/local/lib
-COPY --from=0 /run_ffead.sh /
+COPY --from=0 /run_ffead.sh /

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-rust-rocket.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-rust-rocket-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-rust-rocket-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 rust-rocket
+CMD ./run_ffead.sh ffead-cpp-5.0 rust-rocket

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-rust-thruster.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-rust-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-rust-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 rust-thruster
+CMD ./run_ffead.sh ffead-cpp-5.0 rust-thruster

+ 13 - 11
frameworks/C++/ffead-cpp/ffead-cpp-v-base.dockerfile

@@ -1,32 +1,34 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 LABEL maintainer="Sumeet Chhetri"
-LABEL version="1.0"
-LABEL description="Base v docker image with ffead-cpp v4.0 - commit id - 83dd80bcf3c12403e4ba9819496ffcf85acfc43b"
+LABEL version="latest"
+LABEL description="Base v docker image with commit id - 5f62633149d832c5608c64fd4a1097fb6ebf6f5c"
 
 ENV IROOT=/installs
 
 RUN rm -f /usr/local/lib/libffead-* /usr/local/lib/libte_benc* /usr/local/lib/libinter.so /usr/local/lib/libdinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libinter.so /usr/local/lib/libinter.so && \
-	ln -s ${IROOT}/ffead-cpp-4.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libte_benchmark_um.so /usr/local/lib/libte_benchmark_um.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-modules.so /usr/local/lib/libffead-modules.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libffead-framework.so /usr/local/lib/libffead-framework.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libinter.so /usr/local/lib/libinter.so && \
+	ln -s ${IROOT}/ffead-cpp-5.0/lib/libdinter.so /usr/local/lib/libdinter.so && \
 	ldconfig
 	
 RUN apt update -yqq && apt install -y git make && rm -rf /var/lib/apt/lists/*
 RUN git clone https://github.com/vlang/v && cd v && make && ./v symlink
 
 WORKDIR ${IROOT}/lang-server-backends/v/vweb
+#COPY vweb.v ${IROOT}/lang-server-backends/v/vweb/
 RUN chmod +x *.sh && ./build.sh && cp vweb $IROOT/
 
 WORKDIR ${IROOT}/lang-server-backends/v/pico.v
+#COPY main.v ${IROOT}/lang-server-backends/v/pico.v/
 RUN chmod +x *.sh && ./build.sh && cp main $IROOT/ && rm -rf ${IROOT}/lang-server-backends
 
 FROM buildpack-deps:bionic
 RUN apt update -yqq && apt install --no-install-recommends -yqq uuid-dev odbc-postgresql unixodbc unixodbc-dev memcached \
-	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server && rm -rf /var/lib/apt/lists/*
-COPY --from=0 /installs/ffead-cpp-4.0 /installs/ffead-cpp-4.0
-COPY --from=0 /installs/ffead-cpp-4.0-sql /installs/ffead-cpp-4.0-sql
+	libmemcached-dev libssl-dev libhiredis-dev zlib1g-dev libcurl4-openssl-dev redis-server libpq-dev && rm -rf /var/lib/apt/lists/*
+COPY --from=0 /installs/ffead-cpp-5.0 /installs/ffead-cpp-5.0
+COPY --from=0 /installs/ffead-cpp-5.0-sql /installs/ffead-cpp-5.0-sql
 COPY --from=0 /installs/main /installs/
 COPY --from=0 /installs/vweb /installs/
 RUN mkdir -p /installs/snmalloc-0.4.2/build

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-v-picov.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-v-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-v-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 v-picov
+CMD ./run_ffead.sh ffead-cpp-5.0 v-picov

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp-v-vweb.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-v-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-v-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 v-vweb
+CMD ./run_ffead.sh ffead-cpp-5.0 v-vweb

+ 2 - 2
frameworks/C++/ffead-cpp/ffead-cpp.dockerfile

@@ -1,7 +1,7 @@
-FROM sumeetchhetri/ffead-cpp-4.0-base:1.0
+FROM sumeetchhetri/ffead-cpp-5.0-base:latest
 
 ENV IROOT=/installs
 
 WORKDIR /
 
-CMD ./run_ffead.sh ffead-cpp-4.0 emb mongo redis
+CMD ./run_ffead.sh ffead-cpp-5.0 emb mongo redis

+ 2 - 2
frameworks/C++/ffead-cpp/install-mimalloc-snmalloc.sh

@@ -1,7 +1,7 @@
 apt install -y clang-format-9 ninja-build
 
 wget -q https://github.com/microsoft/mimalloc/archive/v1.6.3.tar.gz
-tar xvf mimalloc-1.6.3.tar.gz
+tar xf mimalloc-1.6.3.tar.gz
 cd mimalloc-1.6.3
 mkdir -p out/release
 cmake ../.. -DCMAKE_BUILD_TYPE=Release
@@ -10,7 +10,7 @@ cd $IROOT
 rm -rf mimalloc-1.6.3
 
 wget -q https://github.com/microsoft/snmalloc/archive/0.4.2.tar.gz
-tar xvf snmalloc-0.4.2.tar.gz
+tar xf snmalloc-0.4.2.tar.gz
 cd snmalloc-0.4.2
 mkdir build
 cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release

+ 1 - 1
frameworks/C++/ffead-cpp/install_ffead-cpp-backends.sh

@@ -4,7 +4,7 @@ cd $IROOT
 
 git clone https://github.com/sumeetchhetri/ffead-cpp
 cd ffead-cpp
-git checkout e243bc096cd570cfee1edfecbcd91f4c4056fa1a -b 4.0
+git checkout 5f62633149d832c5608c64fd4a1097fb6ebf6f5c -b 5.0
 rm -rf .git
 cd ..
 mv ffead-cpp ffead-cpp-src

+ 4 - 4
frameworks/C++/ffead-cpp/install_ffead-cpp-dependencies.sh

@@ -2,7 +2,7 @@
 
 apt update -yqq && apt install --no-install-recommends -yqq autoconf-archive unzip uuid-dev odbc-postgresql unixodbc unixodbc-dev \
 	apache2 apache2-dev libapr1-dev libaprutil1-dev memcached libmemcached-dev redis-server libssl-dev \
-	zlib1g-dev cmake make clang-format-9 ninja-build libhiredis-dev libcurl4-openssl-dev
+	zlib1g-dev cmake make clang-format-9 ninja-build libhiredis-dev libcurl4-openssl-dev libpq-dev
 
 #redis will not start correctly on bionic with this config
 sed -i "s/bind .*/bind 127.0.0.1/g" /etc/redis/redis.conf
@@ -45,7 +45,7 @@ cd $IROOT
 rm -rf mongo-c-driver-1.4.2 
 
 #wget -q https://github.com/redis/hiredis/archive/v0.13.3.tar.gz
-#tar xvf v0.13.3.tar.gz
+#tar xf v0.13.3.tar.gz
 #rm -f v0.13.3.tar.gz
 #cd hiredis-0.13.3/
 #make
@@ -55,7 +55,7 @@ rm -rf mongo-c-driver-1.4.2
 
 cd $IROOT
 wget -q https://github.com/microsoft/mimalloc/archive/v1.6.3.tar.gz
-tar xvf v1.6.3.tar.gz
+tar xf v1.6.3.tar.gz
 rm -f v1.6.3.tar.gz
 cd mimalloc-1.6.3
 mkdir -p out/release
@@ -66,7 +66,7 @@ cd $IROOT
 rm -rf mimalloc-1.6.3
 
 wget -q https://github.com/microsoft/snmalloc/archive/0.4.2.tar.gz
-tar xvf 0.4.2.tar.gz
+tar xf 0.4.2.tar.gz
 rm -f 0.4.2.tar.gz
 cd snmalloc-0.4.2
 mkdir build

+ 28 - 20
frameworks/C++/ffead-cpp/install_ffead-cpp-framework.sh

@@ -10,8 +10,12 @@ cd $IROOT/ffead-cpp-src/
 
 chmod 755 *.sh resources/*.sh rtdcf/autotools/*.sh
 rm -rf web/te-benchmark-um
+rm -rf web/te-benchmark-um-pq
+rm -rf web/te-benchmark-um-mgr
 mv ${IROOT}/server.sh script/
 mv ${IROOT}/te-benchmark-um web/
+mv ${IROOT}/te-benchmark-um-pq web/
+mv ${IROOT}/te-benchmark-um-mgr web/
 sed -i 's|THRD_PSIZ=6|THRD_PSIZ='${SERV_THREADS}'|g' resources/server.prop
 sed -i 's|W_THRD_PSIZ=2|W_THRD_PSIZ='${WRIT_THREADS}'|g' resources/server.prop
 sed -i 's|ENABLE_CRS=true|ENABLE_CRS=false|g' resources/server.prop
@@ -36,6 +40,8 @@ sed -i 's|localhost|tfb-database|g' web/te-benchmark-um/config/sdorm.xml
 sed -i 's|localhost|tfb-database|g' web/te-benchmark-um/config/sdormmongo.xml
 sed -i 's|localhost|tfb-database|g' web/te-benchmark-um/config/sdormmysql.xml
 sed -i 's|localhost|tfb-database|g' web/te-benchmark-um/config/sdormpostgresql.xml
+sed -i 's|localhost|tfb-database|g' web/te-benchmark-um-pq/config/sdorm.xml
+sed -i 's|localhost|tfb-database|g' web/te-benchmark-um-mgr/config/sdorm.xml
 sed -i 's|127.0.0.1|tfb-database|g' resources/sample-odbcinst.ini
 sed -i 's|127.0.0.1|tfb-database|g' resources/sample-odbc.ini
 sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/default)||g' CMakeLists.txt
@@ -44,12 +50,12 @@ sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/oauthApp)||g' CMakeLists.tx
 sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/markers)||g' CMakeLists.txt
 sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark)||g' CMakeLists.txt
 sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/peer-server)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/default/libdefault${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/flexApp/libflexApp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/oauthApp/liboauthApp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/markers/libmarkers${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/te-benchmark/libte_benchmark${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
-sed -i 's|install(FILES ${PROJECT_SOURCE_DIR}/web/peer-server/libpeer_server${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/default/libdefault${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/flexApp/libflexApp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/oauthApp/liboauthApp${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/markers/libmarkers${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark/libte_benchmark${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/peer-server/libpeer_server${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
 sed -i 's|web/default/src/autotools/Makefile||g' configure.ac
 sed -i 's|web/flexApp/src/autotools/Makefile||g' configure.ac
 sed -i 's|web/oauthApp/src/autotools/Makefile||g' configure.ac
@@ -57,8 +63,6 @@ sed -i 's|web/markers/src/autotools/Makefile||g' configure.ac
 sed -i 's|web/te-benchmark/src/autotools/Makefile||g' configure.ac
 sed -i 's|web/peer-server/src/autotools/Makefile||g' configure.ac
 
-#./autogen.sh
-#./configure --enable-debug=no --enable-apachemod=yes --enable-nginxmod=yes --enable-mod_sdormmongo=yes --enable-mod_sdormsql=yes --enable-mod_rediscache=yes --enable-mod_memcached=yes CPPFLAGS="$CPPFLAGS -I${IROOT}/include/libmongoc-1.0 -I${IROOT}/include/libbson-1.0 -I${IROOT}/include/" LDFLAGS="$LDFLAGS -L${IROOT} -L${IROOT}/lib"
 cmake -DSRV_ALL=on -DCINATRA_INCLUDES=${IROOT}/cinatra/include -DMOD_APACHE=on -DMOD_NGINX=on -DMOD_MEMCACHED=on -DMOD_REDIS=on -DMOD_SDORM_MONGO=on .
 
 cp resources/sample-odbcinst.ini ${IROOT}/odbcinst.ini
@@ -75,7 +79,11 @@ rm -f /usr/local/lib/libte_benc*
 rm -f /usr/local/lib/libinter.so
 rm -f /usr/local/lib/libdinter.so
 
-cd ffead-cpp-4.0-bin
+cd ffead-cpp-5.0-bin
+#cache related dockerfiles will add the cache.xml accordingly whenever needed
+rm -f web/te-benchmark-um/config/cache.xml
+rm -f web/te-benchmark-um-pq/config/cache.xml
+rm -f web/te-benchmark-um-mgr/config/cache.xml
 chmod 755 *.sh resources/*.sh rtdcf/autotools/*.sh
 ./server.sh &
 while [ ! -f lib/libinter.so ]
@@ -89,18 +97,16 @@ done
 pkill ffead-cpp
 
 cd ${IROOT}/ffead-cpp-src/
-cp -rf ffead-cpp-4.0-bin ${IROOT}/ffead-cpp-4.0
-rm -rf ffead-cpp-4.0-bin
+cp -rf ffead-cpp-5.0-bin ${IROOT}/ffead-cpp-5.0
+rm -rf ffead-cpp-5.0-bin
 mv ${IROOT}/nginxfc ${IROOT}/nginx-ffead-mongo
 
-cd ${IROOT}/ffead-cpp-4.0
+cd ${IROOT}/ffead-cpp-5.0
 
 chmod 755 *.sh resources/*.sh rtdcf/autotools/*.sh
 chmod 755 *.sh
 rm -f *.cntrl
 rm -f tmp/*.sess
-#cache related dockerfiles will add the cache.xml accordingly whenever needed
-rm -f web/te-benchmark-um/config/cache.xml
 #Done building for mongodb
 
 
@@ -110,7 +116,11 @@ cp -f web/te-benchmark-um/sql-src/TeBkUmWorldsql.h web/te-benchmark-um/include/T
 cp -f web/te-benchmark-um/sql-src/TeBkUmWorldsql.cpp web/te-benchmark-um/src/TeBkUmWorld.cpp
 make install -j${MAX_THREADS}
 
-cd ffead-cpp-4.0-bin
+cd ffead-cpp-5.0-bin
+#cache related dockerfiles will add the cache.xml accordingly whenever needed
+rm -f web/te-benchmark-um/config/cache.xml
+rm -f web/te-benchmark-um-pq/config/cache.xml
+rm -f web/te-benchmark-um-mgr/config/cache.xml
 chmod 755 *.sh resources/*.sh rtdcf/autotools/*.sh
 ./server.sh &
 while [ ! -f lib/libinter.so ]
@@ -124,16 +134,14 @@ done
 pkill ffead-cpp
 
 cd ${IROOT}/ffead-cpp-src/
-cp -rf ffead-cpp-4.0-bin ${IROOT}/ffead-cpp-4.0-sql
-rm -rf ffead-cpp-4.0-bin
+cp -rf ffead-cpp-5.0-bin ${IROOT}/ffead-cpp-5.0-sql
+rm -rf ffead-cpp-5.0-bin
 mv ${IROOT}/nginxfc ${IROOT}/nginx-ffead-sql
 
-cd ${IROOT}/ffead-cpp-4.0-sql
+cd ${IROOT}/ffead-cpp-5.0-sql
 
 chmod 755 *.sh resources/*.sh rtdcf/autotools/*.sh
 chmod 755 *.sh
 rm -f *.cntrl
 rm -f tmp/*.sess
-#cache related dockerfiles will add the cache.xml accordingly whenever needed
-rm -f web/te-benchmark-um/config/cache.xml
 #Done building for sql

+ 9 - 9
frameworks/C++/ffead-cpp/install_ffead-cpp-httpd.sh

@@ -2,7 +2,7 @@
 
 cd $IROOT
 
-#chown -R www-data:www-data ffead-cpp-4.0
+#chown -R www-data:www-data ffead-cpp-5.0
 
 #wget -q https://archive.apache.org/dist/httpd/httpd-2.4.25.tar.gz
 #wget -q https://archive.apache.org/dist/apr/apr-1.5.2.tar.gz
@@ -23,19 +23,19 @@ cd $IROOT
 #make install
 #cd ${IROOT}
 
-sed -i 's|#define PACKAGE_BUGREPORT "[email protected]"| |g' ${IROOT}/ffead-cpp-4.0/include/AppDefines.h
-sed -i 's|#define PACKAGE_NAME "ffead-cpp"| |g' ${IROOT}/ffead-cpp-4.0/include/AppDefines.h
-sed -i 's|#define PACKAGE_STRING "ffead-cpp 4.0"| |g' ${IROOT}/ffead-cpp-4.0/include/AppDefines.h
-sed -i 's|#define PACKAGE_TARNAME "ffead-cpp"| |g' ${IROOT}/ffead-cpp-4.0/include/AppDefines.h
-sed -i 's|#define PACKAGE_VERSION "4.0"| |g' ${IROOT}/ffead-cpp-4.0/include/AppDefines.h
+sed -i 's|#define PACKAGE_BUGREPORT "[email protected]"| |g' ${IROOT}/ffead-cpp-5.0/include/AppDefines.h
+sed -i 's|#define PACKAGE_NAME "ffead-cpp"| |g' ${IROOT}/ffead-cpp-5.0/include/AppDefines.h
+sed -i 's|#define PACKAGE_STRING "ffead-cpp 5.0"| |g' ${IROOT}/ffead-cpp-5.0/include/AppDefines.h
+sed -i 's|#define PACKAGE_TARNAME "ffead-cpp"| |g' ${IROOT}/ffead-cpp-5.0/include/AppDefines.h
+sed -i 's|#define PACKAGE_VERSION "5.0"| |g' ${IROOT}/ffead-cpp-5.0/include/AppDefines.h
 
 #cd ${IROOT}/ffead-cpp-src/modules/apache_mod_ffeadcpp/
-#g++ -fpic -DSHARED_MODULE -fpermissive -std=gnu++11 -I"/usr/include/apache2" -I"/usr/include/apr-1.0" -I"${IROOT}/ffead-cpp-4.0/include/" -I"${IROOT}/include" -I"${IROOT}/include/libbson-1.0/" -I"${IROOT}/include/libmongoc-1.0" mod_ffeadcpp.cpp -L"${IROOT}/ffead-cpp-4.0/lib" -L"${IROOT}" -L"${IROOT}/lib" -lffead_common -lffead_framework -ldl -lcrypto -lssl -lhiredis -lmemcachedutil -c mod_ffeadcpp.cpp
-#g++ -shared -o mod_ffeadcpplib.so mod_ffeadcpp.o -L"${IROOT}/ffead-cpp-4.0/lib" -L"${IROOT}" -L"${IROOT}/lib" -lffead_common -lffead_framework -ldl -lcrypto -lssl -lapr-1 -laprutil-1 -lstdc++ -lhiredis -lmemcachedutil
+#g++ -fpic -DSHARED_MODULE -fpermissive -std=gnu++11 -I"/usr/include/apache2" -I"/usr/include/apr-1.0" -I"${IROOT}/ffead-cpp-5.0/include/" -I"${IROOT}/include" -I"${IROOT}/include/libbson-1.0/" -I"${IROOT}/include/libmongoc-1.0" mod_ffeadcpp.cpp -L"${IROOT}/ffead-cpp-5.0/lib" -L"${IROOT}" -L"${IROOT}/lib" -lffead_common -lffead_framework -ldl -lcrypto -lssl -lhiredis -lmemcachedutil -c mod_ffeadcpp.cpp
+#g++ -shared -o mod_ffeadcpplib.so mod_ffeadcpp.o -L"${IROOT}/ffead-cpp-5.0/lib" -L"${IROOT}" -L"${IROOT}/lib" -lffead_common -lffead_framework -ldl -lcrypto -lssl -lapr-1 -laprutil-1 -lstdc++ -lhiredis -lmemcachedutil
 #apxs -i -n 'ffead_cpp_module' mod_ffeadcpplib.so
 #cd -
 
-FFEADROOT=${IROOT}/ffead-cpp-4.0
+FFEADROOT=${IROOT}/ffead-cpp-5.0
 ETROOT=${FFEADROOT//\//\\/}
 EIROOT=${IROOT//\//\\/}
 

+ 2 - 2
frameworks/C++/ffead-cpp/install_ffead-cpp-nginx.sh

@@ -3,6 +3,6 @@
 cd $IROOT
 
 cp ${IROOT}/ffead-cpp-src/modules/nginx_mod_ffeadcpp/nginx.conf ${IROOT}/nginx-ffead-mongo/conf/
-sed -i 's|FFEAD_PATH|'${IROOT}/ffead-cpp-4.0'|g' ${IROOT}/nginx-ffead-mongo/conf/nginx.conf
+sed -i 's|FFEAD_PATH|'${IROOT}/ffead-cpp-5.0'|g' ${IROOT}/nginx-ffead-mongo/conf/nginx.conf
 cp ${IROOT}/ffead-cpp-src/modules/nginx_mod_ffeadcpp/nginx.conf ${IROOT}/nginx-ffead-sql/conf/
-sed -i 's|FFEAD_PATH|'${IROOT}/ffead-cpp-4.0-sql'|g' ${IROOT}/nginx-ffead-sql/conf/nginx.conf
+sed -i 's|FFEAD_PATH|'${IROOT}/ffead-cpp-5.0-sql'|g' ${IROOT}/nginx-ffead-sql/conf/nginx.conf

+ 33 - 15
frameworks/C++/ffead-cpp/run_ffead.sh

@@ -46,46 +46,56 @@ service memcached stop
 
 rm -f /tmp/cache.lock
 rm -f web/te-benchmark-um/config/cache.xml
+rm -f web/te-benchmark-um-pq/config/cache.xml
+rm -f web/te-benchmark-um-mgr/config/cache.xml
 
-if [ "$3" = "redis" ]
+if [ "$4" = "redis" ]
 then
 	service redis-server start
 	cp -f web/te-benchmark-um/config/cacheredis.xml web/te-benchmark-um/config/cache.xml
-	cp -f web/te-benchmark-um/config/sdormmongo.xml web/te-benchmark-um/config/sdorm.xml
+	cp -f web/te-benchmark-um-pq/config/cacheredis.xml web/te-benchmark-um-pq/config/cache.xml
+	cp -f web/te-benchmark-um-mgr/config/cacheredis.xml web/te-benchmark-um-mgr/config/cache.xml
 fi
 
-if [ "$3" = "memcached" ]
+if [ "$4" = "memcached" ]
 then
 	service memcached start
 	cp -f web/te-benchmark-um/config/cachememcached.xml web/te-benchmark-um/config/cache.xml
-	cp -f web/te-benchmark-um/config/sdormmongo.xml web/te-benchmark-um/config/sdorm.xml
+	cp -f web/te-benchmark-um-pq/config/cachememcached.xml web/te-benchmark-um-pq/config/cache.xml
+	cp -f web/te-benchmark-um-mgr/config/cachememcached.xml web/te-benchmark-um-mgr/config/cache.xml
 fi
 
 if [ "$3" = "mongo" ]
 then
+	rm -f web/te-benchmark-um-pq/config/cache.xml
+	rm -f web/te-benchmark-um-mgr/config/cache.xml
 	cp -f web/te-benchmark-um/config/sdormmongo.xml web/te-benchmark-um/config/sdorm.xml
 fi
 
+if [ "$3" = "mongo-raw" ]
+then
+	rm -f web/te-benchmark-um-pq/config/cache.xml
+	rm -f web/te-benchmark-um/config/cache.xml
+fi
+
 if [ "$3" = "mysql" ]
 then
+	rm -f web/te-benchmark-um-pq/config/cache.xml
+	rm -f web/te-benchmark-um-mgr/config/cache.xml
 	cp -f web/te-benchmark-um/config/sdormmysql.xml web/te-benchmark-um/config/sdorm.xml
 fi
 
 if [ "$3" = "postgresql" ]
 then
+	rm -f web/te-benchmark-um-pq/config/cache.xml
+	rm -f web/te-benchmark-um-mgr/config/cache.xml
 	cp -f web/te-benchmark-um/config/sdormpostgresql.xml web/te-benchmark-um/config/sdorm.xml
 fi
 
-if [ "$4" = "redis" ]
-then
-	service redis-server start
-	cp -f web/te-benchmark-um/config/cacheredis.xml web/te-benchmark-um/config/cache.xml
-fi
-
-if [ "$4" = "memcached" ]
+if [ "$3" = "postgresql-raw" ]
 then
-	service memcached start
-	cp -f web/te-benchmark-um/config/cachememcached.xml web/te-benchmark-um/config/cache.xml
+	rm -f web/te-benchmark-um/config/cache.xml
+	rm -f web/te-benchmark-um-mgr/config/cache.xml
 fi
 
 rm -f rtdcf/*.d rtdcf/*.o 
@@ -126,11 +136,15 @@ if [ "$2" = "apache" ]
 then
 	if [ "$3" = "mysql" ] || [ "$3" = "postgresql" ]
 	then
-		sed -i 's|/installs/ffead-cpp-4.0|'/installs/ffead-cpp-4.0-sql'|g' /etc/apache2/apache2.conf
-		sed -i 's|/installs/ffead-cpp-4.0|'/installs/ffead-cpp-4.0-sql'|g' /etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/ffead-site.conf
+		sed -i 's|/installs/ffead-cpp-5.0|'/installs/ffead-cpp-5.0-sql'|g' /etc/apache2/apache2.conf
+		sed -i 's|/installs/ffead-cpp-5.0|'/installs/ffead-cpp-5.0-sql'|g' /etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/ffead-site.conf
 	fi
 	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um/config/sdorm.xml
 	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um/config/cache.xml
+	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-pq/config/sdorm.xml
+	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-pq/config/cache.xml
+	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-mgr/config/sdorm.xml
+	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-mgr/config/cache.xml
 	apachectl -D FOREGROUND
 fi
 
@@ -139,6 +153,10 @@ then
 	mkdir -p ${IROOT}/nginxfc/logs
 	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um/config/sdorm.xml
 	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um/config/cache.xml
+	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-pq/config/sdorm.xml
+	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-pq/config/cache.xml
+	sed -i 's|<pool-size>30</pool-size>|<pool-size>3</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-mgr/config/sdorm.xml
+	sed -i 's|<pool-size>10</pool-size>|<pool-size>2</pool-size>|g' $FFEAD_CPP_PATH/web/te-benchmark-um-mgr/config/cache.xml
 	if [ "$3" = "mysql" ] || [ "$3" = "postgresql" ]
 	then
 		nginx -g 'daemon off;' -c ${IROOT}/nginx-ffead-sql/conf/nginx.conf

+ 10 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/CMakeLists.txt

@@ -0,0 +1,10 @@
+
+file(GLOB sources
+    "include/*.h"
+    "src/*.cpp"
+)
+
+include_directories("${CMAKE_SOURCE_DIR}/web/te-benchmark-um-mgr/include")
+add_library(te_benchmark_um_mgr SHARED ${sources})
+set_property(TARGET te_benchmark_um_mgr PROPERTY POSITION_INDEPENDENT_CODE ON)
+target_link_libraries(te_benchmark_um_mgr ffead-modules ffead-framework ${HAVE_PQLIB} ${HAVE_CURLLIB} ${HAVE_SSLLIB} ${HAVE_MEMCACHEDLIB} ${HAVE_ODBCLIB} ${HAVE_MONGOCLIB} ${HAVE_BSONLIB} ${HAVE_ZLIB} ${HAVE_CRYPTOLIB})

+ 24 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/application.xml

@@ -0,0 +1,24 @@
+<app libname="te_benchmark_um_mgr" router="TeBkUmMgrRouter">
+	<cors-config>
+		<allow-origins>*</allow-origins>
+		<allow-methods>GET, POST, HEAD, PUT, DELETE</allow-methods>
+		<allow-headers>content-type, origin</allow-headers>
+		<expose-headers>content-type, origin</expose-headers>
+		<allow-credentials>true</allow-credentials>
+		<max-age>1023</max-age>
+	</cors-config>
+	<cache-control>
+		<control ext="png,css,js,jpeg,jpg,gif" header="Cache-Control"
+			value="max-age=290304000, public" />
+		<control ext="txt,xml,json" header="Cache-Control"
+			value="max-age=172800, public, must-revalidate" />
+		<control ext="html,html" header="Cache-Control"
+			value="max-age=7200, must-revalidate" />
+		<control file="video.mov" header="Expires"
+			value="Thu, 15 Apr 2020 20:00:00 GMT" />
+		<control header="Last-Modified" remove="true" />
+	</cache-control>
+	<templates>
+		<template class="TeBkUmMgrRouter" file="fortunes.tpe" path="fortunes"/>
+	</templates>
+</app>

+ 13 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cache.xml

@@ -0,0 +1,13 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <username>sumeet</username>
+                                <password>sumeet</password>
+                        </node>
+                </nodes>
+                <init>TeBkUmMgrRouter.updateCache</init>
+                <name>Memory-Cached</name>
+                <type>memory</type>
+        </cache>
+</caches>

+ 15 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cachememcached.xml

@@ -0,0 +1,15 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <host>localhost</host>
+                                <port>11211</port>
+                        </node>
+                </nodes>
+                <init>TeBkUmMgrRouter.updateCache</init>
+                <pool-size>10</pool-size>
+                <expiryTime>3600</expiryTime>
+                <name>Memcached-Cached</name>
+                <type>memcached</type>
+        </cache>
+</caches>

+ 15 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/cacheredis.xml

@@ -0,0 +1,15 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <host>localhost</host>
+                                <port>6379</port>
+                        </node>
+                </nodes>
+                <init>TeBkUmMgrRouter.updateCache</init>
+                <pool-size>10</pool-size>
+                <expiryTime>3600</expiryTime>
+                <name>Redis-Cached</name>
+                <type>redis</type>
+        </cache>
+</caches>

+ 17 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/config/sdorm.xml

@@ -0,0 +1,17 @@
+<sdorm>
+	<data-source>
+		<config>
+			<nodes>
+				<node>
+					<host>localhost</host>
+					<port>27017</port>
+					<databaseName>hello_world</databaseName>
+					<connectionTimeout>10000</connectionTimeout>
+				</node>
+			</nodes>
+			<pool-size>30</pool-size>
+			<name>MongoDB-DSN</name>
+			<type>mongo-raw</type>
+		</config>
+	</data-source>
+</sdorm>

+ 109 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/include/TeBkUmMgr.h

@@ -0,0 +1,109 @@
+/*
+	Copyright 2009-2020, Sumeet Chhetri
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+/*
+ * TeBkUmMgr.h
+ *
+ *  Created on: 03-Feb-2020
+ *      Author: sumeetc
+ */
+
+#ifndef WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmMgr_H_
+#define WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmMgr_H_
+#include "TemplateHandler.h"
+#include "vector"
+#ifndef OS_MINGW
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+#include "DataSourceManager.h"
+#include <stdlib.h>
+#include <algorithm>
+#include "CryptoHandler.h"
+#include "vector"
+#include "CastUtil.h"
+#include <stdlib.h>
+#include "CacheManager.h"
+#include "HttpRequest.h"
+#include "HttpResponse.h"
+#include "JSONSerialize.h"
+#include "string"
+#include "yuarel.h"
+#include "Router.h"
+
+typedef void (*TeBkUmMgrTemplatePtr) (Context*, std::string&);
+
+class TeBkUmMgrWorld {
+	int id;
+	int randomNumber;
+public:
+	TeBkUmMgrWorld();
+	virtual ~TeBkUmMgrWorld();
+	int getId() const;
+	void setId(int id);
+	int getRandomNumber() const;
+	void setRandomNumber(int randomNumber);
+};
+
+class TeBkUmMgrFortune {
+	int id;
+	std::string message;
+public:
+	TeBkUmMgrFortune();
+	virtual ~TeBkUmMgrFortune();
+	int getId() const;
+	void setId(int id);
+	const std::string& getMessage() const;
+	void setMessage(const std::string& message);
+	bool operator < (const TeBkUmMgrFortune& other) const;
+};
+
+class TeBkUmMgrMessage {
+	std::string message;
+public:
+	virtual ~TeBkUmMgrMessage();
+	const std::string& getMessage() const;
+	void setMessage(const std::string& message);
+};
+
+class TeBkUmMgrRouter : public Router {
+	static const std::string HELLO_WORLD;
+	static std::string WORLD;
+	static std::string FORTUNE;
+	bool strToNum(const char* str, int len, int& ret);
+
+	void db(TeBkUmMgrWorld&);
+	void queries(const char*, int, std::vector<TeBkUmMgrWorld>&);
+#ifdef INC_SDORM_MONGO
+	static void dbUtil(void* ctx, int rn, std::vector<MgRawRes>& data);
+#endif
+
+	void updates(const char*, int, std::vector<TeBkUmMgrWorld>&);
+	
+	void cachedWorlds(const char*, int, std::vector<TeBkUmMgrWorld>&);
+#ifdef INC_SDORM_MONGO
+	static void updateCacheUtil(void* ctx, int rn, std::vector<MgRawRes>& data);
+#endif
+
+	void getContext(HttpRequest* request, Context* context);
+#ifdef INC_SDORM_MONGO
+	static void getContextUtil(void* ctx, int rn, std::vector<MgRawRes>& data);
+#endif
+public:
+	void updateCache();
+	void route(HttpRequest* req, HttpResponse* res, void* dlib, void* ddlib);
+};
+
+#endif /* WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmMgr_H_ */

+ 450 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/src/TeBkUmMgr.cpp

@@ -0,0 +1,450 @@
+/*
+	Copyright 2009-2020, Sumeet Chhetri
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+/*
+ * TeBkUmMgrUm.cpp
+ *
+ *  Created on: 03-Feb-2020
+ *      Author: sumeetc
+ */
+#include "TeBkUmMgr.h"
+
+int TeBkUmMgrWorld::getId() const {
+	return id;
+}
+
+void TeBkUmMgrWorld::setId(int id) {
+	this->id = id;
+}
+
+int TeBkUmMgrWorld::getRandomNumber() const {
+	return randomNumber;
+}
+
+void TeBkUmMgrWorld::setRandomNumber(int randomNumber) {
+	this->randomNumber = randomNumber;
+}
+
+TeBkUmMgrWorld::TeBkUmMgrWorld() {
+	id = 0;
+	randomNumber = 0;
+}
+
+TeBkUmMgrWorld::~TeBkUmMgrWorld() {
+}
+
+int TeBkUmMgrFortune::getId() const {
+	return id;
+}
+
+void TeBkUmMgrFortune::setId(int id) {
+	this->id = id;
+}
+
+const std::string& TeBkUmMgrFortune::getMessage() const {
+	return message;
+}
+
+void TeBkUmMgrFortune::setMessage(const std::string& message) {
+	this->message = message;
+}
+
+TeBkUmMgrFortune::TeBkUmMgrFortune() {
+	id = 0;
+}
+
+TeBkUmMgrFortune::~TeBkUmMgrFortune() {
+}
+
+bool TeBkUmMgrFortune::operator < (const TeBkUmMgrFortune& other) const {
+	return message.compare(other.message)<0;
+}
+
+TeBkUmMgrMessage::~TeBkUmMgrMessage() {
+}
+
+const std::string& TeBkUmMgrMessage::getMessage() const {
+	return message;
+}
+
+void TeBkUmMgrMessage::setMessage(const std::string& message) {
+	this->message = message;
+}
+
+const std::string TeBkUmMgrRouter::HELLO_WORLD = "Hello, World!";
+std::string TeBkUmMgrRouter::WORLD = "world";
+std::string TeBkUmMgrRouter::FORTUNE = "fortune";
+
+void TeBkUmMgrRouter::db(TeBkUmMgrWorld& w) {
+#ifdef INC_SDORM_MONGO
+	MongoDBRawDataSourceImpl* sqli = static_cast<MongoDBRawDataSourceImpl*>(DataSourceManager::getRawImpl());
+	int rid = rand() % 10000 + 1;
+	try {
+		bson_t q = BSON_INITIALIZER;
+		bson_append_int32(&q, "_id", 3, rid);
+		sqli->begin(WORLD);
+		sqli->executeQuery(&q, &w, &TeBkUmMgrRouter::dbUtil);
+		sqli->end();
+		bson_destroy(&q);
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+#endif
+}
+#ifdef INC_SDORM_MONGO
+void TeBkUmMgrRouter::dbUtil(void* ctx, int rn, std::vector<MgRawRes>& data) {
+	TeBkUmMgrWorld* w = (TeBkUmMgrWorld*)ctx;
+	for(int i=0;i<(int)data.size();i++) {
+		if(data.at(i).n=="_id") {
+			w->setId((int)data.at(i).d);
+			if(w->getId()<=0) {
+				w->setId((int)data.at(i).l);
+			}
+		}
+		if(data.at(i).n=="randomNumber") {
+			w->setRandomNumber((int)data.at(i).d);
+			if(w->getRandomNumber()==0) {
+				w->setRandomNumber((int)data.at(i).l);
+			}
+		}
+	}
+}
+#endif
+
+void TeBkUmMgrRouter::queries(const char* q, int ql, std::vector<TeBkUmMgrWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+#ifdef INC_SDORM_MONGO
+	MongoDBRawDataSourceImpl* sqli = static_cast<MongoDBRawDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		TeBkUmMgrWorld w;
+		sqli->begin(WORLD);
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			bson_t q = BSON_INITIALIZER;
+			bson_append_int32(&q, "_id", 3, rid);
+			sqli->executeQuery(&q, &w, &TeBkUmMgrRouter::dbUtil);
+			bson_destroy(&q);
+			wlst.push_back(w);
+		}
+		sqli->end();
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+#endif
+}
+
+void TeBkUmMgrRouter::updates(const char* q, int ql, std::vector<TeBkUmMgrWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+#ifdef INC_SDORM_MONGO
+	MongoDBRawDataSourceImpl* sqli = static_cast<MongoDBRawDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		sqli->startBulk(WORLD);
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			bson_t q;
+			bson_init(&q);
+			bson_append_int32(&q, "_id", 3, rid);
+			TeBkUmMgrWorld w;
+			sqli->executeQuery(&q, &w, &TeBkUmMgrRouter::dbUtil);
+			int newRandomNumber = rand() % 10000 + 1;
+			if(w.getRandomNumber() == newRandomNumber) {
+				newRandomNumber += 1;
+				if(newRandomNumber>=10000) {
+					newRandomNumber = 1;
+				}
+			}
+			w.setRandomNumber(newRandomNumber);
+			bson_t du;
+			bson_t d;
+			bson_init(&du);
+			bson_append_document_begin(&du, "$set", 4, &d);
+			//bson_append_int32(&d, "_id", 3, w.getId());
+			bson_append_int32(&d, "randomNumber", 12, w.getRandomNumber());
+			bson_append_document_end(&du, &d);
+			sqli->addBulk(&q, &du);
+			/*char* str = bson_as_json(&du, NULL);
+			printf("%s\n", str);
+			bson_free(str);*/
+			bson_destroy(&du);
+			bson_destroy(&q);
+			wlst.push_back(w);
+		}
+		sqli->endBulk();
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+#endif
+}
+
+void TeBkUmMgrRouter::updateCache() {
+	CacheInterface* cchi = CacheManager::getImpl();
+#ifdef INC_SDORM_MONGO
+	MongoDBRawDataSourceImpl* sqli = static_cast<MongoDBRawDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		std::vector<TeBkUmMgrWorld> wlist;
+		sqli->begin(WORLD);
+		sqli->executeQuery(NULL, &wlist, &TeBkUmMgrRouter::updateCacheUtil);
+		sqli->end();
+
+		for (int c = 0; c < (int)wlist.size(); ++c) {
+			TeBkUmMgrWorld& w = wlist.at(c);
+			char str[12];
+			sprintf(str, "%d;%d", w.getId(), w.getRandomNumber());
+			cchi->setRaw(CastUtil::fromNumber(w.getId()), str);
+		}
+		DataSourceManager::cleanRawImpl(sqli);
+		CacheManager::cleanImpl(cchi);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		CacheManager::cleanImpl(cchi);
+		throw e;
+	}
+#endif
+}
+#ifdef INC_SDORM_MONGO
+void TeBkUmMgrRouter::updateCacheUtil(void* ctx, int rn, std::vector<MgRawRes>& data) {
+	std::vector<TeBkUmMgrWorld>* wlist = (std::vector<TeBkUmMgrWorld>*)ctx;
+	TeBkUmMgrWorld w;
+	for(int i=0;i<(int)data.size();i++) {
+		if(data.at(i).n=="_id") {
+			w.setId((int)data.at(i).d);
+			if(w.getId()<=0) {
+				w.setId((int)data.at(i).l);
+			}
+		}
+		if(data.at(i).n=="randomNumber") {
+			w.setRandomNumber((int)data.at(i).d);
+			if(w.getRandomNumber()<=0) {
+				w.setRandomNumber((int)data.at(i).l);
+			}
+		}
+	}
+	wlist->push_back(w);
+}
+#endif
+
+void TeBkUmMgrRouter::cachedWorlds(const char* q, int ql, std::vector<TeBkUmMgrWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+
+	CacheInterface* cchi = CacheManager::getImpl();
+	try {
+		std::vector<std::string> keys;
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			keys.push_back(CastUtil::fromNumber(rid));
+		}
+
+		std::vector<std::string> values;
+		cchi->mgetRaw(keys, values);
+
+		for (int c = 0; c < (int)values.size(); ++c) {
+			TeBkUmMgrWorld w;
+			std::string& v = values.at(c);
+			size_t fn = v.find(";");
+			int tmp = 0;
+			strToNum(v.substr(0, fn).c_str(), fn, tmp);
+			w.setId(tmp);
+			tmp = 0;
+			strToNum(v.substr(fn+1).c_str(), v.length()-fn-1, tmp);
+			w.setRandomNumber(tmp);
+			wlst.push_back(w);
+		}
+		CacheManager::cleanImpl(cchi);
+	} catch(const std::exception& e) {
+		CacheManager::cleanImpl(cchi);
+		throw e;
+	}
+}
+
+void TeBkUmMgrRouter::getContext(HttpRequest* request, Context* context) {
+#ifdef INC_SDORM_MONGO
+	MongoDBRawDataSourceImpl* sqli = static_cast<MongoDBRawDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		std::vector<TeBkUmMgrFortune>* flst = new std::vector<TeBkUmMgrFortune>;
+		sqli->begin(FORTUNE);
+		sqli->executeQuery(NULL, flst, &TeBkUmMgrRouter::getContextUtil);
+		sqli->end();
+
+		TeBkUmMgrFortune nf;
+		nf.setId(0);
+		nf.setMessage("Additional fortune added at request time.");
+		flst->push_back(nf);
+		std::sort (flst->begin(), flst->end());
+
+		context->insert(std::pair<std::string, void*>("fortunes", flst));
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(...) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw;
+	}
+#endif
+}
+#ifdef INC_SDORM_MONGO
+void TeBkUmMgrRouter::getContextUtil(void* ctx, int rn, std::vector<MgRawRes>& data) {
+	std::vector<TeBkUmMgrFortune>* flst = (std::vector<TeBkUmMgrFortune>*)ctx;
+	TeBkUmMgrFortune w;
+	for(int i=0;i<(int)data.size();i++) {
+		if(data.at(i).n=="_id") {
+			w.setId((int)data.at(i).d);
+			if(w.getId()<=0) {
+				w.setId((int)data.at(i).l);
+			}
+		}
+		if(data.at(i).n=="message") {
+			std::string nm = data.at(i).s;
+			CryptoHandler::sanitizeHtml(nm);
+			w.setMessage(nm);
+		}
+	}
+	flst->push_back(w);
+}
+#endif
+
+//https://stackoverflow.com/questions/9631225/convert-strings-specified-by-length-not-nul-terminated-to-int-float
+bool TeBkUmMgrRouter::strToNum(const char* str, int len, int& ret) {
+    ret = 0;
+    for(int i = 0; i < len; ++i)
+    {
+    	if(!isdigit(str[i])) return false;
+        ret = ret * 10 + (str[i] - '0');
+    }
+    return true;
+}
+
+void TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void* ddlib) {
+	//Timer t;
+	//t.start();
+	std::string_view path = req->getPath();
+	if(StringUtil::endsWith(path, "/plaintext")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(HELLO_WORLD);
+		res->setContentType(ContentTypes::CONTENT_TYPE_TEXT_PLAIN);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/json")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		TeBkUmMgrMessage msg;
+		msg.setMessage(HELLO_WORLD);
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrMessage"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/db")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		TeBkUmMgrWorld msg;
+		db(msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrWorld"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/queries")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmMgrWorld> msg;
+		queries(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/fortunes")) {
+		Context ctx;
+		getContext(req, &ctx);
+
+		std::string fname = "_tebenchmarkummgrtpefortunestpeemittTemplateHTML";
+		void* mkr = dlsym(ddlib, fname.c_str());
+		if(mkr!=NULL)
+		{
+			TeBkUmMgrTemplatePtr f =  (TeBkUmMgrTemplatePtr)mkr;
+			std::string msg;
+			f(&ctx, msg);
+			res->setContent(msg);
+			res->setContentType(ContentTypes::CONTENT_TYPE_TEXT_SHTML);
+			res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		}
+	} else if(StringUtil::endsWith(path, "/updates")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmMgrWorld> msg;
+		updates(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/cached-worlds")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmMgrWorld> msg;
+		cachedWorlds(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else {
+		res->setHTTPResponseStatus(HTTPResponseStatus::NotFound);
+	}
+	res->setDone(true);
+}

+ 17 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/src/autotools/Makefile.am

@@ -0,0 +1,17 @@
+AUTOMAKE_OPTIONS = subdir-objects
+ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
+
+AM_CPPFLAGS=-I"../../../../include" -I"../../include"
+
+packageIdentifier=${PACKAGE_NAME}-${PACKAGE_VERSION}-bin
+distdir=${PACKAGE_NAME}-${PACKAGE_VERSION}-src
+fprefix=../../../../${packageIdentifier}
+prefix=${abs_builddir}
+
+lib_LTLIBRARIES = libte_benchmark_um_mgr.la
+libte_benchmark_um_mgr_la_SOURCES = ../TeBkUmMgr.cpp
+
+libte_benchmark_um_mgr_la_LDFLAGS = -no-undefined 
+libte_benchmark_um_mgr_la_LIBADD = -L"${fprefix}/lib" -lffead-modules -lffead-framework
+
+#dist_noinst_SCRIPTS = autogen.sh

+ 13 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/tpe/fortunes.tpe

@@ -0,0 +1,13 @@
+#declare std::vector<TeBkUmMgrFortune> fortunes#
+<!DOCTYPE html>
+<html>
+<head><title>Fortunes</title></head>
+<body>
+<table>
+<tr><th>id</th><th>message</th></tr>
+#for(int i=0;i<(int)fortunes.size();i++)#
+<tr><td>$_S{fortunes.at(i).getId()}</td><td>${fortunes.at(i).getMessage()}</td></tr>
+#rof#
+</table>
+</body>
+</html>

+ 10 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/CMakeLists.txt

@@ -0,0 +1,10 @@
+
+file(GLOB sources
+    "include/*.h"
+    "src/*.cpp"
+)
+
+include_directories("${CMAKE_SOURCE_DIR}/web/te-benchmark-um-pq/include")
+add_library(te_benchmark_um_pq SHARED ${sources})
+set_property(TARGET te_benchmark_um_pq PROPERTY POSITION_INDEPENDENT_CODE ON)
+target_link_libraries(te_benchmark_um_pq ffead-modules ffead-framework ${HAVE_PQLIB} ${HAVE_CURLLIB} ${HAVE_SSLLIB} ${HAVE_MEMCACHEDLIB} ${HAVE_ODBCLIB} ${HAVE_MONGOCLIB} ${HAVE_BSONLIB} ${HAVE_ZLIB} ${HAVE_CRYPTOLIB})

+ 24 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/application.xml

@@ -0,0 +1,24 @@
+<app libname="te_benchmark_um_pq" router="TeBkUmLpqRouter">
+	<cors-config>
+		<allow-origins>*</allow-origins>
+		<allow-methods>GET, POST, HEAD, PUT, DELETE</allow-methods>
+		<allow-headers>content-type, origin</allow-headers>
+		<expose-headers>content-type, origin</expose-headers>
+		<allow-credentials>true</allow-credentials>
+		<max-age>1023</max-age>
+	</cors-config>
+	<cache-control>
+		<control ext="png,css,js,jpeg,jpg,gif" header="Cache-Control"
+			value="max-age=290304000, public" />
+		<control ext="txt,xml,json" header="Cache-Control"
+			value="max-age=172800, public, must-revalidate" />
+		<control ext="html,html" header="Cache-Control"
+			value="max-age=7200, must-revalidate" />
+		<control file="video.mov" header="Expires"
+			value="Thu, 15 Apr 2020 20:00:00 GMT" />
+		<control header="Last-Modified" remove="true" />
+	</cache-control>
+	<templates>
+		<template class="TeBkUmLpqRouter" file="fortunes.tpe" path="fortunes"/>
+	</templates>
+</app>

+ 13 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cache.xml

@@ -0,0 +1,13 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <username>sumeet</username>
+                                <password>sumeet</password>
+                        </node>
+                </nodes>
+                <init>TeBkUmLpqRouter.updateCache</init>
+                <name>Memory-Cached</name>
+                <type>memory</type>
+        </cache>
+</caches>

+ 15 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cachememcached.xml

@@ -0,0 +1,15 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <host>localhost</host>
+                                <port>11211</port>
+                        </node>
+                </nodes>
+                <init>TeBkUmLpqRouter.updateCache</init>
+                <pool-size>10</pool-size>
+                <expiryTime>3600</expiryTime>
+                <name>Memcached-Cached</name>
+                <type>memcached</type>
+        </cache>
+</caches>

+ 15 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/cacheredis.xml

@@ -0,0 +1,15 @@
+<caches>
+        <cache>
+                <nodes>
+                        <node>
+                                <host>localhost</host>
+                                <port>6379</port>
+                        </node>
+                </nodes>
+                <init>TeBkUmLpqRouter.updateCache</init>
+                <pool-size>10</pool-size>
+                <expiryTime>3600</expiryTime>
+                <name>Redis-Cached</name>
+                <type>redis</type>
+        </cache>
+</caches>

+ 14 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/config/sdorm.xml

@@ -0,0 +1,14 @@
+<sdorm>
+	<data-source>
+		<config>
+			<nodes>
+				<node>
+					<url>host=localhost user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world</url>
+				</node>
+			</nodes>
+			<pool-size>30</pool-size>
+			<name>PostgreSQL-DSN</name>
+			<type>sql-raw-pq</type>
+		</config>
+	</data-source>
+</sdorm>

+ 106 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/include/TeBkUmLpq.h

@@ -0,0 +1,106 @@
+/*
+	Copyright 2009-2020, Sumeet Chhetri
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+/*
+ * TeBkUmLpq.h
+ *
+ *  Created on: 03-Feb-2020
+ *      Author: sumeetc
+ */
+
+#ifndef WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmLpq_H_
+#define WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmLpq_H_
+#include "TemplateHandler.h"
+#include "vector"
+#ifndef OS_MINGW
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+#include "DataSourceManager.h"
+#include <stdlib.h>
+#include <algorithm>
+#include "CryptoHandler.h"
+#include "vector"
+#include "CastUtil.h"
+#include <stdlib.h>
+#include "CacheManager.h"
+#include "HttpRequest.h"
+#include "HttpResponse.h"
+#include "JSONSerialize.h"
+#include "string"
+#include "yuarel.h"
+#include "Router.h"
+
+typedef void (*TeBkUmLpqTemplatePtr) (Context*, std::string&);
+
+class TeBkUmLpqWorld {
+	int id;
+	int randomNumber;
+public:
+	TeBkUmLpqWorld();
+	virtual ~TeBkUmLpqWorld();
+	int getId() const;
+	void setId(int id);
+	int getRandomNumber() const;
+	void setRandomNumber(int randomNumber);
+};
+
+class TeBkUmLpqFortune {
+	int id;
+	std::string message;
+public:
+	TeBkUmLpqFortune();
+	virtual ~TeBkUmLpqFortune();
+	int getId() const;
+	void setId(int id);
+	const std::string& getMessage() const;
+	void setMessage(const std::string& message);
+	bool operator < (const TeBkUmLpqFortune& other) const;
+};
+
+class TeBkUmLpqMessage {
+	std::string message;
+public:
+	virtual ~TeBkUmLpqMessage();
+	const std::string& getMessage() const;
+	void setMessage(const std::string& message);
+};
+
+class TeBkUmLpqRouter : public Router {
+	static const std::string HELLO_WORLD;
+	static std::string WORLD;
+	static std::string WORLD_ONE_QUERY;
+	static std::string WORLD_ALL_QUERY;
+	static std::string FORTUNE_ALL_QUERY;
+	bool strToNum(const char* str, int len, int& ret);
+
+	void db(TeBkUmLpqWorld&);
+	void queries(const char*, int, std::vector<TeBkUmLpqWorld>&);
+	static void dbUtil(void* ctx, int rn, std::vector<LibpqRes>& data);
+
+	void updates(const char*, int, std::vector<TeBkUmLpqWorld>&);
+	static void updatesUtil(void* ctx, int rn, std::vector<LibpqRes>& data);
+	
+	void cachedWorlds(const char*, int, std::vector<TeBkUmLpqWorld>&);
+	static void updateCacheUtil(void* ctx, int rn, std::vector<LibpqRes>& data);
+
+	void getContext(HttpRequest* request, Context* context);
+	static void getContextUtil(void* ctx, int rn, std::vector<LibpqRes>& data);
+public:
+	void updateCache();
+	void route(HttpRequest* req, HttpResponse* res, void* dlib, void* ddlib);
+};
+
+#endif /* WEB_TE_BENCHMARK_UM_INCLUDE_TeBkUmLpq_H_ */

+ 415 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/src/TeBkUmLpq.cpp

@@ -0,0 +1,415 @@
+/*
+	Copyright 2009-2020, Sumeet Chhetri
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+/*
+ * TeBkUmLpqUm.cpp
+ *
+ *  Created on: 03-Feb-2020
+ *      Author: sumeetc
+ */
+#include "TeBkUmLpq.h"
+
+int TeBkUmLpqWorld::getId() const {
+	return id;
+}
+
+void TeBkUmLpqWorld::setId(int id) {
+	this->id = id;
+}
+
+int TeBkUmLpqWorld::getRandomNumber() const {
+	return randomNumber;
+}
+
+void TeBkUmLpqWorld::setRandomNumber(int randomNumber) {
+	this->randomNumber = randomNumber;
+}
+
+TeBkUmLpqWorld::TeBkUmLpqWorld() {
+	id = 0;
+	randomNumber = 0;
+}
+
+TeBkUmLpqWorld::~TeBkUmLpqWorld() {
+}
+
+int TeBkUmLpqFortune::getId() const {
+	return id;
+}
+
+void TeBkUmLpqFortune::setId(int id) {
+	this->id = id;
+}
+
+const std::string& TeBkUmLpqFortune::getMessage() const {
+	return message;
+}
+
+void TeBkUmLpqFortune::setMessage(const std::string& message) {
+	this->message = message;
+}
+
+TeBkUmLpqFortune::TeBkUmLpqFortune() {
+	id = 0;
+}
+
+TeBkUmLpqFortune::~TeBkUmLpqFortune() {
+}
+
+bool TeBkUmLpqFortune::operator < (const TeBkUmLpqFortune& other) const {
+	return message.compare(other.message)<0;
+}
+
+TeBkUmLpqMessage::~TeBkUmLpqMessage() {
+}
+
+const std::string& TeBkUmLpqMessage::getMessage() const {
+	return message;
+}
+
+void TeBkUmLpqMessage::setMessage(const std::string& message) {
+	this->message = message;
+}
+
+const std::string TeBkUmLpqRouter::HELLO_WORLD = "Hello, World!";
+std::string TeBkUmLpqRouter::WORLD = "world";
+std::string TeBkUmLpqRouter::WORLD_ONE_QUERY = "select id, randomnumber from world where id = $1";
+std::string TeBkUmLpqRouter::WORLD_ALL_QUERY = "select id, randomnumber from world";
+std::string TeBkUmLpqRouter::FORTUNE_ALL_QUERY = "select id, message from fortune";
+
+void TeBkUmLpqRouter::db(TeBkUmLpqWorld& w) {
+	LibpqDataSourceImpl* sqli = static_cast<LibpqDataSourceImpl*>(DataSourceManager::getRawImpl());
+	int rid = rand() % 10000 + 1;
+	try {
+		std::vector<LibpqParam> pars;
+		LibpqDataSourceImpl::ADD_INT4(pars, rid);
+		sqli->executeQuery(WORLD_ONE_QUERY, pars, &w, &TeBkUmLpqRouter::dbUtil);
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+}
+void TeBkUmLpqRouter::dbUtil(void* ctx, int rn, std::vector<LibpqRes>& data) {
+	TeBkUmLpqWorld* w = (TeBkUmLpqWorld*)ctx;
+	w->setId(ntohl(*((uint32_t *) data.at(0).d)));
+	w->setRandomNumber(ntohl(*((uint32_t *) data.at(1).d)));
+}
+
+void TeBkUmLpqRouter::queries(const char* q, int ql, std::vector<TeBkUmLpqWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+
+	LibpqDataSourceImpl* sqli = static_cast<LibpqDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		TeBkUmLpqWorld w;
+		std::vector<LibpqParam> pars;
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			pars.clear();
+			LibpqDataSourceImpl::ADD_INT4(pars, rid);
+			sqli->executeQuery(WORLD_ONE_QUERY, pars, &w, &TeBkUmLpqRouter::dbUtil);
+			wlst.push_back(w);
+		}
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+}
+
+void TeBkUmLpqRouter::updates(const char* q, int ql, std::vector<TeBkUmLpqWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+
+	LibpqDataSourceImpl* sqli = static_cast<LibpqDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		std::vector<LibpqParam> pars;
+		std::vector<LibpqParam> qp;
+
+		std::stringstream ss;
+		ss << "update world as t set randomnumber = c.randomnumber from (values";
+
+		int pc = 1;
+		for (int c = 0; c < queryCount; ++c) {
+			ss << "($";
+			ss << pc++;
+			ss << "::int4,$";
+			ss << pc++;
+			if(c!=queryCount-1) {
+				ss << "::int4),";
+			} else {
+				ss << "::int4)";
+			}
+
+			int rid = rand() % 10000 + 1;
+			qp.clear();
+			LibpqDataSourceImpl::ADD_INT4(qp, rid);
+			TeBkUmLpqWorld w;
+			sqli->executeQuery(WORLD_ONE_QUERY, qp, &w, &TeBkUmLpqRouter::dbUtil);
+			wlst.push_back(w);
+
+			LibpqDataSourceImpl::ADD_INT4(pars, w.getId());
+			LibpqDataSourceImpl::ADD_INT4(pars, w.getRandomNumber());
+		}
+		ss << ") as c(randomnumber, id) where c.id = t.id";
+		
+		sqli->begin();
+		sqli->executeUpdateQuery(ss.str(), pars);
+		sqli->commit();
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(const std::exception& e) {
+		sqli->rollback();
+		DataSourceManager::cleanRawImpl(sqli);
+		throw e;
+	}
+}
+void TeBkUmLpqRouter::updatesUtil(void* ctx, int rn, std::vector<LibpqRes>& data) {
+	std::vector<LibpqParam>* pars = (std::vector<LibpqParam>*)ctx;
+	int newRandomNumber = rand() % 10000 + 1;
+	if((int)ntohl(*((uint32_t *) data.at(1).d)) == newRandomNumber) {
+		newRandomNumber += 1;
+		if(newRandomNumber>=10000) {
+			newRandomNumber = 1;
+		}
+	}
+	LibpqDataSourceImpl::ADD_INT4(*pars, newRandomNumber);
+	uint32_t id = *(uint32_t *)data.at(0).d;
+	LibpqDataSourceImpl::ADD_INT4(*pars, id, false);
+}
+
+void TeBkUmLpqRouter::updateCache() {
+	CacheInterface* cchi = CacheManager::getImpl();
+	LibpqDataSourceImpl* sqli = static_cast<LibpqDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		std::vector<TeBkUmLpqWorld> wlist;
+		std::vector<LibpqParam> pars;
+		sqli->executeQuery(WORLD_ALL_QUERY, pars, &wlist, &TeBkUmLpqRouter::updateCacheUtil);
+
+		for (int c = 0; c < (int)wlist.size(); ++c) {
+			TeBkUmLpqWorld& w = wlist.at(c);
+			char str[12];
+			sprintf(str, "%d;%d", w.getId(), w.getRandomNumber());
+			cchi->setRaw(CastUtil::fromNumber(w.getId()), str);
+		}
+		DataSourceManager::cleanRawImpl(sqli);
+		CacheManager::cleanImpl(cchi);
+	} catch(const std::exception& e) {
+		DataSourceManager::cleanRawImpl(sqli);
+		CacheManager::cleanImpl(cchi);
+		throw e;
+	}
+}
+void TeBkUmLpqRouter::updateCacheUtil(void* ctx, int rn, std::vector<LibpqRes>& data) {
+	std::vector<TeBkUmLpqWorld>* wlist = (std::vector<TeBkUmLpqWorld>*)ctx;
+	TeBkUmLpqWorld w;
+	w.setId(ntohl(*((uint32_t *) data.at(0).d)));
+	w.setRandomNumber(ntohl(*((uint32_t *) data.at(1).d)));
+	wlist->push_back(w);
+}
+
+void TeBkUmLpqRouter::cachedWorlds(const char* q, int ql, std::vector<TeBkUmLpqWorld>& wlst) {
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+
+	CacheInterface* cchi = CacheManager::getImpl();
+
+	try {
+		std::vector<std::string> keys;
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			keys.push_back(CastUtil::fromNumber(rid));
+		}
+
+		std::vector<std::string> values;
+		cchi->mgetRaw(keys, values);
+
+		for (int c = 0; c < (int)values.size(); ++c) {
+			TeBkUmLpqWorld w;
+			std::string& v = values.at(c);
+			size_t fn = v.find(";");
+			int tmp = 0;
+			strToNum(v.substr(0, fn).c_str(), fn, tmp);
+			w.setId(tmp);
+			tmp = 0;
+			strToNum(v.substr(fn+1).c_str(), v.length()-fn-1, tmp);
+			w.setRandomNumber(tmp);
+			wlst.push_back(w);
+		}
+
+		CacheManager::cleanImpl(cchi);
+	} catch(const std::exception& e) {
+		CacheManager::cleanImpl(cchi);
+		throw e;
+	}
+}
+
+void TeBkUmLpqRouter::getContext(HttpRequest* request, Context* context) {
+	LibpqDataSourceImpl* sqli = static_cast<LibpqDataSourceImpl*>(DataSourceManager::getRawImpl());
+
+	try {
+		std::vector<TeBkUmLpqFortune>* flst = new std::vector<TeBkUmLpqFortune>;
+		std::vector<LibpqParam> pars;
+		sqli->executeQuery(FORTUNE_ALL_QUERY, pars, flst, &TeBkUmLpqRouter::getContextUtil);
+
+		TeBkUmLpqFortune nf;
+		nf.setId(0);
+		nf.setMessage("Additional fortune added at request time.");
+		flst->push_back(nf);
+		std::sort (flst->begin(), flst->end());
+
+		context->insert(std::pair<std::string, void*>("fortunes", flst));
+		DataSourceManager::cleanRawImpl(sqli);
+	} catch(...) {
+		DataSourceManager::cleanRawImpl(sqli);
+		throw;
+	}
+}
+void TeBkUmLpqRouter::getContextUtil(void* ctx, int rn, std::vector<LibpqRes>& data) {
+	std::vector<TeBkUmLpqFortune>* flst = (std::vector<TeBkUmLpqFortune>*)ctx;
+	TeBkUmLpqFortune w;
+	w.setId(ntohl(*((uint32_t *) data.at(0).d)));
+	std::string nm = std::string(data.at(1).d, data.at(1).l);
+	CryptoHandler::sanitizeHtml(nm);
+	w.setMessage(nm);
+	flst->push_back(w);
+}
+
+//https://stackoverflow.com/questions/9631225/convert-strings-specified-by-length-not-nul-terminated-to-int-float
+bool TeBkUmLpqRouter::strToNum(const char* str, int len, int& ret) {
+    ret = 0;
+    for(int i = 0; i < len; ++i)
+    {
+    	if(!isdigit(str[i])) return false;
+        ret = ret * 10 + (str[i] - '0');
+    }
+    return true;
+}
+
+void TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void* ddlib) {
+	//Timer t;
+	//t.start();
+	std::string_view path = req->getPath();
+	if(StringUtil::endsWith(path, "/plaintext")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(HELLO_WORLD);
+		res->setContentType(ContentTypes::CONTENT_TYPE_TEXT_PLAIN);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/json")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		TeBkUmLpqMessage msg;
+		msg.setMessage(HELLO_WORLD);
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqMessage"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/db")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		TeBkUmLpqWorld msg;
+		db(msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqWorld"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/queries")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmLpqWorld> msg;
+		queries(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/fortunes")) {
+		Context ctx;
+		getContext(req, &ctx);
+
+		std::string fname = "_tebenchmarkumpqtpefortunestpeemittTemplateHTML";
+		void* mkr = dlsym(ddlib, fname.c_str());
+		if(mkr!=NULL)
+		{
+			TeBkUmLpqTemplatePtr f =  (TeBkUmLpqTemplatePtr)mkr;
+			std::string msg;
+			f(&ctx, msg);
+			res->setContent(msg);
+			res->setContentType(ContentTypes::CONTENT_TYPE_TEXT_SHTML);
+			res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		}
+	} else if(StringUtil::endsWith(path, "/updates")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmLpqWorld> msg;
+		updates(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else if(StringUtil::endsWith(path, "/cached-worlds")) {
+		//t.end();
+		//CommonUtils::tsContRstLkp += t.timerNanoSeconds();
+		//t.start();
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		std::vector<TeBkUmLpqWorld> msg;
+		cachedWorlds(params[0].val, params[0].val_len, msg);
+		//t.end();
+		//CommonUtils::tsContExec += t.timerNanoSeconds();
+		//t.start();
+		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
+		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		//t.end();
+		//CommonUtils::tsContRstSer += t.timerNanoSeconds();
+	} else {
+		res->setHTTPResponseStatus(HTTPResponseStatus::NotFound);
+	}
+	res->setDone(true);
+}

+ 17 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/src/autotools/Makefile.am

@@ -0,0 +1,17 @@
+AUTOMAKE_OPTIONS = subdir-objects
+ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS}
+
+AM_CPPFLAGS=-I"../../../../include" -I"../../include"
+
+packageIdentifier=${PACKAGE_NAME}-${PACKAGE_VERSION}-bin
+distdir=${PACKAGE_NAME}-${PACKAGE_VERSION}-src
+fprefix=../../../../${packageIdentifier}
+prefix=${abs_builddir}
+
+lib_LTLIBRARIES = libte_benchmark_um_pq.la
+libte_benchmark_um_pq_la_SOURCES = ../TeBkUmLpq.cpp
+
+libte_benchmark_um_pq_la_LDFLAGS = -no-undefined 
+libte_benchmark_um_pq_la_LIBADD = -L"${fprefix}/lib" -lffead-modules -lffead-framework
+
+#dist_noinst_SCRIPTS = autogen.sh

+ 13 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/tpe/fortunes.tpe

@@ -0,0 +1,13 @@
+#declare std::vector<TeBkUmLpqFortune> fortunes#
+<!DOCTYPE html>
+<html>
+<head><title>Fortunes</title></head>
+<body>
+<table>
+<tr><th>id</th><th>message</th></tr>
+#for(int i=0;i<(int)fortunes.size();i++)#
+<tr><td>$_S{fortunes.at(i).getId()}</td><td>${fortunes.at(i).getMessage()}</td></tr>
+#rof#
+</table>
+</body>
+</html>