--- parser3/src/classes/op.C 2001/04/15 14:40:53 1.7 +++ parser3/src/classes/op.C 2001/04/28 13:49:13 1.12 @@ -1,22 +1,46 @@ /** @file - Parser: @b ROOT parser class. + 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.7 2001/04/15 14:40:53 paf Exp $ + $Id: op.C,v 1.12 2001/04/28 13:49:13 paf Exp $ */ +#include "pa_methoded.h" #include "pa_config_includes.h" -#include - #include "pa_common.h" #include "pa_request.h" -#include "_op.h" #include "pa_vint.h" #include "pa_sql_connection.h" +// defines + +#define OP_CLASS_NAME "OP" + +#define MAIN_SQL_NAME "SQL" +#define MAIN_SQL_DRIVERS_NAME "drivers" + +// local variable + +static Methoded *OP; + +// class + +class MOP : public Methoded { +public: + MOP(Pool& pool); +public: // Methoded + bool used_directly() { return true; } + void configure_user(Request& r); +private: + String main_sql_name; + String main_sql_drivers_name; +}; + +// methods + static void _if(Request& r, const String&, MethodParams *params) { Value& condition_code=params->get(0); @@ -239,9 +263,11 @@ static void _connect(Request& r, const S Value& url=params->get_no_junction(0, "url must not be code"); Value& body_code=params->get_junction(1, "body must be code"); + Table *protocol2library=static_cast(r.classes_conf.get(OP->name())); + // connect SQL_Connection& connection=SQL_driver_manager->get_connection( - url.as_string(), r.protocol2library); + url.as_string(), protocol2library); Exception rethrow_me; // remember/set current connection @@ -279,60 +305,82 @@ static void _connect(Request& r, const S rethrow_me.comment()); } -// initialize +// constructor + +MOP::MOP(Pool& apool) : Methoded(apool), + main_sql_name(apool, MAIN_SQL_NAME), + main_sql_drivers_name(apool, MAIN_SQL_DRIVERS_NAME) +{ + set_name(*NEW String(pool(), OP_CLASS_NAME)); -void initialize_op_class(Pool& pool, VStateless_class& vclass) { // ^if(condition){code-when-true} // ^if(condition){code-when-true}{code-when-false} - vclass.add_native_method("if", Method::CT_ANY, _if, 2, 3); + add_native_method("if", Method::CT_ANY, _if, 2, 3); // ^untaint[as-is|uri|sql|js|html|html-typo]{code} - vclass.add_native_method("untaint", Method::CT_ANY, _untaint, 2, 2); + add_native_method("untaint", Method::CT_ANY, _untaint, 2, 2); // ^taint[as-is|uri|sql|js|html|html-typo]{code} - vclass.add_native_method("taint", Method::CT_ANY, _taint, 1, 2); + add_native_method("taint", Method::CT_ANY, _taint, 1, 2); // ^process[code] - vclass.add_native_method("process", Method::CT_ANY, _process, 1, 1); + add_native_method("process", Method::CT_ANY, _process, 1, 1); // ^rem{code} - vclass.add_native_method("rem", Method::CT_ANY, _rem, 1, 1); + add_native_method("rem", Method::CT_ANY, _rem, 1, 1); // ^while(condition){code} - vclass.add_native_method("while", Method::CT_ANY, _while, 2, 2); + add_native_method("while", Method::CT_ANY, _while, 2, 2); // ^use[file] - vclass.add_native_method("use", Method::CT_ANY, _use, 1, 1); + add_native_method("use", Method::CT_ANY, _use, 1, 1); // ^for[i;from-number;to-number-inclusive]{code}[delim] - vclass.add_native_method("for", Method::CT_ANY, _for, 3+1, 3+1+1); + add_native_method("for", Method::CT_ANY, _for, 3+1, 3+1+1); // ^eval(expr) // ^eval(expr)[format] - vclass.add_native_method("eval", Method::CT_ANY, _eval, 1, 2); + add_native_method("eval", Method::CT_ANY, _eval, 1, 2); // math functions // ^round(expr) - vclass.add_native_method("round", Method::CT_ANY, _round, 1, 1); + add_native_method("round", Method::CT_ANY, _round, 1, 1); // ^floor(expr) - vclass.add_native_method("floor", Method::CT_ANY, _floor, 1, 1); + add_native_method("floor", Method::CT_ANY, _floor, 1, 1); // ^ceiling(expr) - vclass.add_native_method("ceiling", Method::CT_ANY, _ceiling, 1, 1); + add_native_method("ceiling", Method::CT_ANY, _ceiling, 1, 1); // ^abs(expr) - vclass.add_native_method("abs", Method::CT_ANY, _abs, 1, 1); + add_native_method("abs", Method::CT_ANY, _abs, 1, 1); // ^sign(expr) - vclass.add_native_method("sign", Method::CT_ANY, _sign, 1, 1); + add_native_method("sign", Method::CT_ANY, _sign, 1, 1); // connect // ^connect[protocol://user:pass@host[:port]/database]{code with ^sql-s} - vclass.add_native_method("connect", Method::CT_ANY, _connect, 2, 2); + add_native_method("connect", Method::CT_ANY, _connect, 2, 2); + +} + +// constructor & configurator + +Methoded *MOP_create(Pool& pool) { + return OP=new(pool) MOP(pool); +} + + +void MOP::configure_user(Request& r) { + Pool& pool=r.pool(); + // $MAIN:SQL.drivers + if(Value *sql=r.main_class->get_element(main_sql_name)) + if(Value *element=sql->get_element(main_sql_drivers_name)) + if(Table *protocol2library=element->get_table()) + r.classes_conf.put(name(), protocol2library); }