Browse Source

Upgrade Go/atreugo to v8 and code refactor (#4962)

* Upgrade atreugo to v8 and code refactor

* Fix fortune-quick
Sergio Andrés Virviescas Santana 6 years ago
parent
commit
dbbc38b271

+ 9 - 17
frameworks/Go/atreugo/src/go.mod

@@ -1,31 +1,23 @@
 module atreugo/src
 
+go 1.12
+
 require (
-	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0
 	github.com/go-stack/stack v1.8.0 // indirect
 	github.com/golang/snappy v0.0.1 // indirect
-	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/pgx v3.3.0+incompatible
-	github.com/kr/pretty v0.1.0 // indirect
-	github.com/lib/pq v1.0.0 // indirect
-	github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe
+	github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e
 	github.com/pkg/errors v0.8.1 // indirect
-	github.com/satori/go.uuid v1.2.0 // indirect
-	github.com/savsgio/atreugo/v7 v7.1.1
-	github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
-	github.com/stretchr/testify v1.3.0 // indirect
-	github.com/tidwall/gjson v1.2.1 // indirect
-	github.com/tidwall/match v1.0.1 // indirect
-	github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 // indirect
+	github.com/savsgio/atreugo/v8 v8.1.1
+	github.com/tidwall/gjson v1.3.2 // indirect
 	github.com/tidwall/sjson v1.0.4
-	github.com/valyala/quicktemplate v1.0.2
+	github.com/valyala/quicktemplate v1.1.1
 	github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect
 	github.com/xdg/stringprep v1.0.0 // indirect
 	go.mongodb.org/mongo-driver v1.0.0
-	golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 // indirect
-	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 // indirect
-	golang.org/x/text v0.3.0 // indirect
-	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
+	golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect
+	golang.org/x/sync v0.0.0-20190423024810-112230192c58 // indirect
+	golang.org/x/text v0.3.2 // indirect
 	gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
 )

+ 33 - 49
frameworks/Go/atreugo/src/go.sum

@@ -1,70 +1,51 @@
-github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
-github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/fasthttp/router v0.3.3 h1:pbXxvJqqb4PeNIIS//DwOtimK9hYchl33eoVgeIMNM8=
-github.com/fasthttp/router v0.3.3/go.mod h1:lCf2TfRIzs3lgcFUGQah09Wu5BiEHcBPl3vm9QiXNTo=
+github.com/fasthttp/router v0.4.1 h1:FtChotx7KqrjOvrdQO8St+A8Mf+0ijjlDp0qsacSrro=
+github.com/fasthttp/router v0.4.1/go.mod h1:lEEZAHnTxjTcHUy3HKrC0ZxVteWfkEMNfy5J49xG8/k=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0 h1:RkFZ/6Hc9fBqO3eSAmlLdBfQc4sEHSOg4P/zQRhJQcE=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0/go.mod h1:H8Wgri1Asi1VevY3ySdpIK5+KCpqzToVswNq8g2xZj4=
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
 github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
-github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
-github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/klauspost/compress v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8=
+github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e h1:+lIPJOWl+jSiJOc70QXJ07+2eg2Jy2EC7Mi11BWujeM=
+github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E=
+github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
+github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/savsgio/atreugo/v7 v7.1.1 h1:SJBMyKS0ZHo3d4i1en0hvYdK+e8hyknPlVXlx9GoRp0=
-github.com/savsgio/atreugo/v7 v7.1.1/go.mod h1:V07FVzh/wHX/3ODPkicj6KcuVM+7/IUEwyYu5tl2dsc=
+github.com/savsgio/atreugo/v8 v8.1.1 h1:dT0u99EhnZaaDEzkmP1Efposn9NeBEB6flwdXw3piSA=
+github.com/savsgio/atreugo/v8 v8.1.1/go.mod h1:fdVj52U2KiY3twnLac/FAcEbjQMWhtj/3hYU4ZGcM14=
 github.com/savsgio/go-logger v1.0.0 h1:jiaRvohRr8RwtcK/WDcA/Yp4eaPaarAko3JNPzt1xoQ=
 github.com/savsgio/go-logger v1.0.0/go.mod h1:/ZzTTmB3JJqjZQcLlxTGbwy3fIsLUoYyldsSEL5rU2g=
-github.com/savsgio/gotils v0.0.0-20190210195551-a1aee1d83e72 h1:JEOaM8cQH5Z237uAdMAF6YXMcZXtaiTD2NECYwrYHl0=
-github.com/savsgio/gotils v0.0.0-20190210195551-a1aee1d83e72/go.mod h1:w803/Fg1m0hrp1ZT9KNfQe4E4+WOMMFLcgzPvOcye10=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/tidwall/gjson v1.2.1 h1:j0efZLrZUvNerEf6xqoi0NjWMK5YlLrR7Guo/dxY174=
-github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA=
+github.com/savsgio/gotils v0.0.0-20190714152828-365999d0a274 h1:F52t1X2ziOrMcQMVHo8ZxwOrDTMAq6MrlKtL1Atu2wU=
+github.com/savsgio/gotils v0.0.0-20190714152828-365999d0a274/go.mod h1:w803/Fg1m0hrp1ZT9KNfQe4E4+WOMMFLcgzPvOcye10=
+github.com/tidwall/gjson v1.3.2 h1:+7p3qQFaH3fOMXAJSrdZwGKcOO/lYdGS0HqGhPqDdTI=
+github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
 github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
 github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
-github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 h1:BP2bjP495BBPaBcS5rmqviTfrOkN5rO5ceKAMRZCRFc=
-github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tidwall/sjson v1.0.4 h1:UcdIRXff12Lpnu3OLtZvnc03g4vH2suXDXhBwBqmzYg=
 github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v0.0.0-20180905170723-c6fd90e432cc/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78=
-github.com/valyala/fasthttp v1.2.0 h1:dzZJf2IuMiclVjdw0kkT+f9u4YdrapbNyGAN47E/qnk=
 github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
-github.com/valyala/quicktemplate v1.0.2 h1:ZeVRKan1W/25u5f9ilDo5HWtdxD+QxR10WrZwxqLM54=
-github.com/valyala/quicktemplate v1.0.2/go.mod h1:KZAB+RlYlfNtBUGQMzIrnE8uuNgD2SbUn5CpZyod0sk=
+github.com/valyala/fasthttp v1.4.0 h1:PuaTGZIw3mjYhhhbVbCQp8aciRZN9YdoB7MGX9Ko76A=
+github.com/valyala/fasthttp v1.4.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
+github.com/valyala/quicktemplate v1.1.1 h1:C58y/wN0FMTi2PR0n3onltemfFabany53j7M6SDDB8k=
+github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
@@ -73,15 +54,18 @@ github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0=
 github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 go.mongodb.org/mongo-driver v1.0.0 h1:KxPRDyfB2xXnDE2My8acoOWBQkfv3tz0SaWTRZjJR0c=
 go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 h1:aUX/1G2gFSs4AsJJg2cL3HuoRhCSCz733FE5GUSuaT4=
-golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
 gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=

+ 30 - 84
frameworks/Go/atreugo/src/handlers/handlers.go

@@ -1,14 +1,13 @@
 package handlers
 
 import (
-	"encoding/json"
 	"log"
 	"sort"
 
 	"atreugo/src/storage"
 	"atreugo/src/templates"
 
-	"github.com/savsgio/atreugo/v7"
+	"github.com/savsgio/atreugo/v8"
 )
 
 func queriesParam(ctx *atreugo.RequestCtx) int {
@@ -23,49 +22,39 @@ func queriesParam(ctx *atreugo.RequestCtx) int {
 
 // JSONHandler . Test 1: JSON serialization
 func JSONHandler(ctx *atreugo.RequestCtx) error {
-	message := MessagePool.Get().(*Message)
+	message := AcquireMessage()
 	message.Message = "Hello, World!"
 
-	ctx.SetContentType("application/json")
+	err := ctx.JSONResponse(message)
 
-	messageBytes, err := json.Marshal(message)
-	if err != nil {
-		return err
-	}
-	_, err = ctx.Write(messageBytes)
+	ReleaseMessage(message)
 
-	MessagePool.Put(message)
 	return err
 }
 
 // DBHandler . Test 2: Single database query
-func DBHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+func DBHandler(db storage.DB) atreugo.View {
 	return func(ctx *atreugo.RequestCtx) error {
-		world := storage.WorldPool.Get().(*storage.World)
+		world := storage.AcquireWorld()
 
 		if err := db.GetOneRandomWorld(world); err != nil {
 			return err
 		}
 
-		ctx.SetContentType("application/json")
+		err := ctx.JSONResponse(world)
 
-		worldBytes, err := json.Marshal(world)
-		if err != nil {
-			return err
-		}
-		_, err = ctx.Write(worldBytes)
+		storage.ReleaseWorld(world)
 
-		storage.WorldPool.Put(world)
 		return err
 	}
 }
 
 // QueriesHandler . Test 3: Multiple database queries
-func QueriesHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+func QueriesHandler(db storage.DB) atreugo.View {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
 
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
 		var err error
 		for i := 0; i < queries; i++ {
@@ -74,46 +63,26 @@ func QueriesHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			}
 		}
 
-		ctx.SetContentType("application/json")
-		worldsBytes, err := json.Marshal(worlds)
-		if err != nil {
-			return err
-		}
-		_, err = ctx.Write(worldsBytes)
+		err = ctx.JSONResponse(worlds)
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}
 }
 
 // FortuneHandler . Test 4: Fortunes
-func FortuneHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+func FortuneHandler(db storage.DB) atreugo.View {
 	return func(ctx *atreugo.RequestCtx) error {
 		fortunes, err := db.GetFortunes()
 		if err != nil {
 			return err
 		}
-		fortunes = append(fortunes, templates.Fortune{Message: "Additional fortune added at request time."})
 
-		sort.Slice(fortunes, func(i, j int) bool {
-			return fortunes[i].Message < fortunes[j].Message
-		})
-
-		ctx.SetContentType("text/html; charset=utf-8")
-		return templates.FortuneTemplate.Execute(ctx, fortunes)
-	}
-}
+		newFortune := templates.AcquireFortune()
+		newFortune.Message = "Additional fortune added at request time."
 
-// FortuneHandlerPool . Test 4: Fortunes
-func FortuneHandlerPool(db storage.DB) func(ctx *atreugo.RequestCtx) error {
-	return func(ctx *atreugo.RequestCtx) error {
-		fortunes, err := db.GetFortunesPool()
-		if err != nil {
-			return err
-		}
-		fortunes = append(fortunes, templates.Fortune{Message: "Additional fortune added at request time."})
+		fortunes = append(fortunes, *newFortune)
 
 		sort.Slice(fortunes, func(i, j int) bool {
 			return fortunes[i].Message < fortunes[j].Message
@@ -124,41 +93,25 @@ func FortuneHandlerPool(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			return err
 		}
 
-		fortunes = fortunes[:0]
-		templates.FortunesPool.Put(fortunes)
+		templates.ReleaseFortune(newFortune)
+		templates.ReleaseFortunes(fortunes)
 
 		return nil
 	}
 }
 
 // FortuneQuickHandler . Test 4: Fortunes
-func FortuneQuickHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+func FortuneQuickHandler(db storage.DB) atreugo.View {
 	return func(ctx *atreugo.RequestCtx) error {
 		fortunes, err := db.GetFortunes()
 		if err != nil {
 			return err
 		}
-		fortunes = append(fortunes, templates.Fortune{Message: "Additional fortune added at request time."})
 
-		sort.Slice(fortunes, func(i, j int) bool {
-			return fortunes[i].Message < fortunes[j].Message
-		})
-
-		ctx.SetContentType("text/html; charset=utf-8")
-		templates.WriteFortunePage(ctx, fortunes)
+		newFortune := templates.AcquireFortune()
+		newFortune.Message = "Additional fortune added at request time."
 
-		return nil
-	}
-}
-
-// FortuneQuickHandlerPool . Test 4: Fortunes
-func FortuneQuickHandlerPool(db storage.DB) func(ctx *atreugo.RequestCtx) error {
-	return func(ctx *atreugo.RequestCtx) error {
-		fortunes, err := db.GetFortunesPool()
-		if err != nil {
-			return err
-		}
-		fortunes = append(fortunes, templates.Fortune{Message: "Additional fortune added at request time."})
+		fortunes = append(fortunes, *newFortune)
 
 		sort.Slice(fortunes, func(i, j int) bool {
 			return fortunes[i].Message < fortunes[j].Message
@@ -167,20 +120,21 @@ func FortuneQuickHandlerPool(db storage.DB) func(ctx *atreugo.RequestCtx) error
 		ctx.SetContentType("text/html; charset=utf-8")
 		templates.WriteFortunePage(ctx, fortunes)
 
-		fortunes = fortunes[:0]
-		templates.FortunesPool.Put(fortunes)
+		templates.ReleaseFortune(newFortune)
+		templates.ReleaseFortunes(fortunes)
 
 		return nil
 	}
 }
 
 // UpdateHandler . Test 5: Database updates
-func UpdateHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
+func UpdateHandler(db storage.DB) atreugo.View {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
+
 		var err error
 
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
@@ -192,15 +146,9 @@ func UpdateHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			return err
 		}
 
-		ctx.SetContentType("application/json")
-		worldsBytes, err := json.Marshal(worlds)
-		if err != nil {
-			return err
-		}
-		_, err = ctx.Write(worldsBytes)
+		err = ctx.JSONResponse(worlds)
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}
@@ -208,7 +156,5 @@ func UpdateHandler(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 
 // PlaintextHandler . Test 6: Plaintext
 func PlaintextHandler(ctx *atreugo.RequestCtx) error {
-	ctx.SetContentType("text/plain")
-	_, err := ctx.WriteString("Hello, World!")
-	return err
+	return ctx.TextResponse("Hello, World!")
 }

+ 25 - 20
frameworks/Go/atreugo/src/handlers/handlers_easyjson.go

@@ -1,43 +1,50 @@
 package handlers
 
 import (
-	"atreugo/src/storage"
 	"log"
 
-	"github.com/savsgio/atreugo/v7"
+	"atreugo/src/storage"
+
+	"github.com/savsgio/atreugo/v8"
 )
 
 // JSONHandlerEasyJSON . Test 1: JSON serialization
 func JSONHandlerEasyJSON(ctx *atreugo.RequestCtx) error {
-	message := MessagePool.Get().(*Message)
 	ctx.SetContentType("application/json")
+
+	message := AcquireMessage()
 	message.Message = "Hello, World!"
+
 	messageBytes, err := message.MarshalJSON()
 	if err != nil {
 		return err
 	}
+
 	_, err = ctx.Write(messageBytes)
-	MessagePool.Put(message)
+
+	ReleaseMessage(message)
+
 	return err
 }
 
 // DBHandlerEasyJSON . Test 2: Single database query
 func DBHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
-		world := storage.WorldPool.Get().(*storage.World)
+		world := storage.AcquireWorld()
 
 		if err := db.GetOneRandomWorld(world); err != nil {
 			return err
 		}
 
-		ctx.SetContentType("application/json")
 		worldBytes, err := world.MarshalJSON()
 		if err != nil {
 			return err
 		}
+
+		ctx.SetContentType("application/json")
 		_, err = ctx.Write(worldBytes)
 
-		storage.WorldPool.Put(world)
+		storage.ReleaseWorld(world)
 
 		return err
 	}
@@ -47,8 +54,7 @@ func DBHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func QueriesHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
 		var err error
 		for i := 0; i < queries; i++ {
@@ -57,15 +63,15 @@ func QueriesHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			}
 		}
 
-		ctx.SetContentType("application/json")
-		worldsBytes, err := storage.Worlds(worlds).MarshalJSON()
+		worldsBytes, err := worlds.MarshalJSON()
 		if err != nil {
 			return err
 		}
+
+		ctx.SetContentType("application/json")
 		_, err = ctx.Write(worldsBytes)
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}
@@ -75,10 +81,9 @@ func QueriesHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func UpdateHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-		var err error
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
+		var err error
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 				log.Println(err)
@@ -89,15 +94,15 @@ func UpdateHandlerEasyJSON(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			return err
 		}
 
-		ctx.SetContentType("application/json")
-		worldsBytes, err := storage.Worlds(worlds).MarshalJSON()
+		worldsBytes, err := worlds.MarshalJSON()
 		if err != nil {
 			return err
 		}
+
+		ctx.SetContentType("application/json")
 		_, err = ctx.Write(worldsBytes)
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}

+ 13 - 16
frameworks/Go/atreugo/src/handlers/handlers_gojay.go

@@ -3,29 +3,29 @@ package handlers
 import (
 	"log"
 
-	"github.com/francoispqt/gojay"
-
 	"atreugo/src/storage"
 
-	"github.com/savsgio/atreugo/v7"
+	"github.com/francoispqt/gojay"
+	"github.com/savsgio/atreugo/v8"
 )
 
 // JSONHandlerGoJay . Test 1: JSON serialization
 func JSONHandlerGoJay(ctx *atreugo.RequestCtx) error {
-	message := MessagePool.Get().(*Message)
+	message := AcquireMessage()
 	message.Message = "Hello, World!"
 
 	ctx.SetContentType("application/json")
 	err := gojay.NewEncoder(ctx).Encode(message)
 
-	MessagePool.Put(message)
+	ReleaseMessage(message)
+
 	return err
 }
 
 // DBHandlerGoJay . Test 2: Single database query
 func DBHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
-		world := storage.WorldPool.Get().(*storage.World)
+		world := storage.AcquireWorld()
 
 		if err := db.GetOneRandomWorld(world); err != nil {
 			return err
@@ -34,7 +34,8 @@ func DBHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		ctx.SetContentType("application/json")
 		err := gojay.NewEncoder(ctx).Encode(world)
 
-		storage.WorldPool.Put(world)
+		storage.ReleaseWorld(world)
+
 		return err
 	}
 }
