--- parser3/src/classes/hash.C 2012/06/13 22:53:47 1.115 +++ parser3/src/classes/hash.C 2015/01/11 04:15:06 1.119 @@ -16,7 +16,7 @@ #include "pa_vbool.h" #include "pa_vmethod_frame.h" -volatile const char * IDENT_HASH_C="$Id: hash.C,v 1.115 2012/06/13 22:53:47 moko Exp $"; +volatile const char * IDENT_HASH_C="$Id: hash.C,v 1.119 2015/01/11 04:15:06 misha Exp $"; // class @@ -107,9 +107,9 @@ public: return false; } - bool add_row_cell(SQL_Error& error, const char *ptr, size_t ) { + bool add_row_cell(SQL_Error& error, const char *str, size_t ) { try { - String& cell=*new String(ptr, String::L_TAINTED /* no length as 0x00 can be inside */); + const String& cell=str?*new String(str, String::L_TAINTED /* no length as 0x00 can be inside */):String::Empty; bool duplicate=false; if(one_bool_column) { @@ -277,8 +277,12 @@ static bool intersects( static void _intersects(Request& r, MethodParams& params) { bool result=false; - if(HashStringValue* b=params.as_hash(0, "param")) - result=GET_SELF(r, VHash).hash().first_that(intersects, b)!=0; + if(HashStringValue* b=params.as_hash(0, "param")) { + HashStringValue* self=&(GET_SELF(r, VHash).hash()); + if(b==self) + return VBool::get(true); + result=self->first_that(intersects, b)!=0; + } // return result r.write_no_lang(VBool::get(result)); @@ -387,8 +391,10 @@ static void _count(Request& r, MethodPar } static void _delete(Request& r, MethodParams& params) { - - GET_SELF(r, VHash).hash().remove(params.as_string(0, "key must be string")); + if(params.count()>0) + GET_SELF(r, VHash).hash().remove(params.as_string(0, "key must be string")); + else + GET_SELF(r, VHash).hash().clear(); } static void _contains(Request& r, MethodParams& params) { @@ -415,10 +421,10 @@ static bool one_foreach_cycle( Value& var_context=*info->var_context; if(info->key_var_name){ VString* vkey=new VString(*new String(akey, String::L_TAINTED)); - var_context.put_element(*info->key_var_name, vkey, false); + info->r->put_element(var_context, *info->key_var_name, vkey); } if(info->value_var_name) - var_context.put_element(*info->value_var_name, avalue, false); + info->r->put_element(var_context, *info->value_var_name, avalue); if(info->delim_maybe_code){ // delimiter set StringOrValue sv_processed=info->r->process(*info->body_code); @@ -515,7 +521,7 @@ MHash::MHash(): Methoded("hash") add_native_method("intersects", Method::CT_DYNAMIC, _intersects, 1, 1); // ^a.delete[key] - add_native_method("delete", Method::CT_DYNAMIC, _delete, 1, 1); + add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1); // ^a.contains[key] add_native_method("contains", Method::CT_DYNAMIC, _contains, 1, 1);