|
|
| version 1.77, 2006/04/09 13:38:46 | version 1.85, 2008/05/16 14:28:23 |
|---|---|
| Line 73 public: | Line 73 public: |
| } | } |
| bool before_rows(SQL_Error& error) { | bool before_rows(SQL_Error& error) { |
| if(columns.count()<1) { | if(columns.count()<1) { |
| error=SQL_Error("parser.runtime", "no columns"); | error=SQL_Error(PARSER_RUNTIME, "no columns"); |
| return true; | return true; |
| } | } |
| only_one_column=columns.count()==1; | only_one_column=columns.count()==1; |
| Line 100 public: | Line 100 public: |
| row_hash->put(*columns[column_index], new VString(cell)); | row_hash->put(*columns[column_index], new VString(cell)); |
| if(duplicate & !distinct) { | if(duplicate & !distinct) { |
| error=SQL_Error("parser.runtime", "duplicate key"); | error=SQL_Error(PARSER_RUNTIME, "duplicate key"); |
| return true; | return true; |
| } | } |
| Line 117 VBool Hash_sql_event_handlers::only_one_ | Line 117 VBool Hash_sql_event_handlers::only_one_ |
| #endif | #endif |
| static void copy_all_overwrite_to( | |
| HashStringValue::key_type key, | |
| HashStringValue::value_type value, | |
| HashStringValue* dest) { | |
| dest->put(key, value); | |
| } | |
| static void _create_or_add(Request& r, MethodParams& params) { | static void _create_or_add(Request& r, MethodParams& params) { |
| if(params.count()) { | if(params.count()) { |
| Value& vsrc=params.as_no_junction(0, "param must be hash"); | Value& vsrc=params.as_no_junction(0, "param must be hash"); |
| Line 134 static void _create_or_add(Request& r, M | Line 128 static void _create_or_add(Request& r, M |
| src->for_each<HashStringValue*>(copy_all_overwrite_to, self_hash); | src->for_each<HashStringValue*>(copy_all_overwrite_to, self_hash); |
| if(VHash* vhash_src=static_cast<VHash*>(vsrc.as(VHASH_TYPE, false))) | if(VHash* vhash_src=static_cast<VHash*>(vsrc.as(VHASH_TYPE, false))) |
| self.set_default(vhash_src->get_default()); | { |
| if(Value* vdefault=vhash_src->get_default()) | |
| { | |
| if(vdefault->is_defined()) | |
| { | |
| self.set_default(vdefault); | |
| } | |
| } | |
| } | |
| } | } |
| } | } |
| } | } |
| static void remove_key_from( | |
| HashStringValue::key_type key, | |
| HashStringValue::value_type /*value*/, | |
| HashStringValue* dest) { | |
| dest->remove(key); | |
| } | |
| static void _sub(Request& r, MethodParams& params) { | static void _sub(Request& r, MethodParams& params) { |
| Value& vsrc=params.as_no_junction(0, "param must be hash"); | Value& vsrc=params.as_no_junction(0, "param must be hash"); |
| if(HashStringValue* src=vsrc.get_hash()) { | if(HashStringValue* src=vsrc.get_hash()) { |
| Line 225 extern String sql_limit_name; | Line 221 extern String sql_limit_name; |
| extern String sql_offset_name; | extern String sql_offset_name; |
| extern String sql_default_name; | extern String sql_default_name; |
| extern String sql_distinct_name; | extern String sql_distinct_name; |
| extern String sql_value_type_name; | |
| extern Table2hash_value_type get_value_type(Value& vvalue_type); | |
| extern int marshal_binds(HashStringValue& hash, SQL_Driver::Placeholder*& placeholders); | extern int marshal_binds(HashStringValue& hash, SQL_Driver::Placeholder*& placeholders); |
| extern void unmarshal_bind_updates(HashStringValue& hash, int placeholder_count, SQL_Driver::Placeholder* placeholders); | extern void unmarshal_bind_updates(HashStringValue& hash, int placeholder_count, SQL_Driver::Placeholder* placeholders); |
| Line 235 static void _sql(Request& r, MethodParam | Line 233 static void _sql(Request& r, MethodParam |
| ulong limit=0; | ulong limit=0; |
| ulong offset=0; | ulong offset=0; |
| bool distinct=false; | bool distinct=false; |
| Table2hash_value_type value_type=C_HASH; | |
| if(params.count()>1) { | if(params.count()>1) { |
| Value& voptions=params.as_no_junction(1, "options must be hash, not code"); | Value& voptions=params.as_no_junction(1, "options must be hash, not code"); |
| if(voptions.is_defined() && !voptions.is_string()) | if(voptions.is_defined() && !voptions.is_string()) |
| Line 256 static void _sql(Request& r, MethodParam | Line 255 static void _sql(Request& r, MethodParam |
| valid_options++; | valid_options++; |
| distinct=r.process_to_value(*vdistinct).as_bool(); | distinct=r.process_to_value(*vdistinct).as_bool(); |
| } | } |
| if(Value* vvalue_type=options->get(sql_value_type_name)) { | |
| valid_options++; | |
| value_type=get_value_type(r.process_to_value(*vvalue_type)); | |
| } | |
| if(valid_options!=options->count()) | if(valid_options!=options->count()) |
| throw Exception("parser.runtime", | throw Exception(PARSER_RUNTIME, |
| 0, | 0, |
| "called with invalid option"); | "called with invalid option"); |
| } else | } else |
| throw Exception("parser.runtime", | throw Exception(PARSER_RUNTIME, |
| 0, | 0, |
| "options must be hash"); | "options must be hash"); |
| } | } |
| Line 303 static void keys_collector( | Line 306 static void keys_collector( |
| static void _keys(Request& r, MethodParams& params) { | static void _keys(Request& r, MethodParams& params) { |
| const String* keys_column_name; | const String* keys_column_name; |
| if(params.count()>0) | if(params.count()>0) |
| keys_column_name=¶ms.as_string(0, "column name must be string"); | keys_column_name=¶ms.as_string(0, COLUMN_NAME_MUST_BE_STRING); |
| else | else |
| keys_column_name=new String("key"); | keys_column_name=new String("key"); |
| Line 325 static void _delete(Request& r, MethodPa | Line 328 static void _delete(Request& r, MethodPa |
| GET_SELF(r, VHash).hash().remove(params.as_string(0, "key must be string")); | GET_SELF(r, VHash).hash().remove(params.as_string(0, "key must be string")); |
| } | } |
| static void _contains(Request& r, MethodParams& params) { | |
| bool result = GET_SELF(r, VHash).hash().contains(params.as_string(0, "key must be string")); | |
| r.write_no_lang(*new VBool(result)); | |
| } | |
| #ifndef DOXYGEN | #ifndef DOXYGEN |
| struct Foreach_info { | struct Foreach_info { |
| Request *r; | Request *r; |
| Line 333 struct Foreach_info { | Line 342 struct Foreach_info { |
| Value* body_code; | Value* body_code; |
| Value* delim_maybe_code; | Value* delim_maybe_code; |
| Value* var_context; | |
| VString* vkey; | VString* vkey; |
| bool need_delim; | bool need_delim; |
| }; | }; |
| Line 341 static bool one_foreach_cycle( | Line 351 static bool one_foreach_cycle( |
| HashStringValue::key_type akey, | HashStringValue::key_type akey, |
| HashStringValue::value_type avalue, | HashStringValue::value_type avalue, |
| Foreach_info *info) { | Foreach_info *info) { |
| info->vkey->set_string(*new String(akey, String::L_TAINTED)); | Value& var_context=*info->var_context; |
| Value& ncontext=*info->r->get_method_frame()->caller(); | if(info->key_var_name){ |
| ncontext.put_element(ncontext, *info->key_var_name, info->vkey, false); | info->vkey->set_string(*new String(akey, String::L_TAINTED)); |
| ncontext.put_element(ncontext, *info->value_var_name, avalue, false); | var_context.put_element(var_context, *info->key_var_name, info->vkey, false); |
| } | |
| if(info->value_var_name) | |
| var_context.put_element(var_context, *info->value_var_name, avalue, false); | |
| StringOrValue sv_processed=info->r->process(*info->body_code); | StringOrValue sv_processed=info->r->process(*info->body_code); |
| Request::Skip lskip=info->r->get_skip(); info->r->set_skip(Request::SKIP_NOTHING); | Request::Skip lskip=info->r->get_skip(); info->r->set_skip(Request::SKIP_NOTHING); |
| const String* s_processed=sv_processed.get_string(); | const String* s_processed=sv_processed.get_string(); |
| if(info->delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body | if(info->delim_maybe_code && s_processed && s_processed->length()) { // delimiter set and we have body |
| if(info->need_delim) // need delim & iteration produced string? | if(info->need_delim) // need delim & iteration produced string? |
| info->r->write_pass_lang(info->r->process(*info->delim_maybe_code)); | info->r->write_pass_lang(info->r->process(*info->delim_maybe_code)); |
| info->need_delim=true; | else |
| info->need_delim=true; | |
| } | } |
| info->r->write_pass_lang(sv_processed); | info->r->write_pass_lang(sv_processed); |
| return lskip==Request::SKIP_BREAK; | return lskip==Request::SKIP_BREAK; |
| Line 362 static void _foreach(Request& r, MethodP | Line 378 static void _foreach(Request& r, MethodP |
| Temp_hash_value<const String::Body, void*> | Temp_hash_value<const String::Body, void*> |
| cycle_data_setter(r.classes_conf, cycle_data_name, /*any not null flag*/&r); | cycle_data_setter(r.classes_conf, cycle_data_name, /*any not null flag*/&r); |
| 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"); | |
| Foreach_info info={ | Foreach_info info={ |
| &r, | &r, |
| ¶ms.as_string(0, "key-var name must be string"), | key_var_name.is_empty()? 0 : &key_var_name, |
| ¶ms.as_string(1, "value-var name must be string"), | value_var_name.is_empty()? 0 : &value_var_name, |
| ¶ms.as_junction(2, "body must be code"), | ¶ms.as_junction(2, "body must be code"), |
| params.count()>3?params.get(3):0, | /*delimiter*/params.count()>3?params.get(3):0, |
| /*var_context*/r.get_method_frame()->caller(), | |
| /*vkey=*/new VString, | /*vkey=*/new VString, |
| false | false |
| }; | }; |
| Line 398 MHash::MHash(): Methoded("hash") | Line 418 MHash::MHash(): Methoded("hash") |
| // ^a.delete[key] | // ^a.delete[key] |
| add_native_method("delete", Method::CT_DYNAMIC, _delete, 1, 1); | add_native_method("delete", Method::CT_DYNAMIC, _delete, 1, 1); |
| // ^hash:sql[query][options hash] | // ^a.contains[key] |
| add_native_method("contains", Method::CT_DYNAMIC, _contains, 1, 1); | |
| // backward | |
| add_native_method("contain", Method::CT_DYNAMIC, _contains, 1, 1); | |
| // ^hash::sql[query][options hash] | |
| add_native_method("sql", Method::CT_DYNAMIC, _sql, 1, 2); | add_native_method("sql", Method::CT_DYNAMIC, _sql, 1, 2); |
| // ^hash._keys[[column name]] | // ^hash._keys[[column name]] |