--- parser3/src/classes/table.C 2011/05/19 06:58:40 1.281 +++ parser3/src/classes/table.C 2011/12/07 00:49:59 1.285 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_TABLE_C="$Date: 2011/05/19 06:58:40 $"; +static const char * const IDENT_TABLE_C="$Date: 2011/12/07 00:49:59 $"; #if (!defined(NO_STRINGSTREAM) && !defined(FREEBSD4)) #include @@ -209,7 +209,10 @@ static void _create(Request& r, MethodPa data.split(head, raw_pos_after, "\n", String::L_AS_IS, 1); if(head.count()) { size_t col_pos_after=0; - head[0]->split(*columns, col_pos_after, *separators.scolumn, String::L_AS_IS); + if(head[0]->is_empty()) + *columns += new String(); + else + head[0]->split(*columns, col_pos_after, *separators.scolumn, String::L_AS_IS); } } @@ -1249,8 +1252,8 @@ static void _select(Request& r, MethodPa Table& source_table=GET_SELF(r, VTable).table(); int limit=source_table.count(); - int offset = 0; - bool reverse = false; + int offset=0; + bool reverse=false; if(params.count()>1) if(HashStringValue* options=params.as_hash(1)) { @@ -1275,30 +1278,35 @@ static void _select(Request& r, MethodPa Table& result_table=*new Table(source_table.columns()); - int saved_current=source_table.current(); - int size=source_table.count(); - int appended = 0; - - if(reverse){ - for(int row=size-1; row >=0 && result_table.count() < limit; row--) { - source_table.set_current(row); - - bool condition=r.process_to_value(vcondition, false/*don't intercept string*/).as_bool(); - - if(condition && ++appended > offset) // ...condition is true, adding to the result - result_table+=source_table[row]; - } - } else { - for(int row=0; row < size && result_table.count() < limit; row++) { - source_table.set_current(row); + size_t size=source_table.count(); + if(offset<0) + offset+=size; + if(size && limit>0 && offset>=0 && (size_t)offset (size_t)offset) // ...condition is true, adding to the result + result_table+=source_table[row]; + if(row==0) break; + } + } else { + for(size_t row=0; row < size && result_table.count() < (size_t)limit; row++) { + source_table.set_current(row); - bool condition=r.process_to_value(vcondition, false/*don't intercept string*/).as_bool(); + bool condition=r.process_to_value(vcondition, false/*don't intercept string*/).as_bool(); - if(condition && ++appended > offset) // ...condition is true, adding to the result - result_table+=source_table[row]; + if(condition && ++appended > (size_t)offset) // ...condition is true, adding to the result + result_table+=source_table[row]; + } } + source_table.set_current(saved_current); } - source_table.set_current(saved_current); r.write_no_lang(*new VTable(&result_table)); }