--- parser3/src/classes/date.C 2002/03/27 15:30:33 1.22 +++ parser3/src/classes/date.C 2002/04/16 08:59:25 1.26 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: date.C,v 1.22 2002/03/27 15:30:33 paf Exp $ + $Id: date.C,v 1.26 2002/04/16 08:59:25 paf Exp $ */ #include "classes.h" @@ -31,20 +31,29 @@ public: // Methoded // methods -static void _now(Request& r, const String& method_name, MethodParams *) { +static void _now(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.self); - vdate->set_time(time(0)); + + time_t t=time(0); + if(params->size()==1) // ^now(offset) + t+=(time_t)(params->as_double(0, "offset must be double", r)*SECS_PER_DAY); + + vdate->set_time(t); } static void _create(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.self); - time_t time; - if(params->size()==1) // ^set(float days) - time=(time_t)(params->as_double(0, "float days must be double", r)*SECS_PER_DAY); - else if(params->size()>=3) { // ^set(y;m;d[;h[;m[;s]]]) + time_t t; + if(params->size()==1) { // ^set(float days) + t=(time_t)(params->as_double(0, "float days must be double", r)*SECS_PER_DAY); + if(t<0 || !localtime(&t)) + throw Exception(0, + &method_name, + "invalid datetime"); + } else if(params->size()>=2) { // ^set(y;m;d[;h[;m[;s]]]) tm tmIn={0}; tmIn.tm_isdst=-1; int year=params->as_int(0, "year must be int", r); @@ -54,20 +63,20 @@ static void _create(Request& r, const St year-=1900; tmIn.tm_year=year; tmIn.tm_mon=params->as_int(1, "month must be int", r)-1; - tmIn.tm_mday=params->as_int(2, "mday must be int", r); + tmIn.tm_mday=params->size()>2?params->as_int(2, "mday must be int", r):1; if(params->size()>3) tmIn.tm_hour=params->as_int(3, "hour must be int", r); if(params->size()>4) tmIn.tm_min=params->as_int(4, "minutes must be int", r); if(params->size()>5) tmIn.tm_sec=params->as_int(5, "seconds must be int", r); - time=mktime(&tmIn); - if(time<0) + t=mktime(&tmIn); + if(t<0) throw Exception(0, &method_name, "invalid datetime"); } else throw Exception("parser.runtime", &method_name, - "invalid params count, must be 1 or >=3"); - vdate->set_time(time); + "invalid params count, must be 1 or >=2"); + vdate->set_time(t); } static void _sql_string(Request& r, const String& method_name, MethodParams *) { @@ -82,8 +91,7 @@ static void _sql_string(Request& r, cons string.APPEND_CLEAN(buf, size, method_name.origin().file, method_name.origin().line); - Value& result=*new(pool) VString(string); - r.write_assign_lang(result); + r.write_assign_lang(string); } @@ -121,6 +129,10 @@ static void _roll(Request& r, const Stri throw Exception(0, &method_name, "bad resulting time (after roll)"); + if(oday==0 && tmIn.tm_mday!=tmSaved.tm_mday) + throw Exception(0, + &method_name, + "bad resulting time (day hole)", t); tm *tmOut=localtime(&t); if(!tmOut) @@ -139,7 +151,7 @@ static void _roll(Request& r, const Stri ||tmOut->tm_min!=tmSaved.tm_min) throw Exception(0, &method_name, - "bad resulting time (timeline hole)"); + "bad resulting time (hour hole)"); if(t<0) throw Exception(0, @@ -269,7 +281,7 @@ MDate::MDate(Pool& apool) : Methoded(apo // ^now[] - add_native_method("now", Method::CT_DYNAMIC, _now, 0, 0); + add_native_method("now", Method::CT_DYNAMIC, _now, 0, 1); // ^set(float days) add_native_method("create", Method::CT_DYNAMIC, _create, 1, 6);