Skylark: Renderer documentation

git-svn-id: svn://ultimatepp.org/upp/trunk@5261 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-08-05 12:20:50 +00:00
parent 9cf2cfae5d
commit ec0eff7911
5 changed files with 469 additions and 304 deletions

View file

@ -1,144 +1,147 @@
void MakeLink(StringBuffer& out, const Vector<String>& part, const Vector<Value>& arg);
class Renderer {
protected:
VectorMap<String, Value> var;
int lang;
Renderer& Link(const char *id, void (*view)(Http&), const Vector<Value>& arg);
const One<Exe>& 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<String> arg;
String session_id;
VectorMap<String, Value> session_var;
bool session_dirty;
String redirect;
int code;
String code_text;
String response;
String content_type;
String request_content_type;
VectorMap<String, String> 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<Value>& 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<String> *GetUrlViewLinkParts(const String& id);
String MakeLink(void (*view)(Http&), const Vector<Value>& arg);
enum {
SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML
};
void MakeLink(StringBuffer& out, const Vector<String>& part, const Vector<Value>& arg);
class Renderer {
protected:
VectorMap<String, Value> var;
int lang;
Renderer& Link(const char *id, void (*view)(Http&), const Vector<Value>& arg);
const One<Exe>& 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<String> arg;
String session_id;
VectorMap<String, Value> session_var;
bool session_dirty;
String redirect;
int code;
String code_text;
String response;
String content_type;
String request_content_type;
VectorMap<String, String> 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<Value>& 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<String> *GetUrlViewLinkParts(const String& id);
String MakeLink(void (*view)(Http&), const Vector<Value>& arg);
enum {
SESSION_FORMAT_BINARY, SESSION_FORMAT_JSON, SESSION_FORMAT_XML
};

View file

@ -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<Value>& 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<Value>& arg)
{
var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"'));
return *this;
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&))
{
return Link(id, view, Vector<Value>());
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1)
{
return Link(id, view, Vector<Value>() << arg1);
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2)
{
return Link(id, view, Vector<Value>() << arg1 << arg2);
}
StaticMutex template_cache_lock;
ArrayMap<String, One<Exe> > template_cache;
const One<Exe>& 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>& 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<Value>& 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<Value>& arg)
{
var.Add(id, Raw('\"' + MakeLink(view, arg) + '\"'));
return *this;
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&))
{
return Link(id, view, Vector<Value>());
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1)
{
return Link(id, view, Vector<Value>() << arg1);
}
Renderer& Renderer::operator()(const char *id, void (*view)(Http&), const Value& arg1, const Value& arg2)
{
return Link(id, view, Vector<Value>() << arg1 << arg2);
}
Renderer& Renderer::SetLanguage(int lang_)
{
lang = lang_;
return *this;
}
StaticMutex template_cache_lock;
ArrayMap<String, One<Exe> > template_cache;
const One<Exe>& 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>& 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()
{
}
};

View file

@ -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)));

View file

@ -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<String> 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<String> 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<String> 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<String> 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;
}
};

View file

@ -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, <form> 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;%% ]]