|
version 1.135, 2002/06/11 12:20:41
|
version 1.156, 2002/10/15 14:28:57
|
|
Line 3
|
Line 3
|
| |
|
| Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) |
Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| |
|
| $Id$ |
|
| */ |
*/ |
| |
|
| #ifndef PA_REQUEST_H |
#ifndef PA_REQUEST_H |
| #define PA_REQUEST_H |
#define PA_REQUEST_H |
| |
|
| |
static const char* IDENT_REQUEST_H="$Date$"; |
| |
|
| #include "pa_pool.h" |
#include "pa_pool.h" |
| #include "pa_hash.h" |
#include "pa_hash.h" |
| #include "pa_wcontext.h" |
#include "pa_wcontext.h" |
|
Line 20
|
Line 20
|
| #include "pa_venv.h" |
#include "pa_venv.h" |
| #include "pa_vstatus.h" |
#include "pa_vstatus.h" |
| #include "pa_vform.h" |
#include "pa_vform.h" |
| |
#include "pa_vmail.h" |
| #include "pa_vmath.h" |
#include "pa_vmath.h" |
| #include "pa_vrequest.h" |
#include "pa_vrequest.h" |
| #include "pa_vresponse.h" |
#include "pa_vresponse.h" |
|
Line 39 const uint ANTI_ENDLESS_EXECUTE_RECOURSI
|
Line 40 const uint ANTI_ENDLESS_EXECUTE_RECOURSI
|
| |
|
| #ifndef NO_STRING_ORIGIN |
#ifndef NO_STRING_ORIGIN |
| # define COMPILE_PARAMS \ |
# define COMPILE_PARAMS \ |
| const char *source, \ |
VStateless_class& aclass, const char *source \ |
| VStateless_class *aclass, const String *name, \ |
, const char *file |
| VStateless_class *base_class, \ |
# define COMPILE(aclass, source, file) \ |
| const char *file |
real_compile(aclass, source, file) |
| # define COMPILE(source, aclass, name, base_class, file) \ |
|
| real_compile(source, aclass, name, base_class, file) |
|
| #else |
#else |
| # define COMPILE_PARAMS \ |
# define COMPILE_PARAMS \ |
| const char *source, \ |
VStateless_class& aclass, const char *source |
| VStateless_class *aclass, const String *name, \ |
# define COMPILE(aclass, source, file) \ |
| VStateless_class *base_class |
real_compile(aclass, source) |
| # define COMPILE(source, aclass, name, base_class, file) \ |
|
| real_compile(source, aclass, name, base_class) |
|
| #endif |
#endif |
| |
|
| class Temp_lang; |
class Temp_lang; |
|
Line 62 class VMethodFrame;
|
Line 59 class VMethodFrame;
|
| class Request : public Pooled { |
class Request : public Pooled { |
| friend class Temp_lang; |
friend class Temp_lang; |
| friend class Temp_connection; |
friend class Temp_connection; |
| |
friend class Request_context_saver; |
| |
friend class Temp_request_self; |
| public: |
public: |
| |
|
| #ifdef RESOURCES_DEBUG |
#ifdef RESOURCES_DEBUG |
|
Line 81 public:
|
Line 80 public:
|
| const char *content_type; |
const char *content_type; |
| size_t content_length; |
size_t content_length; |
| const char *cookie; |
const char *cookie; |
| |
bool mail_received; |
| }; |
}; |
| |
|
| Request(Pool& apool, |
Request(Pool& apool, |
|
Line 99 public:
|
Line 99 public:
|
| BEWARE: may throw exception to you: catch it! |
BEWARE: may throw exception to you: catch it! |
| */ |
*/ |
| void core( |
void core( |
| const char *root_config_filespec, ///< system config filespec |
const char *config_filespec, ///< system config filespec |
| bool root_config_fail_on_read_problem, ///< fail if system config file not found |
bool config_fail_on_read_problem, ///< fail if system config file not found |
| const char *site_config_filespec, ///< site config filespec |
|
| bool site_config_fail_on_read_problem, ///< fail if site config file not found |
|
| bool header_only); |
bool header_only); |
| |
|
| /// executes ops |
/// executes ops |
|
Line 121 public:
|
Line 119 public:
|
| } |
} |
| |
|
| /// compiles the file, maybe forcing it's class @a name and @a base_class. |
/// compiles the file, maybe forcing it's class @a name and @a base_class. |
| VStateless_class *use_file( |
VStateless_class *use_file(VStateless_class& aclass, |
| const String& file_name, |
const String& file_name, |
| bool ignore_class_path=false, bool fail_on_read_problem=true, |
bool ignore_class_path=false, |
| const String *name=0, |
bool fail_on_read_problem=true, bool fail_on_file_absence=true); // core.C |
| VStateless_class *base_class=0); // core.C |
|
| /// compiles a @a source buffer |
/// compiles a @a source buffer |
| VStateless_class *use_buf( |
VStateless_class *use_buf(VStateless_class& aclass, |
| const char *source, const char *file, |
const char *source, |
| VStateless_class *aclass=0, const String *name=0, |
const String& filespec, const char *filespec_cstr); // core.C |
| VStateless_class *base_class=0); // core.C |
|
| |
|
| /// processes any code-junction there may be inside of @a value |
/// processes any code-junction there may be inside of @a value |
| StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C |
StringOrValue process(Value& input_value, bool intercept_string=true); // execute.C |
|
Line 218 public:
|
Line 214 public:
|
| return fconnection; |
return fconnection; |
| } |
} |
| |
|
| bool origins_mode() { |
bool origins_mode(); |
| return main_class->get_element(*origins_mode_name)!=0; // $ORIGINS mode |
|
| } |
|
| |
|
| public: |
public: |
| |
|
| /// info from web server |
/// info from web server |
| Info& info; |
Info& info; |
| /// user's post data |
/// user's post data |
| char *post_data; size_t post_size; |
const char *post_data; size_t post_size; |
| |
|
| /// name of 'main' method |
/// name of 'main' method |
| const String main_method_name; |
const String main_method_name; |
| |
|
| /// operators are methods of this class |
/// 'MAIN' class conglomerat & operators are methods of this class |
| Methoded& OP; |
VClass& main_class; |
| /// $env:fields |
/// $env:fields |
| VEnv env; |
VEnv env; |
| /// $status:fields |
/// $status:fields |
| VStatus status; |
VStatus status; |
| /// $form:elements |
/// $form:elements |
| VForm form; |
VForm form; |
| |
/// $mail |
| |
VMail mail; |
| /// $math:constants |
/// $math:constants |
| VMath math; |
VMath math; |
| /// $request:elements |
/// $request:elements |
|
Line 249 public:
|
Line 245 public:
|
| /// $cookie:elements |
/// $cookie:elements |
| VCookie cookie; |
VCookie cookie; |
| |
|
| |
/// classes configured data |
| |
Hash classes_conf; |
| |
|
| |
private: |
| |
|
| //@{ request processing status |
//@{ request processing status |
| |
/// exception stack trace |
| |
Stack exception_trace; |
| /// execution stack |
/// execution stack |
| Stack stack; |
Stack stack; |
| /// contexts |
/// contexts |
| Value *self, *root, *rcontext; |
Value *self; |
| /// contexts |
VMethodFrame *method_frame; |
| |
Value *rcontext; |
| WContext *wcontext; |
WContext *wcontext; |
| /// exception stack trace |
/// current language |
| Stack exception_trace; |
uchar flang; |
| |
/// current connection |
| |
SQL_Connection *fconnection; |
| //@} |
//@} |
| |
|
| /// 'MAIN' class conglomerat |
public: // status read methods |
| VStateless_class *main_class; |
|
| |
|
| /// classes configured data |
Value *get_self() { return self; } |
| Hash classes_conf; |
VMethodFrame *get_method_frame() { return method_frame; } |
| |
|
| private: // core data |
private: // core data |
| |
|
|
Line 279 private: // core data
|
Line 284 private: // core data
|
| */ |
*/ |
| uint anti_endless_execute_recoursion; |
uint anti_endless_execute_recoursion; |
| |
|
| |
private: |
| |
|
| |
/// already executed some @conf method |
| |
bool configure_admin_done; |
| |
|
| |
void configure_admin(VStateless_class& conf_class, const String *source); |
| |
|
| private: // compile.C |
private: // compile.C |
| |
|
| VStateless_class& real_compile(COMPILE_PARAMS); |
VStateless_class& real_compile(COMPILE_PARAMS); |
| |
|
| private: // execute.C |
private: // execute.C |
| |
|
| const String *execute_method(Value& aself, const Method& method, |
/// for @postprocess[body] |
| bool return_cstr); |
|
| const String& execute_method(VMethodFrame& amethodFrame, const Method& method); |
const String& execute_method(VMethodFrame& amethodFrame, const Method& method); |
| |
//{ for @conf[filespec] and @auto[filespec] |
| |
void execute_method(Value& aself, |
| |
const Method& method, VString *optional_param, |
| |
const String **return_string); |
| |
void execute_nonvirtual_method(VStateless_class& aclass, |
| |
const String& method_name, VString *optional_param, |
| |
const String **return_string, |
| |
const Method **return_method=0); |
| |
//} |
| |
/// for @main[] |
| const String *execute_virtual_method(Value& aself, const String& method_name); |
const String *execute_virtual_method(Value& aself, const String& method_name); |
| const String *execute_nonvirtual_method(VStateless_class& aclass, |
|
| const String& method_name, |
|
| bool return_cstr); |
|
| |
|
| Value *get_element(const String *& remember_name, bool can_call_operator); |
Value *get_element(const String *& remember_name, bool can_call_operator); |
| |
|
|
Line 316 private: // lang manipulation
|
Line 334 private: // lang manipulation
|
| flang=alang; |
flang=alang; |
| } |
} |
| |
|
| private: // lang&raw |
|
| |
|
| uchar flang; |
|
| |
|
| |
|
| private: // connection manipulation |
private: // connection manipulation |
| |
|
| SQL_Connection *set_connection(SQL_Connection *aconnection) { |
SQL_Connection *set_connection(SQL_Connection *aconnection) { |
|
Line 334 private: // connection manipulation
|
Line 347 private: // connection manipulation
|
| |
|
| private: |
private: |
| |
|
| /// connection |
void output_result(const VFile& body_file, bool header_only); |
| |
}; |
| |
|
| |
/// Auto-object used to save request context across ^try body |
| |
class Request_context_saver { |
| |
Request& fr; |
| |
|
| |
/// exception stack trace |
| |
int exception_trace; |
| |
/// execution stack |
| |
int stack; |
| |
/// contexts |
| |
Value *self; |
| |
VMethodFrame *method_frame; |
| |
Value *rcontext; |
| |
WContext *wcontext; |
| |
/// current language |
| |
uchar flang; |
| |
/// current connection |
| SQL_Connection *fconnection; |
SQL_Connection *fconnection; |
| |
|
| void output_result(const VFile& body_file, bool header_only); |
public: |
| |
Request_context_saver(Request& ar) : |
| |
exception_trace(ar.exception_trace.top_index()), |
| |
stack(ar.stack.top_index()), |
| |
self(ar.self), |
| |
method_frame(ar.method_frame), |
| |
rcontext(ar.rcontext), |
| |
wcontext(ar.wcontext), |
| |
flang(ar.flang), |
| |
fconnection(ar.fconnection), |
| |
fr(ar) {} |
| |
void restore() { |
| |
fr.exception_trace.top_index(exception_trace); |
| |
fr.stack.top_index(stack); |
| |
fr.self=self; fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; |
| |
fr.flang=flang; |
| |
fr.fconnection=fconnection; |
| |
} |
| |
}; |
| |
|
| |
/// Auto-object used for temporary changing Request::self. |
| |
class Temp_request_self { |
| |
Request& frequest; |
| |
Value *saved_self; |
| |
public: |
| |
Temp_request_self(Request& arequest, Value& aself) : |
| |
frequest(arequest), |
| |
saved_self(arequest.self) { |
| |
frequest.self=&aself; |
| |
} |
| |
~Temp_request_self() { |
| |
frequest.self=saved_self; |
| |
} |
| }; |
}; |
| |
|
| /// Auto-object used for temporary changing Request::flang. |
/// Auto-object used for temporary changing Request::flang. |