@@ -43,8 +44,7 @@ func DBHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func QueriesHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
 		var err error
 		for i := 0; i < queries; i++ {
@@ -56,8 +56,7 @@ func QueriesHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		ctx.SetContentType("application/json")
 		err = gojay.NewEncoder(ctx).EncodeArray(storage.Worlds(worlds))
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}
@@ -67,10 +66,9 @@ func QueriesHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func UpdateHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-		var err error
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
+		var err error
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 				log.Println(err)
@@ -84,8 +82,7 @@ func UpdateHandlerGoJay(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		ctx.SetContentType("application/json")
 		err = gojay.NewEncoder(ctx).EncodeArray(storage.Worlds(worlds))
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}

+ 16 - 17
frameworks/Go/atreugo/src/handlers/handlers_sjson.go

@@ -1,15 +1,16 @@
 package handlers
 
 import (
-	"atreugo/src/storage"
 	"log"
 
-	"github.com/savsgio/atreugo/v7"
+	"atreugo/src/storage"
+
+	"github.com/savsgio/atreugo/v8"
 )
 
 // JSONHandlerSJson . Test 1: JSON serialization
 func JSONHandlerSJson(ctx *atreugo.RequestCtx) error {
-	message := MessagePool.Get().(*Message)
+	message := AcquireMessage()
 	message.Message = "Hello, World!"
 
 	ctx.SetContentType("application/json")
@@ -18,14 +19,15 @@ func JSONHandlerSJson(ctx *atreugo.RequestCtx) error {
 		_, err = ctx.Write(data)
 	}
 
-	MessagePool.Put(message)
+	ReleaseMessage(message)
+
 	return err
 }
 
 // DBHandlerSJson . Test 2: Single database query
 func DBHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
