--- parser3/src/classes/table.C 2002/03/27 15:30:34 1.146 +++ parser3/src/classes/table.C 2002/04/12 11:44:27 1.148 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: table.C,v 1.146 2002/03/27 15:30:34 paf Exp $ + $Id: table.C,v 1.148 2002/04/12 11:44:27 paf Exp $ */ #include "classes.h" @@ -46,7 +46,7 @@ static void _create(Request& r, const St // data is last parameter Temp_lang temp_lang(r, String::UL_PASS_APPENDED); const String& data= - r.process(params->as_junction(params->size()-1, "body must be code")).as_string(); + r.process_to_string(params->as_junction(params->size()-1, "body must be code")); size_t pos_after=0; // parse columns @@ -233,7 +233,7 @@ static void _offset(Request& r, const St } Value& offset_expr=params->as_junction(params->size()-1, "offset must be expression"); - table.offset(absolute, r.process(offset_expr).as_int()); + table.offset(absolute, r.process_to_value(offset_expr).as_int()); } else { Value& value=*new(pool) VInt(pool, table.current()); value.set_name(method_name); @@ -246,19 +246,18 @@ static void _menu(Request& r, const Stri Value *delim_maybe_code=params->size()>1?¶ms->get(1):0; - VTable& vtable=*static_cast(r.self); - Table& table=vtable.table(); + Table& table=static_cast(r.self)->table(); bool need_delim=false; int saved_current=table.current(); int size=table.size(); for(int row=0; rowsize()) // need delim & iteration produced string? - r.write_pass_lang(r.process(*delim_maybe_code)); + r.write_pass_lang(r.process_to_string(*delim_maybe_code)); need_delim=true; } r.write_pass_lang(processed_body); @@ -379,7 +378,7 @@ static void _sort(Request& r, const Stri old_table.set_current(i); // calculate key value seq[i].row=(MethodParams *)old_table.get(i); - Value& value=*r.process(key_maker).as_expr_result(true/*return string as-is*/); + Value& value=*r.process_to_value(key_maker).as_expr_result(true/*return string as-is*/); if(i==0) // determining key values type by first one key_values_are_strings=value.is_string(); @@ -410,14 +409,13 @@ static bool _locate_expression(Request& Value& expression_code=params->as_junction(0, "must be expression"); - VTable& vtable=*static_cast(r.self); - Table& table=vtable.table(); + Table& table=static_cast(r.self)->table(); int saved_current=table.current(); int size=table.size(); for(int row=0; row(r.self); - Table& table=vtable.table(); + Table& table=static_cast(r.self)->table(); return table.locate( params->as_string(0, "column name must be string"), params->as_string(1, "value must be string") @@ -448,9 +445,7 @@ static void _locate(Request& r, const St static void _flip(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); - VTable& vtable=*static_cast(r.self); - - Table& old_table=*vtable.get_table(); + Table& old_table=static_cast(r.self)->table(); Table& new_table=*new(pool) Table(pool, &method_name, 0/*nameless*/); if(old_table.size()) if(int old_cols=old_table.at(0).size()) @@ -471,14 +466,13 @@ static void _append(Request& r, const St // data Temp_lang temp_lang(r, String::UL_PASS_APPENDED); const String& string= - r.process(params->as_junction(0, "body must be code")).as_string(); + r.process_to_string(params->as_junction(0, "body must be code")); // parse cells Array& row=*new(pool) Array(pool); string.split(row, 0, "\t", 1, String::UL_AS_IS); - VTable& vtable=*static_cast(r.self); - vtable.table()+=&row; + static_cast(r.self)->table()+=&row; } static void _join(Request& r, const String& method_name, MethodParams *params) { @@ -574,9 +568,9 @@ static void _sql(Request& r, const Strin if(voptions.is_defined()) if(Hash *options=voptions.get_hash(&method_name)) { if(Value *vlimit=(Value *)options->get(*sql_limit_name)) - limit=(ulong)r.process(*vlimit).as_double(); + limit=(ulong)r.process_to_value(*vlimit).as_double(); if(Value *voffset=(Value *)options->get(*sql_offset_name)) - offset=(ulong)r.process(*voffset).as_double(); + offset=(ulong)r.process_to_value(*voffset).as_double(); } else throw Exception("parser.runtime", &method_name, @@ -584,7 +578,7 @@ static void _sql(Request& r, const Strin } Temp_lang temp_lang(r, String::UL_SQL); - const String& statement_string=r.process(statement).as_string(); + const String& statement_string=r.process_to_string(statement); const char *statement_cstr= statement_string.cstr(String::UL_UNSPECIFIED, r.connection(&method_name)); Table_sql_event_handlers handlers(pool, method_name, @@ -646,6 +640,38 @@ static void _columns(Request& r, const S r.write_no_lang(result); } +static void _select(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + + Value& vcondition=params->as_junction(0, "condition must be expression"); + + Table& source_table=static_cast(r.self)->table(); + Table& result_table=*new(pool) Table(pool, + source_table.origin_string(), + source_table.columns() + ); + + int saved_current=source_table.current(); + int size=source_table.size(); + for(int row=0; row