--- parser3/src/classes/table.C 2006/01/20 11:28:44 1.220 +++ parser3/src/classes/table.C 2007/03/14 10:57:52 1.224 @@ -4,7 +4,11 @@ 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: 2006/01/20 11:28:44 $"; + +static const char * const IDENT_TABLE_C="$Date: 2007/03/14 10:57:52 $"; + +#include +using namespace std; #include "classes.h" #include "pa_vmethod_frame.h" @@ -33,6 +37,10 @@ public: // Methoded DECLARE_CLASS_VAR(table, new MTable, 0); +// externs + +extern String cycle_data_name; + // defines for globals #define SQL_BIND_NAME "bind" @@ -354,7 +362,7 @@ static void _load(Request& r, MethodPara GET_SELF(r, VTable).set_table(table); } -static void maybe_enclose( String& to, const String& from, char encloser, const String* sencloser ) { +void maybe_enclose( String& to, const String& from, char encloser, const String* sencloser ) { if(encloser) { to<<*sencloser; // while we have 'encloser'... @@ -374,8 +382,28 @@ static void maybe_enclose( String& to, c to<count()) + Value& voptions=params.as_no_junction(param_index++, "additional params must be hash"); + if( voptions.is_defined() && !voptions.is_string() ) { + if(HashStringValue* options=voptions.get_hash()) { + int valid_options=separators.load(*options); + if(valid_options!=options->count()) + throw Exception("parser.runtime", + 0, + "invalid option passed"); + } else { throw Exception("parser.runtime", 0, - "invalid option passed"); - } else - throw Exception("parser.runtime", - 0, - "additional params must be hash (did you spell mode parameter correctly?)"); - + "additional params must be hash (did you spell mode parameter correctly?)"); + } + } } if(param_indexcount()) + throw Exception("parser.runtime", + 0, + "invalid option passed"); + } else { + throw Exception("parser.runtime", + 0, + "additional params must be hash (did you spell mode parameter correctly?)"); + } + } + } + if(param_index i(*table.columns()); i.has_next(); ) { + maybe_enclose( ost, *i.next(), separators.encloser ); + if(i.has_next()){ + ost<count():0) + for(int column=0; column i(table); + while(i.has_next()) { + for(Array_iterator c(*i.next()); c.has_next(); ) { + maybe_enclose( ost, *c.next(), separators.encloser ); + if(c.has_next()) + ost< + cycle_data_setter(r.classes_conf, cycle_data_name, /*any not null flag*/&r); + Value& body_code=params.as_junction(0, "body must be code"); Value* delim_maybe_code=params.count()>1?¶ms[1]:0; @@ -502,6 +622,7 @@ static void _menu(Request& r, MethodPara table.set_current(row); 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(delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body if(need_delim) // need delim & iteration produced string? @@ -509,6 +630,9 @@ static void _menu(Request& r, MethodPara need_delim=true; } r.write_pass_lang(sv_processed); + + if(lskip==Request::SKIP_BREAK) + break; } table.set_current(saved_current); } @@ -918,7 +1042,7 @@ int marshal_binds(HashStringValue& hash, int hash_count=hash.count(); placeholders=new(UseGC) SQL_Driver::Placeholder[hash_count]; SQL_Driver::Placeholder* ptr=placeholders; - hash.for_each(marshal_bind, &ptr); + hash.for_each(marshal_bind, &ptr); return hash_count; } @@ -1074,6 +1198,8 @@ MTable::MTable(): Methoded("table") { // ^table.save[nameless;file] add_native_method("save", Method::CT_DYNAMIC, _save, 1, 3); + // add_native_method("save_old", Method::CT_DYNAMIC, _save_old, 1, 3); + // ^table.count[] add_native_method("count", Method::CT_DYNAMIC, _count, 0, 0);