From ec0eff7911c1e7d1597649df97f39cd9b1c7fd1e Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 5 Aug 2012 12:20:50 +0000 Subject: [PATCH] Skylark: Renderer documentation git-svn-id: svn://ultimatepp.org/upp/trunk@5261 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Skylark/Http.h | 291 +++++++++++----------- uppsrc/Skylark/Renderer.cpp | 166 ++++++------ uppsrc/Skylark/Session.cpp | 2 +- uppsrc/Skylark/Sql.cpp | 160 ++++++------ uppsrc/Skylark/src.tpp/Renderer$en-us.tpp | 154 ++++++++++++ 5 files changed, 469 insertions(+), 304 deletions(-) create mode 100644 uppsrc/Skylark/src.tpp/Renderer$en-us.tpp diff --git a/uppsrc/Skylark/Http.h b/uppsrc/Skylark/Http.h index 26f3b9d12..03e5a59ae 100644 --- a/uppsrc/Skylark/Http.h +++ b/uppsrc/Skylark/Http.h @@ -1,144 +1,147 @@ -void MakeLink(StringBuffer& out, const Vector& part, const Vector& arg); - -class Renderer { -protected: - VectorMap var; - int lang; - - Renderer& Link(const char *id, void (*view)(Http&), const Vector& arg); - const One& GetTemplate(const char *template_name); - -public: - Renderer& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; } - Renderer& operator()(const ValueMap& map); - Renderer& operator()(const char *id, void (*view)(Http&)); - Renderer& operator()(const char *id, void (*view)(Http&), const Value& arg1); - Renderer& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2); - - Renderer& operator()(const Sql& sql); - Renderer& operator()(Fields rec); - Renderer& operator()(const SqlSelect& row_sel); - Renderer& operator()(const char *id, const SqlSelect& sel); - SqlUpdate Update(SqlId table); - SqlInsert Insert(SqlId table); - - Value operator[](const char *id) const { return var.Get(id, Null); } - - String RenderString(const String& template_name); - Value Render(const String& template_name) { return Raw(RenderString(template_name)); } - - Renderer& Render(const char *id, const String& template_name); - - Renderer() { lang = LNG_ENGLISH; } - virtual ~Renderer(); -}; - -class Http : public Renderer { - SkylarkApp& app; - HttpHeader hdr; - - String content; - String viewid; - - Vector arg; - String session_id; - VectorMap session_var; - bool session_dirty; - - String redirect; - int code; - String code_text; - String response; - String content_type; - String request_content_type; - - VectorMap cookies; - - void ParseRequest(const char *s); - void ReadMultiPart(const String& content); - - String SessionFile(const String& sid); - - void LoadSession(); - void SaveSession(); - -public: - Http& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; } - Http& operator()(const ValueMap& map) { Renderer::operator()(map); return *this; } - Http& operator()(const char *id, void (*view)(Http&)) { Renderer::operator()(id, view); return *this; } - Http& operator()(const char *id, void (*view)(Http&), const Value& arg1) { Renderer::operator()(id, view, arg1); return *this; } - Http& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) { Renderer::operator()(id, view, arg1, arg2); return *this; } - - Http& operator()(const Sql& sql) { Renderer::operator()(sql); return *this; } - Http& operator()(Fields rec) { Renderer::operator()(rec); return *this; } - Http& operator()(const SqlSelect& row_sel) { Renderer::operator()(row_sel); return *this; } - Http& operator()(const char *id, const SqlSelect& sel) { Renderer::operator()(id, sel); return *this; } - Http& Render(const char *id, const String& template_name) { Renderer::Render(id, template_name); return *this; } - Value Render(const String& template_name) { return Renderer::Render(template_name); } - - String GetHeader(const char *s) const { return hdr[s]; } - int GetLength() const { return atoi(GetHeader("content-length")); } - - String GetViewId() const { return viewid; } - - Value operator[](const char *id) const { return Renderer::operator[](id); } - int Int(const char *id) const; - - String operator[](int i) const { return i >= 0 && i < arg.GetCount() ? arg[i] : String(); } - int Int(int i) const; - - int GetParamCount() const { return arg.GetCount(); } - - Http& ContentType(const char *s) { content_type = s; return *this; } - - Http& Content(const char *s, const Value& data); - Http& operator<<(const Value& s); - - Http& SetRawCookie(const char *id, const String& value, - Time expires = Null, const char *path = NULL, - const char *domain = NULL, bool secure = false, bool httponly = false); - Http& SetCookie(const char *id, const String& value, - Time expires = Null, const char *path = NULL, - const char *domain = NULL, bool secure = false, bool httponly = false); - - Http& ClearSession(); - Http& SessionSet(const char *id, const Value& value); - - Http& NewIdentity() { SessionSet("__identity__", Null); return *this; } - Http& NewSessionId(); - Http& SetLanguage(int lang); - - Http& Response(int code_, const String& ctext) { code = code_; code_text = ctext; return *this; } - - Http& RenderResult(const char *template_name); - Http& Redirect(const char *url, int code_ = 302) { code = code_; redirect = url; return *this; } - Http& Redirect(void (*view)(Http&), const Vector& arg); - Http& Redirect(void (*view)(Http&)); - Http& Redirect(void (*view)(Http&), const Value& v1); - Http& Redirect(void (*view)(Http&), const Value& v1, const Value& v2); - - Http& Ux(const char *id, const String& text); - Http& UxRender(const char *id, const char *template_name); - Http& UxSet(const char *id, const String& value); - Http& UxRun(const String& js_code); - - String GetResponse() const { return response; } - - void Dispatch(TcpSocket& socket); - - const SkylarkApp& App() const { return app; } - - Http(SkylarkApp& app); -}; - -void RegisterHandler(void (*handler)(Http& http), const char *id, const char *path); - -#define SKYLARK(name, path) void name(Http& http); INITBLOCK { UPP::RegisterHandler(name, #name, path); } void name(Http& http) - -Vector *GetUrlViewLinkParts(const String& id); - -String MakeLink(void (*view)(Http&), const Vector& arg); - -enum { - SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML -}; +void MakeLink(StringBuffer& out, const Vector& part, const Vector& arg); + +class Renderer { +protected: + VectorMap var; + int lang; + + Renderer& Link(const char *id, void (*view)(Http&), const Vector& arg); + const One& GetTemplate(const char *template_name); + +public: + Renderer& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; } + Renderer& operator()(const ValueMap& map); + Renderer& operator()(const char *id, void (*handler)(Http&)); + Renderer& operator()(const char *id, void (*handler)(Http&), const Value& arg1); + Renderer& operator()(const char *id, void (*handler)(Http&), const Value& arg1, const Value& arg2); + + Renderer& operator()(const Sql& sql); + Renderer& operator()(Fields rec); + Renderer& operator()(const SqlSelect& row_sel); + Renderer& operator()(const char *id, const SqlSelect& sel); + + Renderer& SetLanguage(int lang); + + SqlUpdate Update(SqlId table); + SqlInsert Insert(SqlId table); + + Value operator[](const char *id) const { return var.Get(id, Null); } + + String RenderString(const String& template_name); + Value Render(const String& template_name) { return Raw(RenderString(template_name)); } + + Renderer& Render(const char *id, const String& template_name); + + Renderer() { lang = LNG_ENGLISH; } + virtual ~Renderer(); +}; + +class Http : public Renderer { + SkylarkApp& app; + HttpHeader hdr; + + String content; + String viewid; + + Vector arg; + String session_id; + VectorMap session_var; + bool session_dirty; + + String redirect; + int code; + String code_text; + String response; + String content_type; + String request_content_type; + + VectorMap cookies; + + void ParseRequest(const char *s); + void ReadMultiPart(const String& content); + + String SessionFile(const String& sid); + + void LoadSession(); + void SaveSession(); + +public: + Http& operator()(const char *id, const Value& v) { var.Add(id, v); return *this; } + Http& operator()(const ValueMap& map) { Renderer::operator()(map); return *this; } + Http& operator()(const char *id, void (*view)(Http&)) { Renderer::operator()(id, view); return *this; } + Http& operator()(const char *id, void (*view)(Http&), const Value& arg1) { Renderer::operator()(id, view, arg1); return *this; } + Http& operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) { Renderer::operator()(id, view, arg1, arg2); return *this; } + + Http& operator()(const Sql& sql) { Renderer::operator()(sql); return *this; } + Http& operator()(Fields rec) { Renderer::operator()(rec); return *this; } + Http& operator()(const SqlSelect& row_sel) { Renderer::operator()(row_sel); return *this; } + Http& operator()(const char *id, const SqlSelect& sel) { Renderer::operator()(id, sel); return *this; } + Http& Render(const char *id, const String& template_name) { Renderer::Render(id, template_name); return *this; } + Value Render(const String& template_name) { return Renderer::Render(template_name); } + + String GetHeader(const char *s) const { return hdr[s]; } + int GetLength() const { return atoi(GetHeader("content-length")); } + + String GetViewId() const { return viewid; } + + Value operator[](const char *id) const { return Renderer::operator[](id); } + int Int(const char *id) const; + + String operator[](int i) const { return i >= 0 && i < arg.GetCount() ? arg[i] : String(); } + int Int(int i) const; + + int GetParamCount() const { return arg.GetCount(); } + + Http& ContentType(const char *s) { content_type = s; return *this; } + + Http& Content(const char *s, const Value& data); + Http& operator<<(const Value& s); + + Http& SetRawCookie(const char *id, const String& value, + Time expires = Null, const char *path = NULL, + const char *domain = NULL, bool secure = false, bool httponly = false); + Http& SetCookie(const char *id, const String& value, + Time expires = Null, const char *path = NULL, + const char *domain = NULL, bool secure = false, bool httponly = false); + + Http& ClearSession(); + Http& SessionSet(const char *id, const Value& value); + + Http& NewIdentity() { SessionSet("__identity__", Null); return *this; } + Http& NewSessionId(); + Http& SetLanguage(int lang); + + Http& Response(int code_, const String& ctext) { code = code_; code_text = ctext; return *this; } + + Http& RenderResult(const char *template_name); + Http& Redirect(const char *url, int code_ = 302) { code = code_; redirect = url; return *this; } + Http& Redirect(void (*view)(Http&), const Vector& arg); + Http& Redirect(void (*view)(Http&)); + Http& Redirect(void (*view)(Http&), const Value& v1); + Http& Redirect(void (*view)(Http&), const Value& v1, const Value& v2); + + Http& Ux(const char *id, const String& text); + Http& UxRender(const char *id, const char *template_name); + Http& UxSet(const char *id, const String& value); + Http& UxRun(const String& js_code); + + String GetResponse() const { return response; } + + void Dispatch(TcpSocket& socket); + + const SkylarkApp& App() const { return app; } + + Http(SkylarkApp& app); +}; + +void RegisterHandler(void (*handler)(Http& http), const char *id, const char *path); + +#define SKYLARK(name, path) void name(Http& http); INITBLOCK { UPP::RegisterHandler(name, #name, path); } void name(Http& http) + +Vector *GetUrlViewLinkParts(const String& id); + +String MakeLink(void (*view)(Http&), const Vector& arg); + +enum { + SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML +}; diff --git a/uppsrc/Skylark/Renderer.cpp b/uppsrc/Skylark/Renderer.cpp index 3e71bb619..43c38e0ea 100644 --- a/uppsrc/Skylark/Renderer.cpp +++ b/uppsrc/Skylark/Renderer.cpp @@ -1,81 +1,87 @@ -#include "Skylark.h" - -#define LLOG(x) // DLOG(x) -#define LTIMING(x) // RTIMING(x) - -namespace Upp { - -Renderer& Renderer::operator()(const ValueMap& map) -{ - ValueArray v = map.GetValues(); - const Index& k = map.GetKeys(); - for(int i = 0; i < map.GetCount(); i++) - var.Add(k[i], v[i]); - return *this; -} - -Renderer& Renderer::Link(const char *id, void (*view)(Http&), const Vector& arg) -{ - var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"')); - return *this; -} - -Renderer& Renderer::operator()(const char *id, void (*view)(Http&)) -{ - return Link(id, view, Vector()); -} - -Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1) -{ - return Link(id, view, Vector() << arg1); -} - -Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) -{ - return Link(id, view, Vector() << arg1 << arg2); -} - -StaticMutex template_cache_lock; -ArrayMap > template_cache; - -const One& Renderer::GetTemplate(const char *template_name) -{ - LTIMING("GetTemplate"); - StringBuffer s; - { - LTIMING("MakeSignature"); - for(int i = 0; i < var.GetCount(); i++) - s << var.GetKey(i) << ';'; - s << ':' << template_name; - } - if(!SkylarkApp::Config().use_caching) // Templates get overwritten is not cached, MT hazard - s << ';' << Thread::GetCurrentId(); - String sgn = s; - LLOG("Trying to retrieve " << sgn << " from cache"); - Mutex::Lock __(template_cache_lock); - int q = template_cache.Find(sgn); - if(q >= 0 && SkylarkApp::Config().use_caching) - return template_cache[q]; - LLOG("About to compile: " << sgn); - LTIMING("Compile"); - One& exe = q >= 0 ? template_cache[q] : template_cache.Add(sgn); - exe = Compile(GetPreprocessedTemplate(template_name, lang), var.GetIndex()); - return exe; -} - -String Renderer::RenderString(const String& template_name) -{ - return UPP::Render(GetTemplate(template_name), this, var.GetValues()); -} - -Renderer& Renderer::Render(const char *id, const String& template_name) -{ - var.Add(id, Render(template_name)); - return *this; -} - -Renderer::~Renderer() -{ -} - +#include "Skylark.h" + +#define LLOG(x) // DLOG(x) +#define LTIMING(x) // RTIMING(x) + +namespace Upp { + +Renderer& Renderer::operator()(const ValueMap& map) +{ + ValueArray v = map.GetValues(); + const Index& k = map.GetKeys(); + for(int i = 0; i < map.GetCount(); i++) + var.Add(k[i], v[i]); + return *this; +} + +Renderer& Renderer::Link(const char *id, void (*view)(Http&), const Vector& arg) +{ + var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"')); + return *this; +} + +Renderer& Renderer::operator()(const char *id, void (*view)(Http&)) +{ + return Link(id, view, Vector()); +} + +Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1) +{ + return Link(id, view, Vector() << arg1); +} + +Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2) +{ + return Link(id, view, Vector() << arg1 << arg2); +} + +Renderer& Renderer::SetLanguage(int lang_) +{ + lang = lang_; + return *this; +} + +StaticMutex template_cache_lock; +ArrayMap > template_cache; + +const One& Renderer::GetTemplate(const char *template_name) +{ + LTIMING("GetTemplate"); + StringBuffer s; + { + LTIMING("MakeSignature"); + for(int i = 0; i < var.GetCount(); i++) + s << var.GetKey(i) << ';'; + s << ':' << template_name; + } + if(!SkylarkApp::Config().use_caching) // Templates get overwritten is not cached, MT hazard + s << ';' << Thread::GetCurrentId(); + String sgn = s; + LLOG("Trying to retrieve " << sgn << " from cache"); + Mutex::Lock __(template_cache_lock); + int q = template_cache.Find(sgn); + if(q >= 0 && SkylarkApp::Config().use_caching) + return template_cache[q]; + LLOG("About to compile: " << sgn); + LTIMING("Compile"); + One& exe = q >= 0 ? template_cache[q] : template_cache.Add(sgn); + exe = Compile(GetPreprocessedTemplate(template_name, lang), var.GetIndex()); + return exe; +} + +String Renderer::RenderString(const String& template_name) +{ + return UPP::Render(GetTemplate(template_name), this, var.GetValues()); +} + +Renderer& Renderer::Render(const char *id, const String& template_name) +{ + var.Add(id, Render(template_name)); + return *this; +} + +Renderer::~Renderer() +{ +} + }; \ No newline at end of file diff --git a/uppsrc/Skylark/Session.cpp b/uppsrc/Skylark/Session.cpp index 016ede77c..6e5c29aa9 100644 --- a/uppsrc/Skylark/Session.cpp +++ b/uppsrc/Skylark/Session.cpp @@ -168,7 +168,7 @@ Http& Http::NewSessionId() Http& Http::SetLanguage(int lang_) { - lang = lang_; + Renderer::SetLanguage(lang); Upp::SetLanguage(lang_); SessionSet("__lang__", lang); SessionSet("language", ToLower(LNGAsText(lang))); diff --git a/uppsrc/Skylark/Sql.cpp b/uppsrc/Skylark/Sql.cpp index b55181ed4..092c960ad 100644 --- a/uppsrc/Skylark/Sql.cpp +++ b/uppsrc/Skylark/Sql.cpp @@ -1,80 +1,82 @@ -#include "Skylark.h" - -namespace Upp { - -struct sFieldsToRenderer : public FieldOperator { - Renderer& http; - - void Field(const char *name, Ref f) { - http(name, f); - } - - sFieldsToRenderer(Renderer& http) : http(http) {} -}; - -Renderer& Renderer::operator()(Fields rec) -{ - sFieldsToRenderer x(*this); - rec(x); - return *this; -} - -Renderer& Renderer::operator()(const Sql& sql) -{ - int n = sql.GetColumns(); - for(int i = 0; i < n; i++) - (*this)(sql.GetColumnInfo(i).name, sql[i]); - return *this; -} - -Renderer& Renderer::operator()(const SqlSelect& sel) -{ - SqlR sql; - sql * sel; - if(!sql.Fetch()) - throw BadRequestExc(); - return operator()(sql); -} - -Renderer& Renderer::operator()(const char *id, const SqlSelect& sel) -{ - ValueArray list; - ValueMap vm; - SqlR sql; - sql * sel; - while(sql.Fetch(vm)) - list.Add(vm); - return operator()(id, list); -} - -SqlUpdate Renderer::Update(SqlId table) -{ - Vector col = GetSchColumns(~table); - SqlUpdate u(table); - for(int i = 0; i < col.GetCount(); i++) { - String c = col[i]; - int q = var.Find(c); - if(q < 0) - q = var.Find(ToLower(c)); - if(q >= 0) - u(c, var[q]); - } - return u; -} - -SqlInsert Renderer::Insert(SqlId table) -{ - Vector col = GetSchColumns(~table); - SqlInsert y(table); - for(int i = 0; i < col.GetCount(); i++) { - String c = col[i]; - int q = var.Find(c); - if(q < 0) - q = var.Find(ToLower(c)); - if(q >= 0) - y(c, var[q]); - } - return y; -} - +#include "Skylark.h" + +namespace Upp { + +struct sFieldsToRenderer : public FieldOperator { + Renderer& http; + + void Field(const char *name, Ref f) { + http(name, f); + } + + sFieldsToRenderer(Renderer& http) : http(http) {} +}; + +Renderer& Renderer::operator()(Fields rec) +{ + sFieldsToRenderer x(*this); + rec(x); + return *this; +} + +Renderer& Renderer::operator()(const Sql& sql) +{ + int n = sql.GetColumns(); + for(int i = 0; i < n; i++) + (*this)(sql.GetColumnInfo(i).name, sql[i]); + return *this; +} + +Renderer& Renderer::operator()(const SqlSelect& sel) +{ + SqlR sql; + sql * sel; + if(!sql.Fetch()) + throw BadRequestExc(); + return operator()(sql); +} + +Renderer& Renderer::operator()(const char *id, const SqlSelect& sel) +{ + ValueArray list; + ValueMap vm; + SqlR sql; + sql * sel; + while(sql.Fetch(vm)) + list.Add(vm); + return operator()(id, list); +} + +SqlUpdate Renderer::Update(SqlId table) +{ + Vector col = GetSchColumns(~table); + SqlUpdate u(table); + for(int i = 0; i < col.GetCount(); i++) { + String c = col[i]; + int q = var.Find(c); + if(q < 0) + q = var.Find(ToLower(c)); + if(q >= 0) + u(c, var[q]); + } + return u; +} + +SqlInsert Renderer::Insert(SqlId table) +{ + Vector col = GetSchColumns(~table); + SqlInsert y(table); + for(int i = 0; i < col.GetCount(); i++) { + String c = col[i]; + int q = var.Find(c); + if(q < 0) + q = var.Find(ToLower(c)); + if(q < 0) + q = var.Find(ToUpper(c)); + if(q >= 0) + y(c, var[q]); + } + return y; +} + }; \ No newline at end of file diff --git a/uppsrc/Skylark/src.tpp/Renderer$en-us.tpp b/uppsrc/Skylark/src.tpp/Renderer$en-us.tpp new file mode 100644 index 000000000..2c5eb552b --- /dev/null +++ b/uppsrc/Skylark/src.tpp/Renderer$en-us.tpp @@ -0,0 +1,154 @@ +topic "Renderer"; +[2 $$0,0#00000000000000000000000000000000:Default] +[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class] +[l288;2 $$2,2#27521748481378242620020725143825:desc] +[0 $$3,0#96390100711032703541132217272105:end] +[H6;0 $$4,0#05600065144404261032431302351956:begin] +[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item] +[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement] +[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] +[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] +[b42;2 $$9,9#13035079074754324216151401829390:normal] +[b42;a42;2 $$10,10#45413000475342174754091244180557:text] +[{_} +[ {{10000@(113.42.0) [s0;%% [*@7;4 Renderer]]}}&] +[s1;:Renderer`:`:class: [@(0.0.255)3 class][3 _][*3 Renderer]&] +[s2;%% This class represents [/ shared variable space]. It is separated +from Http class to be available in cases when association with +current HTTP request is not desirable (e.g. subtemplate rendering). +Renderer is used as base class of Http.&] +[s2;%% (Note: the term [/ shared variable space] reflects the fact, +that for single HTTP request all related values are stored into +this single space: values set by handler,
or Ajax variables, +session variables and cookies).&] +[s3; &] +[ {{10000F(128)G(128)@1 [s0;%% [* Public Method List]]}}&] +[s3; &] +[s5;:Renderer`:`:operator`(`)`(const char`*`,const Value`&`): [_^Renderer^ Renderer][@(0.0.255) `& +]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], [@(0.0.255) const]_[_^Value^ V +alue][@(0.0.255) `&]_[*@3 v])&] +[s2;%% Adds variable id [%-*@3 id] with value [%-*@3 v] to shared variable +space.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const ValueMap`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_ +[* operator()]([@(0.0.255) const]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 map])&] +[s2;%% Adds all key/value pairs of [%-*@3 map] as variables id / value +to shared variable space.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`): [_^Renderer^ Rende +rer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], +[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]))&] +[s2;%% Adds variable [%-*@3 id] to shared variable space; the value +of variable will be actual URL to [%-*@3 handler] (with no URL +parameters).&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`,const Value`&`): [_^Renderer^ R +enderer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], +[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]), [@(0.0.255) const]_Value[@(0.0.255) `& +]_[*@3 arg1])&] +[s2;%% Adds variable [%-*@3 id] to shared variable space; the value +of variable will be actual URL to [%-*@3 handler], placing [%-*@3 arg1] +to appropriate place (defined by handler URL pattern) as URL +parameter.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const char`*`,void`(`*`)`(Http`&`)`,const Value`&`,const Value`&`): [_^Renderer^ R +enderer][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], +[@(0.0.255) void]_(`*[*@3 handler])(Http[@(0.0.255) `&]), [@(0.0.255) const]_Value[@(0.0.255) `& +]_[*@3 arg1], [@(0.0.255) const]_Value[@(0.0.255) `&]_[*@3 arg2])&] +[s2;%% Adds variable [%-*@3 id] to shared variable space; the value +of variable will be actual URL to [%-*@3 handler], placing [%-*@3 arg1] +and [%-*@3 arg2] to appropriate place (defined by handler URL pattern) +as URL parameter.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const Sql`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* oper +ator()]([@(0.0.255) const]_[_^Sql^ Sql][@(0.0.255) `&]_[*@3 sql])&] +[s2;%% Method expects that Fetch was performed on [%-*@3 sql] and adds +columns of the fetched row to shared variable space, Each column +will be stored as a single variable with id equal to uppercased +name of the column.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(Fields`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* operator( +)]([_^Fields^ Fields]_[*@3 rec])&] +[s2;%% Method stores fields of [%-*@3 rec] as shared variable values, +each variable with id defined by field name and value by field +value. Note that Fields is usually created as mapping object +of S`_`* database records.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const SqlSelect`&`): [_^Renderer^ Renderer][@(0.0.255) `&]_ +[* operator()]([@(0.0.255) const]_[_^SqlSelect^ SqlSelect][@(0.0.255) `&]_[*@3 row`_sel])&] +[s2;%% Methods executes [%-*@3 row`_sel] with SQLR (read session), +fetches single row and adds columns of the fetched row to shared +variable space, Each column will be stored as a single variable +with id equal to uppercased name of the column. If no column +is fetched, BadRequestExc exception is raised, which eventually +(if not handled sooner) results in 400/Bad request response from +the web server.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`(`)`(const char`*`,const SqlSelect`&`): [_^Renderer^ Renderer +][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], +[@(0.0.255) const]_[_^SqlSelect^ SqlSelect][@(0.0.255) `&]_[*@3 sel])&] +[s2;%% Methods executes [%-*@3 sel] with SQLR (read session), fetches +[*/ all] rows and creates an ValueArray of ValueMaps (with column`-name/column`-val +ue pairs) and stores the result into [%-*@3 id] shared variable.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:SetLanguage`(int`): [_^Renderer^ Renderer][@(0.0.255) `&]_[* SetLanguage]( +[@(0.0.255) int]_[*@3 lang])&] +[s2; [%% Sets the language to be used while rendering witz template. +Basically, it affects the choice of the template file, language +specific templates have priority.E.g. if language is set to ][%%* LNG`_(`'C`',`'S`' +,`'C`',`'Z`')][%% and there exists file ][* index.cs`-cz.witz][%% , +it has priority over ][* index.witz]. The default value is LNG`_ENGLISH +(en`-us).&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:Update`(SqlId`): [_^SqlUpdate^ SqlUpdate]_[* Update]([_^SqlId^ SqlId]_[*@3 t +able])&] +[s2;%% This method creates an update SQL statement for [%-*@3 table] +based on current shared variables. It obtains a list of columns +for the [%-*@3 table] and adds to SqlUpdate all columns found in +as shared variables; for each column it first tries to find it +case`-sensitive, then lower`-cased, then upper`-cased. Columns +not found as shared variable are not added.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:Insert`(SqlId`): [_^SqlInsert^ SqlInsert]_[* Insert]([_^SqlId^ SqlId]_[*@3 t +able])&] +[s2;%% This method creates an insert SQL statement for [%-*@3 table] +based on current shared variables. It obtains a list of columns +for the [%-*@3 table] and adds to SqlUpdate all columns found in +as shared variables; for each column it first tries to find it +case`-sensitive, then lower`-cased, then upper`-cased. Columns +not found as shared variable are not added.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:operator`[`]`(const char`*`)const: [_^Value^ Value]_[* operator`[`]]([@(0.0.255) c +onst]_[@(0.0.255) char]_`*[*@3 id])_[@(0.0.255) const]&] +[s2;%% Returns the value of shared variable [%-*@3 id].&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:RenderString`(const String`&`): [_^String^ String]_[* RenderString]([@(0.0.255) c +onst]_[_^String^ String][@(0.0.255) `&]_[*@3 template`_name])&] +[s2;%% Renders [%-*@3 template`_name] using current set of variables.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:Render`(const String`&`): [_^Value^ Value]_[* Render]([@(0.0.255) const]_[_^String^ S +tring][@(0.0.255) `&]_[*@3 template`_name])&] +[s2;%% Same as Raw(RenderString(template`_name)). The purpose is +that Strings represented by RawHtmlText (a result of Raw) are +not escaped when insterted into witz templates.&] +[s3;%% &] +[s4; &] +[s5;:Renderer`:`:Render`(const char`*`,const String`&`): [_^Renderer^ Renderer][@(0.0.255) `& +]_[* Render]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 id], [@(0.0.255) const]_[_^String^ S +tring][@(0.0.255) `&]_[*@3 template`_name])&] +[s2;%% [%-*@3 id] [%-*@3 template`_name] .&] +[s0;%% ]] \ No newline at end of file