--- parser3/src/classes/hashfile.C 2001/10/27 13:00:09 1.13 +++ parser3/src/classes/hashfile.C 2001/11/01 15:11:36 1.14 @@ -4,7 +4,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: hashfile.C,v 1.13 2001/10/27 13:00:09 paf Exp $ + $Id: hashfile.C,v 1.14 2001/11/01 15:11:36 paf Exp $ */ #include "pa_config_includes.h" @@ -145,6 +145,48 @@ static void _clear(Request& r, const Str } } +static void _foreach(Request& r, const String& method_name, MethodParams *params) { + Pool& pool=r.pool(); + VHashfile& self=*static_cast(r.self); + + const String& key_var_name=params->as_string(0, "key-var name must be string"); + const String& value_var_name=params->as_string(1, "value-var name must be string"); + Value& body_code=params->as_junction(2, "body must be code"); + Value *delim_maybe_code=params->size()>3?¶ms->get(3):0; + + bool need_delim=false; + Value& var_context=*body_code.get_junction()->wcontext; + VString& vkey=*new(pool) VString(pool); + VString& vvalue=*new(pool) VString(pool); + + DB_Cursor cursor( + *self.get_table_ptr(&method_name), + self.current_transaction, &method_name); + while(true) { + String *key; + String *data; + if(!cursor.get(pool, key, data, DB_NEXT)) + break; + + if(!key) + continue; // expired + + vkey.set_string(*key); + vvalue.set_string(*data); + var_context.put_element(key_var_name, &vkey); + var_context.put_element(value_var_name, &vvalue); + + Value& processed_body=r.process(body_code); + if(delim_maybe_code) { // delimiter set? + const String *string=processed_body.get_string(); + if(need_delim && string && string->size()) // need delim & iteration produced string? + r.write_pass_lang(r.process(*delim_maybe_code)); + need_delim=true; + } + r.write_pass_lang(processed_body); + } +} + // constructor MHashfile::MHashfile(Pool& apool) : Methoded(apool) { @@ -162,6 +204,8 @@ MHashfile::MHashfile(Pool& apool) : Meth add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1); // ^hashfile.clear[] add_native_method("clear", Method::CT_DYNAMIC, _clear, 0, 0); + // ^hashfile.foreach[key;value]{code}[delim] + add_native_method("foreach", Method::CT_DYNAMIC, _foreach, 2+1, 2+1+1); } // global variable