--- parser3/src/classes/op.C 2002/10/17 09:04:53 1.123 +++ parser3/src/classes/op.C 2003/01/24 11:33:02 1.127.2.2 @@ -1,11 +1,11 @@ /** @file Parser: parser @b operators. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_OP_C="$Date: 2002/10/17 09:04:53 $"; +static const char* IDENT_OP_C="$Date: 2003/01/24 11:33:02 $"; #include "classes.h" #include "pa_common.h" @@ -30,6 +30,10 @@ public: VClassMAIN(Pool& apool); }; +// helpers + +Hash Hash untaint_lang_name2enum; + // methods static void _if(Request& r, const String&, MethodParams *params) { @@ -102,7 +106,7 @@ static void _process(Request& r, const S { Value& vjunction=params->as_junction(params->size()-1, "body must be code"); - VStateless_class *target_class=target_self.get_class(); + VStateless_class *target_class=target_self.get_last_derived_class(); if(!target_class) throw Exception("parser.runtime", &method_name, @@ -249,8 +253,8 @@ struct timeval mt[2]; Value& body_code=params->as_junction(1, "body must be code"); Table *protocol2driver_and_client=0; - if(Value *sql=r.main_class.get_element(*new(pool) String(pool, MAIN_SQL_NAME), &r.main_class, false)) { - if(Value *element=sql->get_element(*new(pool) String(pool, MAIN_SQL_DRIVERS_NAME), sql, false)) { + if(Value *sql=r.main_class.get_element(*new(pool) String(pool, MAIN_SQL_NAME), r.main_class, false)) { + if(Value *element=sql->get_element(*new(pool) String(pool, MAIN_SQL_DRIVERS_NAME), *sql, false)) { protocol2driver_and_client=element->get_table(); } } @@ -352,7 +356,7 @@ static void _case(Request& r, const Stri // consts -const int DATA_STRING_SERIALIZED_VERSION=0x0002; +const int DATA_STRING_SERIALIZED_VERSION=0x0003; // helper types @@ -377,6 +381,10 @@ struct Locked_process_and_cache_put_acti Value *body_code; const String *evaluated_body; }; #endif +/* @todo maybe network order worth spending some effort? + don't bothering myself with network byte order, + am not planning to be able to move resulting file across platforms +*/ static void locked_process_and_cache_put_action(int f, void *context) { Locked_process_and_cache_put_action_info& info= *static_cast(context); @@ -428,6 +436,7 @@ String *cache_get(Pool& pool, const Stri if(file_read(pool, file_spec, data, data_size, false/*as_text*/, + 0, 0, //no params&out_fields false/*fail_on_read_problem*/) && data_size/* ignore reads which are empty due to non-unary open+lockEX conflict with lockSH */) { @@ -598,7 +607,7 @@ static void _try_operator(Request& r, co Junction *junction=catch_code.get_junction(); Value *method_frame=junction->method_frame; - Value *saved_exception_var_value=method_frame->get_element(*exception_var_name, method_frame, false); + Value *saved_exception_var_value=method_frame->get_element(*exception_var_name, *method_frame, false); junction->method_frame->put_element(*exception_var_name, &vhash, false); result=r.process(catch_code); bool handled=false; @@ -709,6 +718,40 @@ VClassMAIN::VClassMAIN(Pool& apool): VCl // constructor & configurator +#define ULN(cstr, name) \ + String uln##name String(cstr); +ULN("as-is", as_is); +ULN("optimized-as-is", optimized_as_is); +ULN("file-spec", file_spec); +ULN("http-header", http_header); +ULN("mail-header", mail_header); +ULN("uri", uri); +ULN("table", table); +ULN("sql", sql); +ULN("js", js); +ULN("xml", xml); +ULN("optimized-xml", optimized_xml); +ULN("html", html); +ULN("optimized-html", optimized_html); +#undef ULN + VClass& VClassMAIN_create(Pool& pool) { + #define ULN(name, LANG) \ + untaint_lang_name2enum.put(uln##name, (int)String::UL_##LANG); + ULN(as_is, AS_IS); + ULN(optimized_as_is, AS_IS|String::UL_OPTIMIZE_BIT); + ULN(file_spec, FILE_SPEC); + ULN(http_header, HTTP_HEADER); + ULN(mail_header, MAIL_HEADER); + ULN(uri, URI); + ULN(table, TABLE); + ULN(sql, SQL); + ULN(js, JS); + ULN(xml, XML); + ULN(optimized_xml, XML|String::UL_OPTIMIZE_BIT); + ULN(html, HTML); + ULN(optimized_html, HTML|String::UL_OPTIMIZE_BIT); + #undef ULN + return *new(pool) VClassMAIN(pool); }