Diff for /parser3/src/classes/table.C between versions 1.292 and 1.296

version 1.292, 2013/03/15 11:21:57 version 1.296, 2013/10/04 21:21:54
Line 630  static void _menu(Request& r, MethodPara Line 630  static void _menu(Request& r, MethodPara
         Value* delim_maybe_code=params.count()>1?&params[1]:0;          Value* delim_maybe_code=params.count()>1?&params[1]:0;
   
         Table& table=GET_SELF(r, VTable).table();          Table& table=GET_SELF(r, VTable).table();
         int saved_current=table.current();          size_t saved_current=table.current();
         int size=table.count();          size_t size=table.count();
   
         if(delim_maybe_code) { // delimiter set          if(delim_maybe_code) { // delimiter set
                 bool need_delim=false;                  bool need_delim=false;
                 for(int row=0; row<size; row++) {                  for(size_t row=0; row<size; row++) {
                         table.set_current(row);                          table.set_current(row);
   
                         StringOrValue sv_processed=r.process(body_code);                          StringOrValue sv_processed=r.process(body_code);
Line 655  static void _menu(Request& r, MethodPara Line 655  static void _menu(Request& r, MethodPara
                                 break;                                  break;
                 }                  }
         } else {          } else {
                 for(int row=0; row<size; row++) {                  for(size_t row=0; row<size; row++) {
                         table.set_current(row);                          table.set_current(row);
     
                         r.process_write(body_code);                          r.process_write(body_code);
Line 933  static void _sort(Request& r, MethodPara Line 933  static void _sort(Request& r, MethodPara
         }          }
   
         // sort keys          // sort keys
         _qsort(seq, old_count, sizeof(Table_seq_item),           qsort(seq, old_count, sizeof(Table_seq_item), key_values_are_strings?sort_cmp_string:sort_cmp_double);
                 key_values_are_strings?sort_cmp_string:sort_cmp_double);  
   
         // reorder table as they require in 'seq'          // reorder table as they require in 'seq'
         for(i=0; i<old_count; i++)          for(i=0; i<old_count; i++)
Line 1004  static void _flip(Request& r, MethodPara Line 1003  static void _flip(Request& r, MethodPara
         r.write_no_lang(*new VTable(&new_table));          r.write_no_lang(*new VTable(&new_table));
 }  }
   
   static void _foreach(Request& r, MethodParams& params) {
           InCycle temp(r);
   
           const String& rownum_name=params.as_string(0, "rownum-var name must be string");
           const String& value_name=params.as_string(1, "value-var name must be string");
   
           Value& body_code=params.as_junction(2, "body must be code");
           
           Value* delim_maybe_code=params.count()>3?&params[3]:0;
   
           Table& table=GET_SELF(r, VTable).table();
           size_t saved_current=table.current();
           size_t size=table.count();
   
           const String* rownum_var_name=rownum_name.is_empty()? 0 : &rownum_name;
           const String* value_var_name=value_name.is_empty()? 0 : &value_name;
   
           Value* var_context=r.get_method_frame()->caller();
   
           if(delim_maybe_code) { // delimiter set
                   bool need_delim=false;
                   for(size_t row=0; row<size; row++) {
                           table.set_current(row);
   
                           if(rownum_var_name)
                                   var_context->put_element(*rownum_var_name, new VString(*new String(String::Body::Format(row), String::L_CLEAN)));
                           if(value_var_name)
                                   var_context->put_element(*value_var_name, new VTable(&table));
   
                           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();
                           if(s_processed && !s_processed->is_empty()) { // we have body
                                   if(need_delim) // need delim & iteration produced string?
                                           r.write_pass_lang(r.process(*delim_maybe_code));
                                   else
                                           need_delim=true;
                           }
   
                           r.write_pass_lang(sv_processed);
   
                           if(lskip==Request::SKIP_BREAK)
                                   break;
                   }
           } else {
                   for(size_t row=0; row<size; row++) {
                           table.set_current(row);
    
                           if(rownum_var_name)
                                   var_context->put_element(*rownum_var_name, new VString(*new String(String::Body::Format(row), String::L_CLEAN)));
                           if(value_var_name)
                                   var_context->put_element(*value_var_name, new VTable(&table));
   
                           r.process_write(body_code);
                           Request::Skip lskip=r.get_skip(); r.set_skip(Request::SKIP_NOTHING);
    
                           if(lskip==Request::SKIP_BREAK)
                                   break;
                   }
           }
           table.set_current(saved_current);
   }
   
 static void _append(Request& r, MethodParams& params) {  static void _append(Request& r, MethodParams& params) {
         Temp_lang temp_lang(r, String::L_PASS_APPENDED);          Temp_lang temp_lang(r, String::L_PASS_APPENDED);
         const String& string=r.process_to_string(params[0]);          const String& string=r.process_to_string(params[0]);
Line 1171  static void _sql(Request& r, MethodParam Line 1234  static void _sql(Request& r, MethodParam
         const char* statement_cstr=statement_string.untaint_cstr(r.flang, r.connection());          const char* statement_cstr=statement_string.untaint_cstr(r.flang, r.connection());
   
         Table_sql_event_handlers handlers;          Table_sql_event_handlers handlers;
 #ifdef RESOURCES_DEBUG  
         struct timeval mt[2];  
         //measure:before  
         gettimeofday(&mt[0],NULL);  
 #endif    
         r.connection()->query(          r.connection()->query(
                 statement_cstr,                   statement_cstr, 
                 placeholders_count, placeholders,                  placeholders_count, placeholders,
Line 1183  static void _sql(Request& r, MethodParam Line 1242  static void _sql(Request& r, MethodParam
                 handlers,                  handlers,
                 statement_string);                  statement_string);
                   
 #ifdef RESOURCES_DEBUG  
                 //measure:after connect  
         gettimeofday(&mt[1],NULL);  
           
         double t[2];  
         for(int i=0;i<2;i++)  
             t[i]=mt[i].tv_sec+mt[i].tv_usec/1000000.0;  
               
         r.sql_request_time+=t[1]-t[0];  
 #endif                            
   
         if(bind)          if(bind)
                 unmarshal_bind_updates(*bind, placeholders_count, placeholders);                  unmarshal_bind_updates(*bind, placeholders_count, placeholders);
   
Line 1343  MTable::MTable(): Methoded("table") { Line 1391  MTable::MTable(): Methoded("table") {
         // ^table.flip[]          // ^table.flip[]
         add_native_method("flip", Method::CT_DYNAMIC, _flip, 0, 0);          add_native_method("flip", Method::CT_DYNAMIC, _flip, 0, 0);
   
           // ^table.foreach[row-num;value]{code}
           // ^table.foreach[row-num;value]{code}[delim]
           add_native_method("foreach", Method::CT_DYNAMIC, _foreach, 3, 4);
   
         // ^table.append{r{tab}e{tab}c{tab}o{tab}r{tab}d}          // ^table.append{r{tab}e{tab}c{tab}o{tab}r{tab}d}
         add_native_method("append", Method::CT_DYNAMIC, _append, 1, 1);          add_native_method("append", Method::CT_DYNAMIC, _append, 1, 1);
   

Removed from v.1.292  
changed lines
  Added in v.1.296


E-mail: