|
|
| version 1.148, 2002/09/18 08:52:50 | version 1.161, 2003/03/11 08:53:03 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: request class decl. | Parser: request class decl. |
| Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001, 2003 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) |
| */ | */ |
| Line 34 static const char* IDENT_REQUEST_H="$Dat | Line 34 static const char* IDENT_REQUEST_H="$Dat |
| // consts | // consts |
| #define MAIN_METHOD_NAME "main" | #define MAIN_METHOD_NAME "main" |
| const uint ANTI_ENDLESS_EXECUTE_RECOURSION=500; | const uint ANTI_ENDLESS_EXECUTE_RECOURSION=1000; |
| // defines | // defines |
| #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 64 class Request : public Pooled { | Line 60 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 Request_context_saver; |
| friend class Temp_request_self; | |
| public: | public: |
| #ifdef RESOURCES_DEBUG | #ifdef RESOURCES_DEBUG |
| Line 122 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 String& filespec, const char *filespec_cstr, | 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 219 public: | Line 214 public: |
| return fconnection; | return fconnection; |
| } | } |
| bool origins_mode() { | bool origins_mode(); |
| return main_class->get_element(*origins_mode_name, main_class, false)!=0; // $ORIGINS mode | |
| } | void interrupt() { finterrupted=true; } |
| bool interrupted() { return finterrupted; } | |
| public: | public: |
| Line 233 public: | Line 229 public: |
| /// 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 |
| Line 252 public: | Line 248 public: |
| /// $cookie:elements | /// $cookie:elements |
| VCookie cookie; | VCookie cookie; |
| /// 'MAIN' class conglomerat | |
| VStateless_class *main_class; | |
| /// classes configured data | /// classes configured data |
| Hash classes_conf; | Hash classes_conf; |
| Line 266 private: | Line 259 private: |
| /// execution stack | /// execution stack |
| Stack stack; | Stack stack; |
| /// contexts | /// contexts |
| Value *self; | |
| VMethodFrame *method_frame; | VMethodFrame *method_frame; |
| Value *rcontext; | Value *rcontext; |
| WContext *wcontext; | WContext *wcontext; |
| Line 275 private: | Line 267 private: |
| /// current connection | /// current connection |
| SQL_Connection *fconnection; | SQL_Connection *fconnection; |
| //@} | //@} |
| /// interrupted flag, raised on signals [SIGPIPE] | |
| bool finterrupted; | |
| public: // status read methods | public: // status read methods |
| Value *get_self() { return self; } | |
| VMethodFrame *get_method_frame() { return method_frame; } | VMethodFrame *get_method_frame() { return method_frame; } |
| Value *get_self(); | |
| private: // core data | private: // core data |
| Line 357 private: // connection manipulation | Line 351 private: // connection manipulation |
| private: | private: |
| void output_result(const VFile& body_file, bool header_only); | void output_result(const VFile& body_file, bool header_only, bool as_attachment); |
| }; | }; |
| /// Auto-object used to save request context across ^try body | /// Auto-object used to save request context across ^try body |
| class Request_context_saver { | class Request_context_saver { |
| Request& fr; | Request& fr; |
| /// exception stack trace | /// exception stack trace |
| Line 370 class Request_context_saver { | Line 363 class Request_context_saver { |
| /// execution stack | /// execution stack |
| int stack; | int stack; |
| /// contexts | /// contexts |
| Value *self; | |
| VMethodFrame *method_frame; | VMethodFrame *method_frame; |
| Value *rcontext; | Value *rcontext; |
| WContext *wcontext; | WContext *wcontext; |
| Line 383 public: | Line 375 public: |
| Request_context_saver(Request& ar) : | Request_context_saver(Request& ar) : |
| exception_trace(ar.exception_trace.top_index()), | exception_trace(ar.exception_trace.top_index()), |
| stack(ar.stack.top_index()), | stack(ar.stack.top_index()), |
| self(ar.self), | |
| method_frame(ar.method_frame), | method_frame(ar.method_frame), |
| rcontext(ar.rcontext), | rcontext(ar.rcontext), |
| wcontext(ar.wcontext), | wcontext(ar.wcontext), |
| flang(ar.flang), | flang(ar.flang), |
| fconnection(ar.fconnection), | fconnection(ar.fconnection), |
| fr(ar) {} | fr(ar) {} |
| ~Request_context_saver() { | void restore() { |
| fr.exception_trace.top_index(exception_trace); | fr.exception_trace.top_index(exception_trace); |
| fr.stack.top_index(stack); | fr.stack.top_index(stack); |
| fr.self=self; fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; | fr.method_frame=method_frame, fr.rcontext=rcontext; fr.wcontext=wcontext; |
| fr.flang=flang; | fr.flang=flang; |
| fr.fconnection=fconnection; | fr.fconnection=fconnection; |
| } | } |