--- parser3/src/classes/table.C 2011/11/19 04:15:31 1.282 +++ parser3/src/classes/table.C 2012/05/23 16:26:40 1.287 @@ -1,12 +1,10 @@ /** @file Parser: @b table parser class. - Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_TABLE_C="$Date: 2011/11/19 04:15:31 $"; - #if (!defined(NO_STRINGSTREAM) && !defined(FREEBSD4)) #include #endif @@ -23,6 +21,8 @@ static const char * const IDENT_TABLE_C= #include "pa_vbool.h" #include "pa_array.h" +volatile const char * IDENT_TABLE_C="$Id: table.C,v 1.287 2012/05/23 16:26:40 moko Exp $"; + // class class MTable: public Methoded { @@ -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); } } @@ -924,14 +927,14 @@ static void _sort(Request& r, MethodPara old_table.set_current(i); // calculate key value seq[i].row=old_table[i]; - Value& value=r.process_to_value(key_maker).as_expr_result(true/*return string as-is*/); + Value& value=r.process_to_value(key_maker); if(i==0) // determining key values type by first one key_values_are_strings=value.is_string(); if(key_values_are_strings) seq[i].value.c_str=value.as_string().cstr(); else - seq[i].value.d=value.as_double(); + seq[i].value.d=value.as_expr_result().as_double(); } // @todo: handle this elsewhere @@ -1275,7 +1278,10 @@ static void _select(Request& r, MethodPa Table& result_table=*new Table(source_table.columns()); - if(size_t size=source_table.count() && limit>0){ + size_t size=source_table.count(); + if(offset<0) + offset+=size; + if(size && limit>0 && offset>=0 && (size_t)offset