--- parser3/src/classes/table.C 2005/11/18 11:04:37 1.216 +++ parser3/src/classes/table.C 2005/11/28 12:50:18 1.219 @@ -4,7 +4,7 @@ Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char * const IDENT_TABLE_C="$Date: 2005/11/18 11:04:37 $"; +static const char * const IDENT_TABLE_C="$Date: 2005/11/28 12:50:18 $"; #include "classes.h" #include "pa_vmethod_frame.h" @@ -331,9 +331,10 @@ static void _load(Request& r, MethodPara } Table& table=*new Table(columns); + int columns_count=columns? columns->count(): 0; // parse cells - Table::element_type row(new ArrayString); + Table::element_type row(new ArrayString(columns_count)); skip_empty_and_comment_lines(&data); 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] @@ -341,7 +342,7 @@ static void _load(Request& r, MethodPara *row+=new String(sr.piece, 0, true); if(sr.delim=='\n') { table+=row; - row=new ArrayString; + row=new ArrayString(columns_count); skip_empty_and_comment_lines(&data); } } @@ -446,8 +447,13 @@ static void _save(Request& r, MethodPara } // write - file_write(r.absolute(file_name), - sdata.cstr(), sdata.length(), true, do_append); + { + const char* data_cstr=sdata.cstr(); + file_write(r.absolute(file_name), + data_cstr, sdata.length(), true, do_append); + if(*data_cstr) // not empty (when empty it's not heap memory) + pa_free((void*)data_cstr); // not needed anymore + } } static void _count(Request& r, MethodParams&) { @@ -840,6 +846,7 @@ static void _join(Request& r, MethodPara #ifndef DOXYGEN class Table_sql_event_handlers: public SQL_Driver_query_event_handlers { ArrayString& columns; + int columns_count; ArrayString* row; public: Table* table; @@ -860,6 +867,7 @@ public: bool before_rows(SQL_Error& error) { try { table=new Table(&columns); + columns_count=columns.count(); return false; } catch(...) { error=SQL_Error("exception occured in Table_sql_event_handlers::before_rows"); @@ -868,7 +876,7 @@ public: } bool add_row(SQL_Error& error) { try { - *table+=row=new ArrayString; + *table+=row=new ArrayString(columns_count); return false; } catch(...) { error=SQL_Error("exception occured in Table_sql_event_handlers::add_row");