|
|
| version 1.12, 2024/09/28 21:28:57 | version 1.18, 2024/10/17 22:24:44 |
|---|---|
| Line 46 static void _create_or_add(Request& r, M | Line 46 static void _create_or_add(Request& r, M |
| if(VArray* src=dynamic_cast<VArray*>(&vsrc)) { | if(VArray* src=dynamic_cast<VArray*>(&vsrc)) { |
| if(src==&self) | if(src==&self) |
| throw Exception(PARSER_RUNTIME, 0, "source and destination are the same array"); | return; |
| self_array.append(src->array()); | if(self_array.count()){ |
| for(ArrayValue::Iterator i(src->array()); i; i.next()){ | |
| if(i.value()) | |
| self_array.put(i.index(), i.value()); | |
| } | |
| } else { | |
| self_array.append(src->array()); | |
| } | |
| } else { | } else { |
| HashStringValue* src_hash=vsrc.get_hash(); | HashStringValue* src_hash=vsrc.as_hash("param must be array or"); |
| if(!src_hash) | if(!src_hash) |
| return; | return; |
| for(HashStringValue::Iterator i(*src_hash); i; i.next()){ | for(HashStringValue::Iterator i(*src_hash); i; i.next()){ |
| Line 119 static void _join(Request& r, MethodPara | Line 126 static void _join(Request& r, MethodPara |
| } | } |
| } | } |
| } else { | } else { |
| HashStringValue* src_hash=vsrc.get_hash(); | HashStringValue* src_hash=vsrc.as_hash("param must be array or"); |
| if(!src_hash) | if(!src_hash) |
| return; | return; |
| if(o.defined){ | if(o.defined){ |
| Line 445 static void _sql(Request& r, MethodParam | Line 452 static void _sql(Request& r, MethodParam |
| if(params.count()>1) | if(params.count()>1) |
| if(HashStringValue* options=params.as_hash(1, "sql options")) { | if(HashStringValue* options=params.as_hash(1, "sql options")) { |
| int valid_options=0; | int valid_options=0; |
| bool distinct_specified=false; | |
| for(HashStringValue::Iterator i(*options); i; i.next() ){ | for(HashStringValue::Iterator i(*options); i; i.next() ){ |
| String::Body key=i.key(); | String::Body key=i.key(); |
| Value* value=i.value(); | Value* value=i.value(); |
| Line 459 static void _sql(Request& r, MethodParam | Line 467 static void _sql(Request& r, MethodParam |
| valid_options++; | valid_options++; |
| } else if (key == sql_distinct_name) { | } else if (key == sql_distinct_name) { |
| distinct=r.process(*value).as_bool(); | distinct=r.process(*value).as_bool(); |
| distinct_specified=true; | |
| valid_options++; | valid_options++; |
| } else if (key == sql_value_type_name) { | } else if (key == sql_value_type_name) { |
| value_type=get_value_type(r.process(*value)); | value_type=get_value_type(r.process(*value)); |
| Line 470 static void _sql(Request& r, MethodParam | Line 479 static void _sql(Request& r, MethodParam |
| } | } |
| if(valid_options!=options->count()) | if(valid_options!=options->count()) |
| throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); | throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); |
| if(distinct_specified && !sparse) | |
| throw Exception(PARSER_RUNTIME, 0, "'distinct' option can only be used when $.sparse(true) is specified"); | |
| } | } |
| SQL_Driver::Placeholder* placeholders=0; | SQL_Driver::Placeholder* placeholders=0; |
| Line 481 static void _sql(Request& r, MethodParam | Line 492 static void _sql(Request& r, MethodParam |
| const char* statement_cstr=statement_string.untaint_cstr(String::L_SQL, r.connection()); | const char* statement_cstr=statement_string.untaint_cstr(String::L_SQL, r.connection()); |
| VArray& self=GET_SELF(r, VArray); | VArray& self=GET_SELF(r, VArray); |
| ArrayValue& array=self.array(); | |
| self.array().clear(); self.invalidate(); // just in case if called as method | |
| array.clear(); self.invalidate(); // just in case if called as method | |
| if(sparse){ | if(sparse){ |
| SparseArray_sql_event_handlers handlers(distinct, self.array(), value_type); | SparseArray_sql_event_handlers handlers(distinct, array, value_type); |
| r.connection()->query(statement_cstr, placeholders_count, placeholders, offset, limit, handlers, statement_string); | r.connection()->query(statement_cstr, placeholders_count, placeholders, offset, limit, handlers, statement_string); |
| } else { | } else { |
| Array_sql_event_handlers handlers(self.array(), value_type); | Array_sql_event_handlers handlers(array, value_type); |
| r.connection()->query(statement_cstr, placeholders_count, placeholders, offset, limit, handlers, statement_string); | r.connection()->query(statement_cstr, placeholders_count, placeholders, offset, limit, handlers, statement_string); |
| } | } |
| array.confirm_all_used(); | |
| if(bind) | if(bind) |
| unmarshal_bind_updates(*bind, placeholders_count, placeholders); | unmarshal_bind_updates(*bind, placeholders_count, placeholders); |
| } | } |
| static void mid(Request& r, size_t offset=0, size_t limit=ARRAY_OPTION_LIMIT_ALL) { | static void mid(Request& r, size_t offset=0, size_t limit=ARRAY_OPTION_LIMIT_ALL) { |
| ArrayValue& array=GET_SELF(r, VArray).array(); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| if(limit>0){ | if(limit>0){ |
| Line 514 static void mid(Request& r, size_t offse | Line 527 static void mid(Request& r, size_t offse |
| result_array+=i.value(); | result_array+=i.value(); |
| } | } |
| } | } |
| result_array.confirm_all_used(); | |
| r.write(*result); | r.write(*result); |
| } else { | } else { |
| r.write(*new VArray); | r.write(*new VArray); |
| Line 846 static void _sort(Request& r, MethodPara | Line 860 static void _sort(Request& r, MethodPara |
| for(pos=0; pos<count; pos++) | for(pos=0; pos<count; pos++) |
| array+=seq[pos].array_data; | array+=seq[pos].array_data; |
| self.invalidate(); | |
| delete[] seq; | delete[] seq; |
| } | } |
| Line 855 enum AtResultType { | Line 870 enum AtResultType { |
| AtResultTypeHash = 2 | AtResultTypeHash = 2 |
| }; | }; |
| inline Value& SingleElementHash(String::Body akey, Value* avalue) { | static Value& SingleElementHash(String::Body akey, Value* avalue) { |
| Value& result=*new VHash; | Value& result=*new VHash; |
| result.put_element(*new String(akey, String::L_TAINTED), avalue); | result.put_element(*new String(akey, String::L_TAINTED), avalue); |
| return result; | return result; |
| Line 1006 static void _select(Request& r, MethodPa | Line 1021 static void _select(Request& r, MethodPa |
| } | } |
| } | } |
| result_array.confirm_all_used(); | |
| r.write(*result); | r.write(*result); |
| } | } |
| Line 1027 static void _reverse(Request& r, MethodP | Line 1043 static void _reverse(Request& r, MethodP |
| MArray::MArray(): Methoded(VARRAY_TYPE) { | MArray::MArray(): Methoded(VARRAY_TYPE) { |
| // ^array::create[[copy_from]] | // ^array::copy[[copy_from]] |
| add_native_method("create", Method::CT_DYNAMIC, _create_or_add, 0, 1); | add_native_method("copy", Method::CT_DYNAMIC, _create_or_add, 0, 1); |
| // ^array.add[add_from] | // ^array.add[add_from] |
| add_native_method("add", Method::CT_DYNAMIC, _create_or_add, 1, 1); | add_native_method("add", Method::CT_DYNAMIC, _create_or_add, 1, 1); |
| // ^array.join[join_from[;options]] | // ^array.join[join_from[;options]] |
| add_native_method("join", Method::CT_DYNAMIC, _join, 1, 2); | add_native_method("join", Method::CT_DYNAMIC, _join, 1, 2); |
| // ^array::create[value;value] | |
| add_native_method("create", Method::CT_DYNAMIC, _append, 0, 10000); | |
| // ^array.append[value;value] | |
| add_native_method("append", Method::CT_DYNAMIC, _append, 1, 10000); | |
| // ^array.insert[index;value...] | |
| add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000); | |
| // ^array.left(n) | // ^array.left(n) |
| add_native_method("left", Method::CT_DYNAMIC, _left, 1, 1); | add_native_method("left", Method::CT_DYNAMIC, _left, 1, 1); |
| // ^array.right(n) | // ^array.right(n) |
| Line 1042 MArray::MArray(): Methoded(VARRAY_TYPE) | Line 1065 MArray::MArray(): Methoded(VARRAY_TYPE) |
| // ^array.mid(p;n) | // ^array.mid(p;n) |
| add_native_method("mid", Method::CT_DYNAMIC, _mid, 1, 2); | add_native_method("mid", Method::CT_DYNAMIC, _mid, 1, 2); |
| // ^array::new[value;value] | |
| add_native_method("new", Method::CT_DYNAMIC, _append, 0, 10000); | |
| // ^array.append[value;value] | |
| add_native_method("append", Method::CT_DYNAMIC, _append, 1, 10000); | |
| // ^array.insert[index;value...] | |
| add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000); | |
| // ^array.delete[index] | // ^array.delete[index] |
| add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1); | add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1); |
| // ^array.remove[index] | // ^array.remove[index] |
| Line 1088 MArray::MArray(): Methoded(VARRAY_TYPE) | Line 1104 MArray::MArray(): Methoded(VARRAY_TYPE) |
| #ifdef FEATURE_GET_ELEMENT4CALL | #ifdef FEATURE_GET_ELEMENT4CALL |
| // aliases without "_" | // aliases without "_" |
| add_native_method("keys", Method::CT_DYNAMIC, _keys, 0, 1); | add_native_method("keys", Method::CT_DYNAMIC, _keys, 0, 1); |
| add_native_method("count", Method::CT_DYNAMIC, _count, 0, 0); | add_native_method("count", Method::CT_DYNAMIC, _count, 0, 1); |
| add_native_method("at", Method::CT_DYNAMIC, _at, 1, 2); | add_native_method("at", Method::CT_DYNAMIC, _at, 1, 2); |
| #endif | #endif |