|
|
| version 1.217, 2005/11/25 09:52:07 | version 1.222, 2006/06/09 19:08:12 |
|---|---|
| Line 4 | Line 4 |
| Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001-2005 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) |
| */ | */ |
| static const char * const IDENT_TABLE_C="$Date$"; | static const char * const IDENT_TABLE_C="$Date$"; |
| #include "classes.h" | #include "classes.h" |
| Line 33 public: // Methoded | Line 34 public: // Methoded |
| DECLARE_CLASS_VAR(table, new MTable, 0); | DECLARE_CLASS_VAR(table, new MTable, 0); |
| // externs | |
| extern String cycle_data_name; | |
| // defines for globals | // defines for globals |
| #define SQL_BIND_NAME "bind" | #define SQL_BIND_NAME "bind" |
| Line 331 static void _load(Request& r, MethodPara | Line 336 static void _load(Request& r, MethodPara |
| } | } |
| Table& table=*new Table(columns); | Table& table=*new Table(columns); |
| int columns_count=columns? columns->count(): 0; | |
| // parse cells | // parse cells |
| Table::element_type row(new ArrayString); | Table::element_type row(new ArrayString(columns_count)); |
| skip_empty_and_comment_lines(&data); | skip_empty_and_comment_lines(&data); |
| while( lsplit_result sr=lsplit(&data, separators.column, '\n', separators.encloser) ) { | while( lsplit_result sr=lsplit(&data, separators.column, '\n', separators.encloser) ) { |
| if(!*sr.piece && !sr.delim && !row->count()) // append last empty column [if without \n] | if(!*sr.piece && !sr.delim && !row->count()) // append last empty column [if without \n] |
| Line 341 static void _load(Request& r, MethodPara | Line 347 static void _load(Request& r, MethodPara |
| *row+=new String(sr.piece, 0, true); | *row+=new String(sr.piece, 0, true); |
| if(sr.delim=='\n') { | if(sr.delim=='\n') { |
| table+=row; | table+=row; |
| row=new ArrayString; | row=new ArrayString(columns_count); |
| skip_empty_and_comment_lines(&data); | skip_empty_and_comment_lines(&data); |
| } | } |
| } | } |
| Line 358 static void maybe_enclose( String& to, c | Line 364 static void maybe_enclose( String& to, c |
| to<<*sencloser; | to<<*sencloser; |
| // while we have 'encloser'... | // while we have 'encloser'... |
| size_t pos_after=0; | size_t pos_after=0; |
| for( size_t pos_before; (pos_before=from.pos( encloser, pos_after ))!=STRING_NOT_FOUND; pos_after=pos_before+1) { | for( size_t pos_before; (pos_before=from.pos( encloser, pos_after ))!=STRING_NOT_FOUND; pos_after=pos_before) { |
| to<<from.mid(pos_before+1/*+found encloser*/, pos_after-pos_before); | pos_before++; // including first encloser (and skipping it for next pos) |
| to<<*sencloser; to<<*sencloser; // doubling encloser | to<<from.mid(pos_after, pos_before); |
| to<<*sencloser; // doubling encloser | |
| } | } |
| // last piece | // last piece |
| size_t from_length=from.length(); | size_t from_length=from.length(); |
| Line 392 static void _save(Request& r, MethodPara | Line 399 static void _save(Request& r, MethodPara |
| TableSeparators separators; | TableSeparators separators; |
| if(param_index<params.count()) { | if(param_index<params.count()) { |
| if(HashStringValue *options=params.as_no_junction(param_index++, "additional params must be hash").get_hash()) { | Value& voptions=params.as_no_junction(param_index++, "additional params must be hash"); |
| if( voptions.is_defined() && !voptions.is_string() ) { | |
| if(HashStringValue* options=voptions.get_hash()) { | |
| int valid_options=separators.load(*options); | int valid_options=separators.load(*options); |
| if(valid_options!=options->count()) | if(valid_options!=options->count()) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| Line 402 static void _save(Request& r, MethodPara | Line 411 static void _save(Request& r, MethodPara |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| 0, | 0, |
| "additional params must be hash (did you spell mode parameter correctly?)"); | "additional params must be hash (did you spell mode parameter correctly?)"); |
| } | |
| } | } |
| if(param_index<params.count()) | if(param_index<params.count()) |
| throw Exception("parser.runtime", | throw Exception("parser.runtime", |
| Line 488 static void _offset(Request& r, MethodPa | Line 497 static void _offset(Request& r, MethodPa |
| } | } |
| static void _menu(Request& r, MethodParams& params) { | static void _menu(Request& r, MethodParams& params) { |
| Temp_hash_value<const String::Body, void*> | |
| cycle_data_setter(r.classes_conf, cycle_data_name, /*any not null flag*/&r); | |
| Value& body_code=params.as_junction(0, "body must be code"); | Value& body_code=params.as_junction(0, "body must be code"); |
| Value* delim_maybe_code=params.count()>1?¶ms[1]:0; | Value* delim_maybe_code=params.count()>1?¶ms[1]:0; |
| Line 500 static void _menu(Request& r, MethodPara | Line 512 static void _menu(Request& r, MethodPara |
| table.set_current(row); | table.set_current(row); |
| StringOrValue sv_processed=r.process(body_code); | StringOrValue sv_processed=r.process(body_code); |
| Request::Skip lskip=r.get_skip(); r.set_skip(Request::SKIP_NOTHING); | |
| const String* s_processed=sv_processed.get_string(); | const String* s_processed=sv_processed.get_string(); |
| if(delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body | if(delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body |
| if(need_delim) // need delim & iteration produced string? | if(need_delim) // need delim & iteration produced string? |
| Line 507 static void _menu(Request& r, MethodPara | Line 520 static void _menu(Request& r, MethodPara |
| need_delim=true; | need_delim=true; |
| } | } |
| r.write_pass_lang(sv_processed); | r.write_pass_lang(sv_processed); |
| if(lskip==Request::SKIP_BREAK) | |
| break; | |
| } | } |
| table.set_current(saved_current); | table.set_current(saved_current); |
| } | } |
| Line 845 static void _join(Request& r, MethodPara | Line 861 static void _join(Request& r, MethodPara |
| #ifndef DOXYGEN | #ifndef DOXYGEN |
| class Table_sql_event_handlers: public SQL_Driver_query_event_handlers { | class Table_sql_event_handlers: public SQL_Driver_query_event_handlers { |
| ArrayString& columns; | ArrayString& columns; |
| int columns_count; | |
| ArrayString* row; | ArrayString* row; |
| public: | public: |
| Table* table; | Table* table; |
| Line 865 public: | Line 882 public: |
| bool before_rows(SQL_Error& error) { | bool before_rows(SQL_Error& error) { |
| try { | try { |
| table=new Table(&columns); | table=new Table(&columns); |
| columns_count=columns.count(); | |
| return false; | return false; |
| } catch(...) { | } catch(...) { |
| error=SQL_Error("exception occured in Table_sql_event_handlers::before_rows"); | error=SQL_Error("exception occured in Table_sql_event_handlers::before_rows"); |
| Line 873 public: | Line 891 public: |
| } | } |
| bool add_row(SQL_Error& error) { | bool add_row(SQL_Error& error) { |
| try { | try { |
| *table+=row=new ArrayString; | *table+=row=new ArrayString(columns_count); |
| return false; | return false; |
| } catch(...) { | } catch(...) { |
| error=SQL_Error("exception occured in Table_sql_event_handlers::add_row"); | error=SQL_Error("exception occured in Table_sql_event_handlers::add_row"); |
| Line 914 int marshal_binds(HashStringValue& hash, | Line 932 int marshal_binds(HashStringValue& hash, |
| int hash_count=hash.count(); | int hash_count=hash.count(); |
| placeholders=new(UseGC) SQL_Driver::Placeholder[hash_count]; | placeholders=new(UseGC) SQL_Driver::Placeholder[hash_count]; |
| SQL_Driver::Placeholder* ptr=placeholders; | SQL_Driver::Placeholder* ptr=placeholders; |
| hash.for_each(marshal_bind, &ptr); | hash.for_each<SQL_Driver::Placeholder**>(marshal_bind, &ptr); |
| return hash_count; | return hash_count; |
| } | } |