--- parser3/src/classes/array.C 2024/09/21 15:23:23 1.7 +++ parser3/src/classes/array.C 2024/09/22 18:23:22 1.10 @@ -17,7 +17,7 @@ #include "pa_vbool.h" #include "pa_vmethod_frame.h" -volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.7 2024/09/21 15:23:23 moko Exp $"; +volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.10 2024/09/22 18:23:22 moko Exp $"; // class @@ -74,11 +74,13 @@ static ArrayValue::Action_options get_ac if(Value* voffset=options->get(sql_offset_name)) { valid_options++; - result.offset=r.process(*voffset).as_int(); + int offset=r.process(*voffset).as_int(); + result.offset=offset < 0 ? 0 : offset; } if(Value* vlimit=options->get(sql_limit_name)) { valid_options++; - result.limit=r.process(*vlimit).as_int(); + int limit=r.process(*vlimit).as_int(); + result.limit=limit < 0 ? 0: limit; } if(valid_options!=options->count()) @@ -141,13 +143,68 @@ static void _join(Request& r, MethodPara static void _sql(Request& r, MethodParams& params) {} -static void _sub(Request& r, MethodParams& params) {} -static void _union(Request& r, MethodParams& params) {} +static void mid(Request& r, size_t offset=0, size_t limit=ARRAY_OPTION_LIMIT_ALL) { + ArrayValue& array=GET_SELF(r, VArray).array(); + if(limit>0){ + VArray *result=new VArray; + ArrayValue& result_array=result->array(); + for(ArrayValue::Iterator i(array); i; i.next()){ + if(i.value()){ + if(offset > 0){ + offset--; + continue; + } + if(limit-- == 0) + break; + result_array+=i.value(); + } + } + r.write(*result); + } else { + r.write(*new VArray); + } +} + +static void _left(Request& r, MethodParams& params) { + int sn=params.as_int(0, "n must be int", r); + mid(r, 0, sn < 0 ? 0 : sn); +} + +static void _right(Request& r, MethodParams& params) { + int sn=params.as_int(0, "n must be int", r); -static void _intersection(Request& r, MethodParams& params) {} + if(sn>0){ + size_t used=GET_SELF(r, VArray).array().used(); + if(sn=0", begin); + + size_t end; + size_t length=0; + + if(params.count()>1) { + int n=params.as_int(1, "n must be int", r); + if(n<0) + throw Exception(PARSER_RUNTIME, 0, "n(%d) must be >=0", n); + mid(r, begin, n); + } else { + mid(r, begin); + } +} static void _keys(Request& r, MethodParams& params) { const String* keys_column_name; @@ -205,7 +262,7 @@ static void _insert(Request& r, MethodPa size_t index=VArray::index(params.as_int(0, PARAM_INDEX, r)); for(int i=1; i