Diff for /parser3/src/classes/table.C between versions 1.217 and 1.222

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?&params[1]:0;          Value* delim_maybe_code=params.count()>1?&params[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;
 }  }
   

Removed from v.1.217  
changed lines
  Added in v.1.222


E-mail: