--- parser3/src/classes/op.C 2001/07/07 16:38:01 1.34 +++ parser3/src/classes/op.C 2001/10/09 07:06:00 1.48 @@ -2,10 +2,10 @@ Parser: parser @b operators. Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: op.C,v 1.48 2001/10/09 07:06:00 parser Exp $ */ -static const char *RCSId="$Id: op.C,v 1.34 2001/07/07 16:38:01 parser Exp $"; #include "classes.h" #include "pa_config_includes.h" @@ -22,16 +22,6 @@ static const char *RCSId="$Id: op.C,v 1. #define OP_CLASS_NAME "OP" -#define MAIN_SQL_NAME "SQL" -#define MAIN_SQL_DRIVERS_NAME "drivers" - -#define SWITCH_DATA_NAME "SWITCH-DATA" -#define DEFAULT_VALUE "DEFAULT" - -// local variable - -static Methoded *OP; - // class class MOP : public Methoded { @@ -40,6 +30,7 @@ public: public: // Methoded bool used_directly() { return true; } void configure_user(Request& r); + private: String main_sql_name; String main_sql_drivers_name; @@ -48,7 +39,7 @@ private: // methods static void _if(Request& r, const String&, MethodParams *params) { - Value& condition_code=params->get(0); + Value& condition_code=params->as_junction(0, "condition must be expression"); bool condition=r.process(condition_code, 0/*no name*/, @@ -62,7 +53,7 @@ static void _if(Request& r, const String static void _untaint(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& lang_name=r.process(params->get(0)).as_string(); + const String& lang_name=params->as_string(0, "lang must be string"); String::Untaint_lang lang=static_cast( untaint_lang_name2enum->get_int(lang_name)); if(!lang) @@ -85,8 +76,7 @@ static void _taint(Request& r, const Str if(params->size()==1) lang=String::UL_TAINTED; // mark as simply 'tainted'. useful in table:set else { - const String& lang_name= - r.process(params->get(0)).as_string(); + const String& lang_name=params->as_string(0, "lang must be string"); lang=static_cast( untaint_lang_name2enum->get_int(lang_name)); if(!lang) @@ -116,7 +106,7 @@ static void _process(Request& r, const S origin.file, 1+origin.line, method_name.cstr()); #else - strncpy(place, MAX_STRING, method_name.cstr()); + strncpy(place, method_name.cstr(), MAX_STRING-1); place[MAX_STRING-1]=0; #endif VStateless_class& self_class=*r.self->get_class(); @@ -128,7 +118,7 @@ static void _process(Request& r, const S // evaluate source to process const String& source= - r.process(params->get(0)).as_string(); + r.process(params->as_no_junction(0, "body must be string")).as_string(); // process source code, append processed methods to 'self' class // maybe-define new @main @@ -175,16 +165,16 @@ static void _while(Request& r, const Str static void _use(Request& r, const String& method_name, MethodParams *params) { Value& vfile=params->as_no_junction(0, "file name must not be code"); - r.use_file(r.absolute(vfile.as_string())); + r.use_file(vfile.as_string()); } static void _for(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - const String& var_name=r.process(params->get(0)).as_string(); - int from=r.process(params->get(1)).as_int(); - int to=r.process(params->get(2)).as_int(); + const String& var_name=params->as_string(0, "var name must be string"); + int from=params->as_int(1, "from must be int", r); + int to=params->as_int(2, "to must be int", r); Value& body_code=params->as_junction(3, "body must be code"); - Value *delim_code=params->size()==3+1+1?¶ms->get(3+1):0; + Value *delim_code=params->size()==3+1+1?¶ms->as_junction(3+1, "delim must be code"):0; bool need_delim=false; VInt *vint=new(pool) VInt(pool, 0); @@ -195,7 +185,7 @@ static void _for(Request& r, const Strin &method_name, "endless loop detected"); vint->set_int(i); - r.root->put_element(var_name, vint); + r.self/*root*/->put_element(var_name, vint); Value& processed_body=r.process(body_code); if(delim_code) { // delimiter set? @@ -227,18 +217,18 @@ static void _eval(Request& r, const Stri } -static void _connect(Request& r, const String&, MethodParams *params) { +static void _connect(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); Value& url=params->as_no_junction(0, "url must not be code"); Value& body_code=params->as_junction(1, "body must be code"); Table *protocol2driver_and_client= - static_cast(r.classes_conf.get(OP->name())); + static_cast
(r.classes_conf.get(r.OP.name())); // connect SQL_Connection& connection=SQL_driver_manager->get_connection( - url.as_string(), protocol2driver_and_client); + url.as_string(), method_name, protocol2driver_and_client); Exception rethrow_me; // remember/set current connection @@ -276,15 +266,13 @@ static void _connect(Request& r, const S rethrow_me.comment()); } -static String *switch_data_name; -static String *default_value; - +#ifndef DOXYGEN struct Switch_data { Value *searching; Value *found; Value *_default; }; - +#endif static void _switch(Request& r, const String&, MethodParams *params) { void *backup=r.classes_conf.get(*switch_data_name); Switch_data data={&r.process(params->get(0))}; @@ -298,27 +286,33 @@ static void _switch(Request& r, const St r.write_pass_lang(r.process(*code)); } -static void _case(Request& r, const String&, MethodParams *params) { - Switch_data& data=*static_cast(r.classes_conf.get(*switch_data_name)); +static void _case(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + + Switch_data *data=static_cast(r.classes_conf.get(*switch_data_name)); + if(!data) + PTHROW(0, 0, + &method_name, + "without switch"); int count=params->size(); Value *code=¶ms->as_junction(--count, "case result must be code"); for(int i=0; iget(i)); - if(value.as_string() == *default_value) { - data._default=code; + if(value.as_string() == *case_default_value) { + data->_default=code; break; } bool matches; - if(data.searching->is_string()) - matches=data.searching->as_string() == value.as_string(); + if(data->searching->is_string()) + matches=data->searching->as_string() == value.as_string(); else - matches=data.searching->as_double() == value.as_double(); + matches=data->searching->as_double() == value.as_double(); if(matches) { - data.found=code; + data->found=code; break; } } @@ -332,9 +326,6 @@ MOP::MOP(Pool& apool) : Methoded(apool), { set_name(*NEW String(pool(), OP_CLASS_NAME)); - switch_data_name=NEW String(pool(), SWITCH_DATA_NAME); - default_value=NEW String(pool(), DEFAULT_VALUE); - // ^if(condition){code-when-true} // ^if(condition){code-when-true}{code-when-false} add_native_method("if", Method::CT_ANY, _if, 2, 3); @@ -380,10 +371,9 @@ MOP::MOP(Pool& apool) : Methoded(apool), // constructor & configurator Methoded *MOP_create(Pool& pool) { - return OP=new(pool) MOP(pool); + return new(pool) MOP(pool); } - void MOP::configure_user(Request& r) { Pool& pool=r.pool();