-		world := storage.WorldPool.Get().(*storage.World)
+		world := storage.AcquireWorld()
 
 		if err := db.GetOneRandomWorld(world); err != nil {
 			return err
@@ -37,7 +39,8 @@ func DBHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 			_, err = ctx.Write(data)
 		}
 
-		storage.WorldPool.Put(world)
+		storage.ReleaseWorld(world)
+
 		return err
 	}
 }
@@ -46,8 +49,7 @@ func DBHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func QueriesHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
 		var err error
 		for i := 0; i < queries; i++ {
@@ -57,13 +59,12 @@ func QueriesHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		}
 
 		ctx.SetContentType("application/json")
-		data, err := storage.Worlds(worlds).MarshalSJSON()
+		data, err := worlds.MarshalSJSON()
 		if err == nil {
 			_, err = ctx.Write(data)
 		}
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}
@@ -73,10 +74,9 @@ func QueriesHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 func UpdateHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 	return func(ctx *atreugo.RequestCtx) error {
 		queries := queriesParam(ctx)
-		var err error
-
-		worlds := storage.WorldsPool.Get().([]storage.World)[:queries]
+		worlds := storage.AcquireWorlds()[:queries]
 
+		var err error
 		for i := 0; i < queries; i++ {
 			if err = db.GetOneRandomWorld(&worlds[i]); err != nil {
 				log.Println(err)
@@ -88,13 +88,12 @@ func UpdateHandlerSJson(db storage.DB) func(ctx *atreugo.RequestCtx) error {
 		}
 
 		ctx.SetContentType("application/json")
-		data, err := storage.Worlds(worlds).MarshalSJSON()
+		data, err := worlds.MarshalSJSON()
 		if err == nil {
 			_, err = ctx.Write(data)
 		}
 
-		worlds = worlds[:0]
-		storage.WorldsPool.Put(worlds)
+		storage.ReleaseWorlds(worlds)
 
 		return err
 	}

+ 21 - 14
frameworks/Go/atreugo/src/handlers/message.go

@@ -12,6 +12,26 @@ type Message struct {
 	Message string `json:"message"`
 }
 
+var messageJSONStr = []byte(`{"message": ""}`)
+
+// MessagePool ...
+var MessagePool = sync.Pool{
+	New: func() interface{} {
+		return new(Message)
+	},
+}
+
+// AcquireMessage returns new message from pool
+func AcquireMessage() *Message {
+	return MessagePool.Get().(*Message)
+}
+
+// ReleaseMessage resets the message and return it to the pool
+func ReleaseMessage(m *Message) {
+	m.Message = ""
+	MessagePool.Put(m)
+}
+
 // MarshalJSONObject encodes the message as JSON
 func (m *Message) MarshalJSONObject(dec *gojay.Encoder) {
 	dec.AddStringKey("message", m.Message)
@@ -24,18 +44,5 @@ func (m *Message) IsNil() bool {
 
 // MarshalSJSON marshals the object as json
 func (m Message) MarshalSJSON() ([]byte, error) {
-	return sjson.SetBytesOptions([]byte(`{"message": ""}`), "message", m.Message, &sjson.Options{Optimistic: true})
-	// &sjson.Options{Optimistic: true}
-}
-
-// MessagePool *sync.Pool
-var MessagePool *sync.Pool
-
-// InitMessagePool ()
-func InitMessagePool() {
-	MessagePool = &sync.Pool{
-		New: func() interface{} {
-			return &Message{}
-		},
-	}
+	return sjson.SetBytesOptions(messageJSONStr, "message", m.Message, &sjson.Options{Optimistic: true})
 }

+ 7 - 13
frameworks/Go/atreugo/src/handlers/message_easyjson.go

@@ -4,7 +4,6 @@ package handlers
 
 import (
 	json "encoding/json"
-
 	easyjson "github.com/mailru/easyjson"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jwriter "github.com/mailru/easyjson/jwriter"
@@ -18,7 +17,7 @@ var (
 	_ easyjson.Marshaler
 )
 
-func easyjson89aae3efDecodeGoStdSrc(in *jlexer.Lexer, out *Message) {
+func easyjson4086215fDecodeAtreugoSrcHandlers(in *jlexer.Lexer, out *Message) {
 	isTopLevel := in.IsStart()
 	if in.IsNull() {
 		if isTopLevel {
@@ -49,18 +48,13 @@ func easyjson89aae3efDecodeGoStdSrc(in *jlexer.Lexer, out *Message) {
 		in.Consumed()
 	}
 }
-func easyjson89aae3efEncodeGoStdSrc(out *jwriter.Writer, in Message) {
+func easyjson4086215fEncodeAtreugoSrcHandlers(out *jwriter.Writer, in Message) {
 	out.RawByte('{')
 	first := true
 	_ = first
 	{
 		const prefix string = ",\"message\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix[1:])
 		out.String(string(in.Message))
 	}
 	out.RawByte('}')
@@ -69,23 +63,23 @@ func easyjson89aae3efEncodeGoStdSrc(out *jwriter.Writer, in Message) {
 // MarshalJSON supports json.Marshaler interface
 func (v Message) MarshalJSON() ([]byte, error) {
 	w := jwriter.Writer{}
-	easyjson89aae3efEncodeGoStdSrc(&w, v)
+	easyjson4086215fEncodeAtreugoSrcHandlers(&w, v)
 	return w.Buffer.BuildBytes(), w.Error
 }
 
 // MarshalEasyJSON supports easyjson.Marshaler interface
 func (v Message) MarshalEasyJSON(w *jwriter.Writer) {
-	easyjson89aae3efEncodeGoStdSrc(w, v)
+	easyjson4086215fEncodeAtreugoSrcHandlers(w, v)
 }
 
 // UnmarshalJSON supports json.Unmarshaler interface
 func (v *Message) UnmarshalJSON(data []byte) error {
 	r := jlexer.Lexer{Data: data}
-	easyjson89aae3efDecodeGoStdSrc(&r, v)
+	easyjson4086215fDecodeAtreugoSrcHandlers(&r, v)
 	return r.Error()
 }
 
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 func (v *Message) UnmarshalEasyJSON(l *jlexer.Lexer) {
-	easyjson89aae3efDecodeGoStdSrc(l, v)
+	easyjson4086215fDecodeAtreugoSrcHandlers(l, v)
 }

+ 26 - 34
frameworks/Go/atreugo/src/main.go

@@ -3,26 +3,17 @@ package main
 import (
 	"flag"
 	"log"
-	"net"
 	"runtime"
-
-	"github.com/savsgio/atreugo/v7"
+	"strconv"
+	"strings"
 
 	"atreugo/src/handlers"
 	"atreugo/src/storage"
-	"atreugo/src/templates"
-)
 
-func initPools() {
-	handlers.InitMessagePool()
-	templates.InitFortunesPool()
-	storage.InitWorldPool()
-	storage.InitWorldsPool()
-}
+	"github.com/savsgio/atreugo/v8"
+)
 
 func main() {
-	initPools()
-
 	// init flags
 	bindHost := flag.String("bind", ":8080", "set bind host")
 	prefork := flag.Bool("prefork", false, "use prefork")
@@ -35,22 +26,22 @@ func main() {
 	flag.Parse()
 
 	// init database with appropriate driver
-	db, err := storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU()*4)
+	dbMaxConnectionCount := runtime.NumCPU() * 4
+	if *child {
+		dbMaxConnectionCount = runtime.NumCPU()
+	}
+
+	db, err := storage.InitDB(*dbDriver, *dbConnectionString, dbMaxConnectionCount)
 	if err != nil {
 		log.Fatal(err)
 	}
-	if *child {
-		db, err = storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU())
-		if err != nil {
-			log.Fatal(err)
-		}
-	}
 
 	// init json encoders
-	var jsonHandler func(ctx *atreugo.RequestCtx) error
-	var dbHandler func(ctx *atreugo.RequestCtx) error
-	var queriesHandler func(ctx *atreugo.RequestCtx) error
-	var updateHandler func(ctx *atreugo.RequestCtx) error
+	var jsonHandler atreugo.View
+	var dbHandler atreugo.View
+	var queriesHandler atreugo.View
+	var updateHandler atreugo.View
+
 	switch *jsonEncoder {
 	case "easyjson":
 		jsonHandler = handlers.JSONHandlerEasyJSON
@@ -74,8 +65,14 @@ func main() {
 		updateHandler = handlers.UpdateHandler(db)
 	}
 
+	addr := strings.Split(*bindHost, ":")
+	host := addr[0]
+	port, _ := strconv.Atoi(addr[1])
+
 	// init atreugo server
 	server := atreugo.New(&atreugo.Config{
+		Host:     host,
+		Port:     port,
 		Compress: false,
 	})
 
@@ -84,27 +81,22 @@ func main() {
 	server.Path("GET", "/json", jsonHandler)
 	if db != nil {
 		defer db.Close()
-		server.Path("GET", "/fortune", handlers.FortuneHandlerPool(db))
-		server.Path("GET", "/fortune-quick", handlers.FortuneQuickHandlerPool(db))
+		server.Path("GET", "/fortune", handlers.FortuneHandler(db))
+		server.Path("GET", "/fortune-quick", handlers.FortuneQuickHandler(db))
 		server.Path("GET", "/db", dbHandler)
 		server.Path("GET", "/queries", queriesHandler)
 		server.Path("GET", "/update", updateHandler)
 	}
 
 	// check for prefork
-	var listener net.Listener
 	if *prefork {
-		listener, err = doPrefork(*child, *bindHost)
+		ln, err := doPrefork(*child, *bindHost)
 		if err != nil {
 			log.Fatal(err)
 		}
+		log.Fatal(server.Serve(ln))
 	} else {
-		listener, err = net.Listen("tcp4", *bindHost)
-		if err != nil {
-			log.Fatal(err)
-		}
 		runtime.GOMAXPROCS(runtime.NumCPU())
+		log.Fatal(server.ListenAndServe())
 	}
-
-	log.Fatal(server.Serve(listener))
 }

+ 2 - 3
frameworks/Go/atreugo/src/storage/db.go

@@ -21,9 +21,8 @@ const (
 type DB interface {
 	// GetOneRandomWorld() (World, error)
 	GetOneRandomWorld(*World) error
-	UpdateWorlds([]World) error
-	GetFortunes() ([]templates.Fortune, error)
-	GetFortunesPool() ([]templates.Fortune, error)
+	UpdateWorlds(Worlds) error
+	GetFortunes() (templates.Fortunes, error)
 	Close()
 }
 

+ 11 - 38
frameworks/Go/atreugo/src/storage/mongo.go

@@ -1,13 +1,14 @@
 package storage
 
 import (
-	"atreugo/src/templates"
 	"context"
 	"fmt"
 	"log"
 	"math/rand"
 	"time"
 
+	"atreugo/src/templates"
+
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo/options"
 	"go.mongodb.org/mongo-driver/mongo/readpref"
@@ -74,7 +75,7 @@ func (m Mongo) GetOneRandomWorld(w *World) error {
 }
 
 // UpdateWorlds updates some number of worlds entries, passed as arg
-func (m Mongo) UpdateWorlds(selectedWorlds []World) error {
+func (m Mongo) UpdateWorlds(selectedWorlds Worlds) error {
 	for _, selectedWorld := range selectedWorlds {
 		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 		defer cancel()
@@ -93,10 +94,10 @@ func (m Mongo) UpdateWorlds(selectedWorlds []World) error {
 }
 
 // GetFortunes selects all fortunes from table
-func (m Mongo) GetFortunes() ([]templates.Fortune, error) {
-	fortunes := make([]templates.Fortune, 0, 16)
+func (m Mongo) GetFortunes() (templates.Fortunes, error) {
+	fortunes := templates.AcquireFortunes()
 
-	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 	defer cancel()
 
 	cur, err := m.fortunes.Find(ctx, bson.M{})
@@ -105,46 +106,18 @@ func (m Mongo) GetFortunes() ([]templates.Fortune, error) {
 	}
 	defer cur.Close(ctx)
 
-	var fortune templates.Fortune
+	fortune := templates.AcquireFortune()
+
 	for cur.Next(context.Background()) {
-		err = cur.Decode(&fortune)
-		log.Println(fortune)
+		err = cur.Decode(fortune)
 		if err != nil {
 			return fortunes, err
 		}
-		fortunes = append(fortunes, fortune)
-	}
-
-	log.Println(fortunes)
-
-	if err := cur.Err(); err != nil {
-		return fortunes, err
+		fortunes = append(fortunes, *fortune)
 	}
 
-	return fortunes, nil
-}
-
-// GetFortunesPool selects all fortunes from table
-func (m Mongo) GetFortunesPool() ([]templates.Fortune, error) {
-	fortunes := templates.FortunesPool.Get().([]templates.Fortune)
+	templates.ReleaseFortune(fortune)
 
-	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-	defer cancel()
-
-	cur, err := m.fortunes.Find(ctx, bson.M{})
-	if err != nil {
-		return fortunes, err
-	}
-	defer cur.Close(ctx)
-
-	var fortune templates.Fortune
-	for cur.Next(context.Background()) {
-		err = cur.Decode(&fortune)
-		if err != nil {
-			return fortunes, err
-		}
-		fortunes = append(fortunes, fortune)
-	}
 	if err := cur.Err(); err != nil {
 		return fortunes, err
 	}

+ 7 - 24
frameworks/Go/atreugo/src/storage/pgx.go

@@ -75,7 +75,7 @@ func (psql PGX) GetOneRandomWorld(w *World) error {
 }
 
 // UpdateWorlds updates some number of worlds entries, passed as arg
-func (psql PGX) UpdateWorlds(selectedWorlds []World) error {
+func (psql PGX) UpdateWorlds(selectedWorlds Worlds) error {
 	// against deadlocks
 	sort.Slice(selectedWorlds, func(i, j int) bool {
 		return selectedWorlds[i].ID < selectedWorlds[j].ID
@@ -103,42 +103,25 @@ func (psql PGX) UpdateWorlds(selectedWorlds []World) error {
 }
 
 // GetFortunes selects all fortunes from table
-func (psql PGX) GetFortunes() ([]templates.Fortune, error) {
+func (psql PGX) GetFortunes() (templates.Fortunes, error) {
 	rows, err := psql.db.Query("fortuneStmt")
 	defer rows.Close()
 	if err != nil {
 		return nil, fmt.Errorf("can't query fortunes: %s", err)
 	}
 
-	fortunes := make([]templates.Fortune, 0, 16)
-	var fortune templates.Fortune
-	for rows.Next() {
-		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
-			log.Printf("Can't scan fortune: %s\n", err)
-		}
-		fortunes = append(fortunes, fortune)
-	}
-
-	return fortunes, nil
-}
+	fortunes := templates.AcquireFortunes()
+	fortune := templates.AcquireFortune()
 
-// GetFortunesPool selects all fortunes from table
-func (psql PGX) GetFortunesPool() ([]templates.Fortune, error) {
-	rows, err := psql.db.Query("fortuneStmt")
-	defer rows.Close()
-	if err != nil {
-		return nil, fmt.Errorf("can't query fortunes: %s", err)
-	}
-
-	fortunes := templates.FortunesPool.Get().([]templates.Fortune)
-	var fortune templates.Fortune
 	for rows.Next() {
 		if err = rows.Scan(&fortune.ID, &fortune.Message); err != nil {
 			log.Printf("Can't scan fortune: %s\n", err)
 		}
-		fortunes = append(fortunes, fortune)
+		fortunes = append(fortunes, *fortune)
 	}
 
+	templates.ReleaseFortune(fortune)
+
 	return fortunes, nil
 }
 

+ 40 - 25
frameworks/Go/atreugo/src/storage/world.go

@@ -7,12 +7,33 @@ import (
 	"github.com/tidwall/sjson"
 )
 
+var worldJSONStr = []byte(`{"id": 0, "randomNumber": 0}`)
+
 //easyjson:json
 type World struct {
 	ID           int `json:"id"`
 	RandomNumber int `json:"randomnumber"`
 }
 
+// WorldPool ...
+var WorldPool = sync.Pool{
+	New: func() interface{} {
+		return new(World)
+	},
+}
+
+// AcquireWorld returns new world from pool
+func AcquireWorld() *World {
+	return WorldPool.Get().(*World)
+}
+
+// ReleaseWorld resets the world and return it to the pool
+func ReleaseWorld(w *World) {
+	w.ID = 0
+	w.RandomNumber = 0
+	WorldPool.Put(w)
+}
+
 // MarshalJSONObject encodes the world as JSON
 func (w *World) MarshalJSONObject(dec *gojay.Encoder) {
 	dec.AddIntKey("id", w.ID)
@@ -27,13 +48,31 @@ func (w *World) IsNil() bool {
 
 // MarshalSJSON marshals the object as json
 func (w World) MarshalSJSON() ([]byte, error) {
-	data, _ := sjson.SetBytesOptions([]byte(`{"id": 0, "randomNumber": 0}`), "id", w.ID, &sjson.Options{Optimistic: true})
+	data, _ := sjson.SetBytesOptions(worldJSONStr, "id", w.ID, &sjson.Options{Optimistic: true})
 	return sjson.SetBytesOptions(data, "randomNumber", w.RandomNumber, &sjson.Options{Optimistic: true, ReplaceInPlace: true})
 }
 
 //easyjson:json
 type Worlds []World
 
+// WorldsPool ...
+var WorldsPool = sync.Pool{
+	New: func() interface{} {
+		return make(Worlds, 0, 512)
+	},
+}
+
+// AcquireWorlds returns new worlds from pool
+func AcquireWorlds() Worlds {
+	return WorldsPool.Get().(Worlds)
+}
+
+// ReleaseWorlds resets the worlds and return it to the pool
+func ReleaseWorlds(w Worlds) {
+	w = w[:0]
+	WorldsPool.Put(w)
+}
+
 // MarshalJSONArray marshals the list of worlds
 func (ws Worlds) MarshalJSONArray(enc *gojay.Encoder) {
 	for _, w := range ws {
@@ -56,27 +95,3 @@ func (ws Worlds) MarshalSJSON() ([]byte, error) {
 
 	return jsonResult, nil
 }
-
-// WorldPool *sync.Pool
-var WorldPool *sync.Pool
-
-// InitWorldPool ()
-func InitWorldPool() {
-	WorldPool = &sync.Pool{
-		New: func() interface{} {
-			return &World{}
-		},
-	}
-}
-
-// WorldsPool *sync.Pool
-var WorldsPool *sync.Pool
-
-// InitWorldsPool ()
-func InitWorldsPool() {
-	WorldsPool = &sync.Pool{
-		New: func() interface{} {
-			return make([]World, 0, 512)
-		},
-	}
-}

+ 14 - 25
frameworks/Go/atreugo/src/storage/world_easyjson.go

@@ -4,7 +4,6 @@ package storage
 
 import (
 	json "encoding/json"
-
 	easyjson "github.com/mailru/easyjson"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jwriter "github.com/mailru/easyjson/jwriter"
@@ -18,7 +17,7 @@ var (
 	_ easyjson.Marshaler
 )
 
-func easyjson4da0dabeDecodeGoStdSrcStorage(in *jlexer.Lexer, out *Worlds) {
+func easyjson4da0dabeDecodeAtreugoSrcStorage(in *jlexer.Lexer, out *Worlds) {
 	isTopLevel := in.IsStart()
 	if in.IsNull() {
 		in.Skip()
@@ -46,7 +45,7 @@ func easyjson4da0dabeDecodeGoStdSrcStorage(in *jlexer.Lexer, out *Worlds) {
 		in.Consumed()
 	}
 }
-func easyjson4da0dabeEncodeGoStdSrcStorage(out *jwriter.Writer, in Worlds) {
+func easyjson4da0dabeEncodeAtreugoSrcStorage(out *jwriter.Writer, in Worlds) {
 	if in == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 {
 		out.RawString("null")
 	} else {
@@ -64,27 +63,27 @@ func easyjson4da0dabeEncodeGoStdSrcStorage(out *jwriter.Writer, in Worlds) {
 // MarshalJSON supports json.Marshaler interface
 func (v Worlds) MarshalJSON() ([]byte, error) {
 	w := jwriter.Writer{}
-	easyjson4da0dabeEncodeGoStdSrcStorage(&w, v)
+	easyjson4da0dabeEncodeAtreugoSrcStorage(&w, v)
 	return w.Buffer.BuildBytes(), w.Error
 }
 
 // MarshalEasyJSON supports easyjson.Marshaler interface
 func (v Worlds) MarshalEasyJSON(w *jwriter.Writer) {
-	easyjson4da0dabeEncodeGoStdSrcStorage(w, v)
+	easyjson4da0dabeEncodeAtreugoSrcStorage(w, v)
 }
 
 // UnmarshalJSON supports json.Unmarshaler interface
 func (v *Worlds) UnmarshalJSON(data []byte) error {
 	r := jlexer.Lexer{Data: data}
-	easyjson4da0dabeDecodeGoStdSrcStorage(&r, v)
+	easyjson4da0dabeDecodeAtreugoSrcStorage(&r, v)
 	return r.Error()
 }
 
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 func (v *Worlds) UnmarshalEasyJSON(l *jlexer.Lexer) {
-	easyjson4da0dabeDecodeGoStdSrcStorage(l, v)
+	easyjson4da0dabeDecodeAtreugoSrcStorage(l, v)
 }
-func easyjson4da0dabeDecodeGoStdSrcStorage1(in *jlexer.Lexer, out *World) {
+func easyjson4da0dabeDecodeAtreugoSrcStorage1(in *jlexer.Lexer, out *World) {
 	isTopLevel := in.IsStart()
 	if in.IsNull() {
 		if isTopLevel {
@@ -117,28 +116,18 @@ func easyjson4da0dabeDecodeGoStdSrcStorage1(in *jlexer.Lexer, out *World) {
 		in.Consumed()
 	}
 }
-func easyjson4da0dabeEncodeGoStdSrcStorage1(out *jwriter.Writer, in World) {
+func easyjson4da0dabeEncodeAtreugoSrcStorage1(out *jwriter.Writer, in World) {
 	out.RawByte('{')
 	first := true
 	_ = first
 	{
 		const prefix string = ",\"id\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix[1:])
 		out.Int(int(in.ID))
 	}
 	{
 		const prefix string = ",\"randomnumber\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix)
 		out.Int(int(in.RandomNumber))
 	}
 	out.RawByte('}')
@@ -147,23 +136,23 @@ func easyjson4da0dabeEncodeGoStdSrcStorage1(out *jwriter.Writer, in World) {
 // MarshalJSON supports json.Marshaler interface
 func (v World) MarshalJSON() ([]byte, error) {
 	w := jwriter.Writer{}
-	easyjson4da0dabeEncodeGoStdSrcStorage1(&w, v)
+	easyjson4da0dabeEncodeAtreugoSrcStorage1(&w, v)
 	return w.Buffer.BuildBytes(), w.Error
 }
 
 // MarshalEasyJSON supports easyjson.Marshaler interface
 func (v World) MarshalEasyJSON(w *jwriter.Writer) {
-	easyjson4da0dabeEncodeGoStdSrcStorage1(w, v)
+	easyjson4da0dabeEncodeAtreugoSrcStorage1(w, v)
 }
 
 // UnmarshalJSON supports json.Unmarshaler interface
 func (v *World) UnmarshalJSON(data []byte) error {
 	r := jlexer.Lexer{Data: data}
-	easyjson4da0dabeDecodeGoStdSrcStorage1(&r, v)
+	easyjson4da0dabeDecodeAtreugoSrcStorage1(&r, v)
 	return r.Error()
 }
 
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 func (v *World) UnmarshalEasyJSON(l *jlexer.Lexer) {
-	easyjson4da0dabeDecodeGoStdSrcStorage1(l, v)
+	easyjson4da0dabeDecodeAtreugoSrcStorage1(l, v)
 }

+ 38 - 10
frameworks/Go/atreugo/src/templates/fortune.go

@@ -41,14 +41,42 @@ type Fortune struct {
 	Message string `json:"message,omitempty"`
 }
 
-// FortunesPool *sync.Pool
-var FortunesPool *sync.Pool
-
-// InitFortunesPool ()
-func InitFortunesPool() {
-	FortunesPool = &sync.Pool{
-		New: func() interface{} {
-			return make([]Fortune, 0, 16)
-		},
-	}
+// FortunePool ...
+var FortunePool = &sync.Pool{
+	New: func() interface{} {
+		return new(Fortune)
+	},
+}
+
+// AcquireFortune returns new message from pool
+func AcquireFortune() *Fortune {
+	return FortunePool.Get().(*Fortune)
+}
+
+// ReleaseFortune resets the message and return it to the pool
+func ReleaseFortune(f *Fortune) {
+	f.ID = 0
+	f.Message = ""
+	FortunePool.Put(f)
+}
+
+// Fortunes ...
+type Fortunes []Fortune
+
+// FortunesPool ...
+var FortunesPool = sync.Pool{
+	New: func() interface{} {
+		return make(Fortunes, 0, 16)
+	},
+}
+
+// AcquireFortunes returns new fortunes from pool
+func AcquireFortunes() Fortunes {
+	return FortunesPool.Get().(Fortunes)
+}
+
+// ReleaseFortunes resets the fortunes and return it to the pool
+func ReleaseFortunes(f Fortunes) {
+	f = f[:0]
+	FortunesPool.Put(f)
 }

+ 8 - 12
frameworks/Go/atreugo/src/templates/fortune_easyjson.go

@@ -17,7 +17,7 @@ var (
 	_ easyjson.Marshaler
 )
 
-func easyjson2f1218d5DecodeGoStdSrcTemplates(in *jlexer.Lexer, out *Fortune) {
+func easyjson2f1218d5DecodeAtreugoSrcTemplates(in *jlexer.Lexer, out *Fortune) {
 	isTopLevel := in.IsStart()
 	if in.IsNull() {
 		if isTopLevel {
@@ -50,18 +50,14 @@ func easyjson2f1218d5DecodeGoStdSrcTemplates(in *jlexer.Lexer, out *Fortune) {
 		in.Consumed()
 	}
 }
-func easyjson2f1218d5EncodeGoStdSrcTemplates(out *jwriter.Writer, in Fortune) {
+func easyjson2f1218d5EncodeAtreugoSrcTemplates(out *jwriter.Writer, in Fortune) {
 	out.RawByte('{')
 	first := true
 	_ = first
 	if in.ID != 0 {
 		const prefix string = ",\"id\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		first = false
+		out.RawString(prefix[1:])
 		out.Int(int(in.ID))
 	}
 	if in.Message != "" {
@@ -80,23 +76,23 @@ func easyjson2f1218d5EncodeGoStdSrcTemplates(out *jwriter.Writer, in Fortune) {
 // MarshalJSON supports json.Marshaler interface
 func (v Fortune) MarshalJSON() ([]byte, error) {
 	w := jwriter.Writer{}
-	easyjson2f1218d5EncodeGoStdSrcTemplates(&w, v)
+	easyjson2f1218d5EncodeAtreugoSrcTemplates(&w, v)
 	return w.Buffer.BuildBytes(), w.Error
 }
 
 // MarshalEasyJSON supports easyjson.Marshaler interface
 func (v Fortune) MarshalEasyJSON(w *jwriter.Writer) {
-	easyjson2f1218d5EncodeGoStdSrcTemplates(w, v)
+	easyjson2f1218d5EncodeAtreugoSrcTemplates(w, v)
 }
 
 // UnmarshalJSON supports json.Unmarshaler interface
 func (v *Fortune) UnmarshalJSON(data []byte) error {
 	r := jlexer.Lexer{Data: data}
-	easyjson2f1218d5DecodeGoStdSrcTemplates(&r, v)
+	easyjson2f1218d5DecodeAtreugoSrcTemplates(&r, v)
 	return r.Error()
 }
 
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 func (v *Fortune) UnmarshalEasyJSON(l *jlexer.Lexer) {
-	easyjson2f1218d5DecodeGoStdSrcTemplates(l, v)
+	easyjson2f1218d5DecodeAtreugoSrcTemplates(l, v)
 }

+ 1 - 1
frameworks/Go/atreugo/src/templates/fortunes.qtpl

@@ -1,4 +1,4 @@
-{% func FortunePage(rows []Fortune) %}<!DOCTYPE html>
+{% func FortunePage(rows Fortunes) %}<!DOCTYPE html>
 <html>
 <head>
 <title>Fortunes</title>

+ 21 - 21
frameworks/Go/atreugo/src/templates/fortunes.qtpl.go

@@ -1,4 +1,4 @@
-// This file is automatically generated by qtc from "fortunes.qtpl".
+// Code generated by qtc from "fortunes.qtpl". DO NOT EDIT.
 // See https://github.com/valyala/quicktemplate for details.
 
 //line fortunes.qtpl:1
@@ -18,8 +18,8 @@ var (
 )
 
 //line fortunes.qtpl:1
-func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
-	//line fortunes.qtpl:1
+func StreamFortunePage(qw422016 *qt422016.Writer, rows Fortunes) {
+//line fortunes.qtpl:1
 	qw422016.N().S(`<!DOCTYPE html>
 <html>
 <head>
@@ -29,23 +29,23 @@ func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
 <table>
 <tr><th>id</th><th>message</th></tr>
 `)
-	//line fortunes.qtpl:9
+//line fortunes.qtpl:9
 	for _, r := range rows {
-		//line fortunes.qtpl:9
+//line fortunes.qtpl:9
 		qw422016.N().S(`
 <tr><td>`)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().D(int(r.ID))
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().S(`</td><td>`)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.E().S(r.Message)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().S(`</td></tr>
 `)
-		//line fortunes.qtpl:11
+//line fortunes.qtpl:11
 	}
-	//line fortunes.qtpl:11
+//line fortunes.qtpl:11
 	qw422016.N().S(`
 </table>
 </body>
@@ -55,27 +55,27 @@ func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
 }
 
 //line fortunes.qtpl:15
-func WriteFortunePage(qq422016 qtio422016.Writer, rows []Fortune) {
-	//line fortunes.qtpl:15
+func WriteFortunePage(qq422016 qtio422016.Writer, rows Fortunes) {
+//line fortunes.qtpl:15
 	qw422016 := qt422016.AcquireWriter(qq422016)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	StreamFortunePage(qw422016, rows)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qt422016.ReleaseWriter(qw422016)
 //line fortunes.qtpl:15
 }
 
 //line fortunes.qtpl:15
-func FortunePage(rows []Fortune) string {
-	//line fortunes.qtpl:15
+func FortunePage(rows Fortunes) string {
+//line fortunes.qtpl:15
 	qb422016 := qt422016.AcquireByteBuffer()
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	WriteFortunePage(qb422016, rows)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qs422016 := string(qb422016.B)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qt422016.ReleaseByteBuffer(qb422016)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	return qs422016
 //line fortunes.qtpl:15
 }